diff options
author | Wim Taymans <wtaymans@redhat.com> | 2015-09-18 17:45:40 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2016-03-07 10:33:29 +0100 |
commit | e811740a9cbc135123558f73d5380f042f020697 (patch) | |
tree | b32b0c318d66a1e201ebc5e73e4a7b4badeed6e0 | |
parent | 5bd45589614bf4e015fdc572b240fe761ac7e943 (diff) |
Rework x86 backend
Separate the labels form the instructions.
Rework the representation of instructions.
Work on emiting intrinsics and better assembly
-rw-r--r-- | LICENSE | 27 | ||||
-rw-r--r-- | orc/Makefile.am | 2 | ||||
-rw-r--r-- | orc/c/orc-c.c | 8 | ||||
-rw-r--r-- | orc/x86/orc-x86-compiler.c (renamed from orc/x86/orc-x86.c) | 735 | ||||
-rw-r--r-- | orc/x86/orc-x86-compiler.h (renamed from orc/x86/orc-x86.h) | 11 | ||||
-rw-r--r-- | orc/x86/orc-x86-insn.c | 782 | ||||
-rw-r--r-- | orc/x86/orc-x86-insn.h | 586 |
7 files changed, 1147 insertions, 1004 deletions
@@ -0,0 +1,27 @@ +/* + * ORC - Optimized Inner Loops Runtime Compiler + * Copyright (c) 2007 David A. Schleef <ds@schleef.org> + * Copyright (c) 2015 Wim Taymans <wim.taymans@gmail.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ diff --git a/orc/Makefile.am b/orc/Makefile.am index 1b7b288..87e5947 100644 --- a/orc/Makefile.am +++ b/orc/Makefile.am @@ -28,7 +28,7 @@ liborc_@ORC_MAJORMINOR@_la_SOURCES = \ orcutils.c if ENABLE_BACKEND_X86 -liborc_@ORC_MAJORMINOR@_la_SOURCES += x86/orc-x86.c x86/orc-x86-insn.c +liborc_@ORC_MAJORMINOR@_la_SOURCES += x86/orc-x86-compiler.c x86/orc-x86-insn.c endif if ENABLE_BACKEND_PPC liborc_@ORC_MAJORMINOR@_la_SOURCES += diff --git a/orc/c/orc-c.c b/orc/c/orc-c.c index 56ba8b1..0609024 100644 --- a/orc/c/orc-c.c +++ b/orc/c/orc-c.c @@ -885,12 +885,12 @@ orc_c_insn_emit (OrcCCompiler *c, OrcCInsn *insn, OrcBuffer *buffer) } static int -orc_c_compiler_emit (OrcCCompiler *c, OrcBuffer *buffer) +orc_c_compiler_emit_assembly (OrcCCompiler *c, OrcBuffer *buffer) { OrcProgram *p = GET_PROGRAM (c); int i, res = 0; - ORC_LOG ("starting emit of %s", p->name); + ORC_LOG ("starting assemble of %s, flags %d", p->name, GET_FLAGS (c)); if (GET_FLAGS (c) & ORC_C_FLAG_EMIT_DECL) { for (i = 0; i < c->n_instructions; i++) { @@ -993,7 +993,7 @@ orc_c_compiler_compile (OrcCompiler *compiler, OrcProgram *p) orc_c_compiler_schedule (c); orc_buffer_init (&compiler->asm_code); - orc_c_compiler_emit (c, &compiler->asm_code); + orc_c_compiler_emit_assembly (c, &compiler->asm_code); return 0; } @@ -1001,7 +1001,7 @@ orc_c_compiler_compile (OrcCompiler *compiler, OrcProgram *p) static int orc_c_get_default_flags (void) { - return ORC_C_FLAG_EMIT_CODE; + return ORC_C_FLAG_EMIT_DECL | ORC_C_FLAG_EMIT_CODE; } static const char * diff --git a/orc/x86/orc-x86.c b/orc/x86/orc-x86-compiler.c index 6f5ba5a..ddf2d81 100644 --- a/orc/x86/orc-x86.c +++ b/orc/x86/orc-x86-compiler.c @@ -6,6 +6,7 @@ #include "orcdebug.h" #include "orcutils.h" #include "orc-x86.h" +#include "orc-x86-compiler.h" #include "orcexecutor.h" #include "orclabel.h" #include "orctarget.h" @@ -85,7 +86,8 @@ orc_x86_compiler_add_const (OrcX86Compiler *c, int items, int bits, void *value) } static int -orc_x86_add_insn (OrcX86Compiler *c, OrcX86Opcode opcode, int extra, int offset, int imm, int a0, int a1) +orc_x86_add_insn (OrcX86Compiler *c, OrcX86Opcode opcode, OrcX86InsnEnc enc, + int ptr, int offset, int imm, int a0, int a1) { OrcX86Insn *insn; @@ -104,12 +106,17 @@ orc_x86_add_insn (OrcX86Compiler *c, OrcX86Opcode opcode, int extra, int offset, if (a1 != -1 && a1 != a0) X86_GET_INSN (c, a1)->n_use++; - insn->extra = extra; - insn->offset = offset; + insn->enc = enc; + insn->mode = ORC_X86_INSN_MODE_NONE; + + insn->reg = -1; + insn->rm = -1; + insn->disp = offset; + insn->scale = 0; + insn->index = -1; + insn->base = ptr; insn->imm = imm; - insn->dest = -1; - insn->src = -1; insn->n_use = 0; insn->allocated = 0; @@ -120,128 +127,136 @@ orc_x86_add_insn (OrcX86Compiler *c, OrcX86Opcode opcode, int extra, int offset, return insn->id; } -#define orc_x86_add_load_const(c,cidx) orc_x86_add_insn(c,ORC_X86_load_const,-1,cidx,-1,-1,-1) -#define orc_x86_add_movq_reg(c,a0) orc_x86_add_insn(c,ORC_X86_movq_load,-1,-1,-1,a0,-1) -#define orc_x86_add_movq_load(c,ptr,off) orc_x86_add_insn(c,ORC_X86_movq_load,ptr,off,-1,-1,-1) -#define orc_x86_add_movd_load(c,ptr,off) orc_x86_add_insn(c,ORC_X86_movd_load,ptr,off,-1,-1,-1) -#define orc_x86_add_pinsrw(c,ptr,off,imm) orc_x86_add_insn(c,ORC_X86_pinsrw,ptr,off,imm,-1,-1) -#define orc_x86_add_pinsrb(c,ptr,off,imm) orc_x86_add_insn(c,ORC_X86_pinsrb,ptr,off,imm,-1,-1) -#define orc_x86_add_movq_store(c,a0,ptr,off) orc_x86_add_insn(c,ORC_X86_movq_store,ptr,off,-1,a0,-1) -#define orc_x86_add_psllw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psllw,-1,-1,-1,a0,a1) -#define orc_x86_add_pslld(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pslld,-1,-1,-1,a0,a1) -#define orc_x86_add_psllq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psllq,-1,-1,-1,a0,a1) -#define orc_x86_add_psraw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psraw,-1,-1,-1,a0,a1) -#define orc_x86_add_psrad(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psrad,-1,-1,-1,a0,a1) -#define orc_x86_add_psrlw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psrlw,-1,-1,-1,a0,a1) -#define orc_x86_add_psrld(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psrld,-1,-1,-1,a0,a1) -#define orc_x86_add_psrlq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psrlq,-1,-1,-1,a0,a1) -#define orc_x86_add_psllw_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_psllw_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_pslld_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_pslld_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_psllq_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_psllq_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_psraw_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_psraw_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_psrad_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_psrad_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_psrlw_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_psrlw_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_psrld_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_psrld_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_psrlq_imm(c,a0,imm) orc_x86_add_insn(c,ORC_X86_psrlq_imm,-1,-1,imm,a0,-1) -#define orc_x86_add_pand(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pand,-1,-1,-1,a0,a1) -#define orc_x86_add_pandn(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pandn,-1,-1,-1,a0,a1) -#define orc_x86_add_por(c,a0,a1) orc_x86_add_insn(c,ORC_X86_por,-1,-1,-1,a0,a1) -#define orc_x86_add_pxor(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pxor,-1,-1,-1,a0,a1) -#define orc_x86_add_packuswb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_packuswb,-1,-1,-1,a0,a1) -#define orc_x86_add_packusdw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_packusdw,-1,-1,-1,a0,a1) -#define orc_x86_add_packsswb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_packsswb,-1,-1,-1,a0,a1) -#define orc_x86_add_packssdw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_packssdw,-1,-1,-1,a0,a1) -#define orc_x86_add_pshufb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pshufb,-1,-1,-1,a0,a1) - -#define orc_x86_add_punpcklbw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_punpcklbw,-1,-1,-1,a0,a1) -#define orc_x86_add_punpcklwd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_punpcklwd,-1,-1,-1,a0,a1) -#define orc_x86_add_punpckldq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_punpckldq,-1,-1,-1,a0,a1) -#define orc_x86_add_punpckhbw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_punpckhbw,-1,-1,-1,a0,a1) -#define orc_x86_add_punpckhwd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_punpckhwd,-1,-1,-1,a0,a1) -#define orc_x86_add_punpckhdq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_punpckhdq,-1,-1,-1,a0,a1) - -#define orc_x86_add_paddb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddb,-1,-1,-1,a0,a1) -#define orc_x86_add_paddw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddw,-1,-1,-1,a0,a1) -#define orc_x86_add_paddd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddd,-1,-1,-1,a0,a1) -#define orc_x86_add_paddq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddq,-1,-1,-1,a0,a1) -#define orc_x86_add_paddsb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddsb,-1,-1,-1,a0,a1) -#define orc_x86_add_paddsw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddsw,-1,-1,-1,a0,a1) -#define orc_x86_add_paddsd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddsd,-1,-1,-1,a0,a1) -#define orc_x86_add_paddusb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddusb,-1,-1,-1,a0,a1) -#define orc_x86_add_paddusw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddusw,-1,-1,-1,a0,a1) -#define orc_x86_add_paddusd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_paddusd,-1,-1,-1,a0,a1) - -#define orc_x86_add_psubb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubb,-1,-1,-1,a0,a1) -#define orc_x86_add_psubw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubw,-1,-1,-1,a0,a1) -#define orc_x86_add_psubd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubd,-1,-1,-1,a0,a1) -#define orc_x86_add_psubq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubq,-1,-1,-1,a0,a1) -#define orc_x86_add_psubsb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubsb,-1,-1,-1,a0,a1) -#define orc_x86_add_psubsw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubsw,-1,-1,-1,a0,a1) -#define orc_x86_add_psubsd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubsd,-1,-1,-1,a0,a1) -#define orc_x86_add_psubusb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubusb,-1,-1,-1,a0,a1) -#define orc_x86_add_psubusw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubusw,-1,-1,-1,a0,a1) -#define orc_x86_add_psubusd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_psubusd,-1,-1,-1,a0,a1) - -#define orc_x86_add_pcmpeqb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpeqb,-1,-1,-1,a0,a1) -#define orc_x86_add_pcmpeqw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpeqw,-1,-1,-1,a0,a1) -#define orc_x86_add_pcmpeqd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpeqd,-1,-1,-1,a0,a1) -#define orc_x86_add_pcmpgtb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpgtb,-1,-1,-1,a0,a1) -#define orc_x86_add_pcmpgtw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpgtw,-1,-1,-1,a0,a1) -#define orc_x86_add_pcmpgtd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpgtd,-1,-1,-1,a0,a1) - -#define orc_x86_add_pmaddwd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pmaddwd,-1,-1,-1,a0,a1) -#define orc_x86_add_pmulhw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pmulhw,-1,-1,-1,a0,a1) -#define orc_x86_add_pmullw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pmullw,-1,-1,-1,a0,a1) - -#define orc_x86_add_pavgb(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pavgb,-1,-1,-1,a0,a1) -#define orc_x86_add_pavgw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pavgw,-1,-1,-1,a0,a1) -#define orc_x86_add_phaddw(c,a0,a1) orc_x86_add_insn(c,ORC_X86_phaddw,-1,-1,-1,a0,a1) -#define orc_x86_add_phaddd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_phaddd,-1,-1,-1,a0,a1) - -#define orc_x86_add_pmovsxbw(c,a0) orc_x86_add_insn(c,ORC_X86_pmovsxbw,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovsxbd(c,a0) orc_x86_add_insn(c,ORC_X86_pmovsxbd,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovsxbq(c,a0) orc_x86_add_insn(c,ORC_X86_pmovsxbq,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovsxwd(c,a0) orc_x86_add_insn(c,ORC_X86_pmovsxwd,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovsxwq(c,a0) orc_x86_add_insn(c,ORC_X86_pmovsxwq,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovsxdq(c,a0) orc_x86_add_insn(c,ORC_X86_pmovsxdq,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovzxbw(c,a0) orc_x86_add_insn(c,ORC_X86_pmovzxbw,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovzxbd(c,a0) orc_x86_add_insn(c,ORC_X86_pmovzxbd,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovzxbq(c,a0) orc_x86_add_insn(c,ORC_X86_pmovzxbq,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovzxwd(c,a0) orc_x86_add_insn(c,ORC_X86_pmovzxwd,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovzxwq(c,a0) orc_x86_add_insn(c,ORC_X86_pmovzxwq,-1,-1,-1,a0,-1) -#define orc_x86_add_pmovzxdq(c,a0) orc_x86_add_insn(c,ORC_X86_pmovzxdq,-1,-1,-1,a0,-1) - -#define orc_x86_add_pmuldq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pmuldq,-1,-1,-1,a0,a1) -#define orc_x86_add_pmulld(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pmulld,-1,-1,-1,a0,a1) - -#define orc_x86_add_pcmpeqq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpeqq,-1,-1,-1,a0,a1) -#define orc_x86_add_pcmpgtq(c,a0,a1) orc_x86_add_insn(c,ORC_X86_pcmpgtq,-1,-1,-1,a0,a1) - -#define orc_x86_add_addps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_addps,-1,-1,-1,a0,a1) -#define orc_x86_add_subps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_subps,-1,-1,-1,a0,a1) -#define orc_x86_add_mulps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_mulps,-1,-1,-1,a0,a1) -#define orc_x86_add_divps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_divps,-1,-1,-1,a0,a1) -#define orc_x86_add_sqrtps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_sqrtps,-1,-1,-1,a0,a1) - -#define orc_x86_add_addpd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_addpd,-1,-1,-1,a0,a1) -#define orc_x86_add_subpd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_subpd,-1,-1,-1,a0,a1) -#define orc_x86_add_mulpd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_mulpd,-1,-1,-1,a0,a1) -#define orc_x86_add_divpd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_divpd,-1,-1,-1,a0,a1) -#define orc_x86_add_sqrtpd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_sqrtpd,-1,-1,-1,a0,a1) - -#define orc_x86_add_cmpeqps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_cmpeqps,-1,-1,-1,a0,a1) -#define orc_x86_add_cmpeqpd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_cmpeqpd,-1,-1,-1,a0,a1) -#define orc_x86_add_cmpltps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_cmpltps,-1,-1,-1,a0,a1) -#define orc_x86_add_cmpltpd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_cmpltpd,-1,-1,-1,a0,a1) -#define orc_x86_add_cmpleps(c,a0,a1) orc_x86_add_insn(c,ORC_X86_cmpleps,-1,-1,-1,a0,a1) -#define orc_x86_add_cmplepd(c,a0,a1) orc_x86_add_insn(c,ORC_X86_cmplepd,-1,-1,-1,a0,a1) - -#define orc_x86_add_cvttps2dq(c,a0) orc_x86_add_insn(c,ORC_X86_cvttps2dq,-1,-1,-1,a0,-1) -#define orc_x86_add_cvttpd2dq(c,a0) orc_x86_add_insn(c,ORC_X86_cvttpd2dq,-1,-1,-1,a0,-1) -#define orc_x86_add_cvtdq2ps(c,a0) orc_x86_add_insn(c,ORC_X86_cvtdq2ps,-1,-1,-1,a0,-1) -#define orc_x86_add_cvtdq2pd(c,a0) orc_x86_add_insn(c,ORC_X86_cvtdq2pd,-1,-1,-1,a0,-1) -#define orc_x86_add_cvtps2pd(c,a0) orc_x86_add_insn(c,ORC_X86_cvtps2pd,-1,-1,-1,a0,-1) -#define orc_x86_add_cvtpd2ps(c,a0) orc_x86_add_insn(c,ORC_X86_cvtpd2ps,-1,-1,-1,a0,-1) +#define orc_x86_add_C(c,op,cidx) orc_x86_add_insn(c,ORC_X86_op_##op,ORC_X86_INSN_ENC_RM,-1,cidx,-1,-1,-1); +#define orc_x86_add_RM_r(c,op,a0) orc_x86_add_insn(c,ORC_X86_op_##op,ORC_X86_INSN_ENC_RM,-1,-1,-1,a0,-1); +#define orc_x86_add_RM_rr(c,op,a0,a1) orc_x86_add_insn(c,ORC_X86_op_##op,ORC_X86_INSN_ENC_RM,-1,-1,-1,a0,a1); +#define orc_x86_add_RM_p(c,op,ptr,off) orc_x86_add_insn(c,ORC_X86_op_##op,ORC_X86_INSN_ENC_RM,ptr,off,-1,-1,-1); +#define orc_x86_add_MR_rp(c,op,a0,ptr,off) orc_x86_add_insn(c,ORC_X86_op_##op,ORC_X86_INSN_ENC_MR,ptr,off,-1,a0,-1); +#define orc_x86_add_MI_ri(c,op,a0,imm) orc_x86_add_insn(c,ORC_X86_op_##op,ORC_X86_INSN_ENC_MI,-1,-1,imm,a0,-1); +#define orc_x86_add_RMI_pi(c,op,ptr,off,imm) orc_x86_add_insn(c,ORC_X86_op_##op,ORC_X86_INSN_ENC_RMI,ptr,off,imm,-1,-1); + +#define orc_x86_add_load_const(c,cidx) orc_x86_add_C(c,movq,cidx) +#define orc_x86_add_movq_reg(c,a0) orc_x86_add_RM_r(c,movq,a0) +#define orc_x86_add_movq_load(c,ptr,off) orc_x86_add_RM_p(c,movq,ptr,off) +#define orc_x86_add_movd_load(c,ptr,off) orc_x86_add_RM_p(c,movd,ptr,off) +#define orc_x86_add_pinsrw(c,ptr,off,imm) orc_x86_add_RMI_pi(c,pinsrw,ptr,off,imm) +#define orc_x86_add_pinsrb(c,ptr,off,imm) orc_x86_add_RMI_pi(c,pinsrb,ptr,off,imm) +#define orc_x86_add_movq_store(c,a0,ptr,off) orc_x86_add_MR_rp(c,movq,a0,ptr,off) +#define orc_x86_add_psllw(c,a0,a1) orc_x86_add_RM_rr(c,psllw,a0,a1) +#define orc_x86_add_pslld(c,a0,a1) orc_x86_add_RM_rr(c,pslld,a0,a1) +#define orc_x86_add_psllq(c,a0,a1) orc_x86_add_RM_rr(c,psllq,a0,a1) +#define orc_x86_add_psraw(c,a0,a1) orc_x86_add_RM_rr(c,psraw,a0,a1) +#define orc_x86_add_psrad(c,a0,a1) orc_x86_add_RM_rr(c,psrad,a0,a1) +#define orc_x86_add_psrlw(c,a0,a1) orc_x86_add_RM_rr(c,psrlw,a0,a1) +#define orc_x86_add_psrld(c,a0,a1) orc_x86_add_RM_rr(c,psrld,a0,a1) +#define orc_x86_add_psrlq(c,a0,a1) orc_x86_add_RM_rr(c,psrlq,a0,a1) +#define orc_x86_add_psllw_imm(c,a0,imm) orc_x86_add_MI_ri(c,psllw,a0,imm) +#define orc_x86_add_pslld_imm(c,a0,imm) orc_x86_add_MI_ri(c,pslld,a0,imm) +#define orc_x86_add_psllq_imm(c,a0,imm) orc_x86_add_MI_ri(c,psllq,a0,imm) +#define orc_x86_add_psraw_imm(c,a0,imm) orc_x86_add_MI_ri(c,psraw,a0,imm) +#define orc_x86_add_psrad_imm(c,a0,imm) orc_x86_add_MI_ri(c,psrad,a0,imm) +#define orc_x86_add_psrlw_imm(c,a0,imm) orc_x86_add_MI_ri(c,psrlw,a0,imm) +#define orc_x86_add_psrld_imm(c,a0,imm) orc_x86_add_MI_ri(c,psrld,a0,imm) +#define orc_x86_add_psrlq_imm(c,a0,imm) orc_x86_add_MI_ri(c,psrlq,a0,imm) +#define orc_x86_add_pand(c,a0,a1) orc_x86_add_RM_rr(c,pand,a0,a1) +#define orc_x86_add_pandn(c,a0,a1) orc_x86_add_RM_rr(c,pandn,a0,a1) +#define orc_x86_add_por(c,a0,a1) orc_x86_add_RM_rr(c,por,a0,a1) +#define orc_x86_add_pxor(c,a0,a1) orc_x86_add_RM_rr(c,pxor,a0,a1) +#define orc_x86_add_packuswb(c,a0,a1) orc_x86_add_RM_rr(c,packuswb,a0,a1) +#define orc_x86_add_packusdw(c,a0,a1) orc_x86_add_RM_rr(c,packusdw,a0,a1) +#define orc_x86_add_packsswb(c,a0,a1) orc_x86_add_RM_rr(c,packsswb,a0,a1) +#define orc_x86_add_packssdw(c,a0,a1) orc_x86_add_RM_rr(c,packssdw,a0,a1) +#define orc_x86_add_pshufb(c,a0,a1) orc_x86_add_RM_rr(c,pshufb,a0,a1) + +#define orc_x86_add_punpcklbw(c,a0,a1) orc_x86_add_RM_rr(c,punpcklbw,a0,a1) +#define orc_x86_add_punpcklwd(c,a0,a1) orc_x86_add_RM_rr(c,punpcklwd,a0,a1) +#define orc_x86_add_punpckldq(c,a0,a1) orc_x86_add_RM_rr(c,punpckldq,a0,a1) +#define orc_x86_add_punpckhbw(c,a0,a1) orc_x86_add_RM_rr(c,punpckhbw,a0,a1) +#define orc_x86_add_punpckhwd(c,a0,a1) orc_x86_add_RM_rr(c,punpckhwd,a0,a1) +#define orc_x86_add_punpckhdq(c,a0,a1) orc_x86_add_RM_rr(c,punpckhdq,a0,a1) + +#define orc_x86_add_paddb(c,a0,a1) orc_x86_add_RM_rr(c,paddb,a0,a1) +#define orc_x86_add_paddw(c,a0,a1) orc_x86_add_RM_rr(c,paddw,a0,a1) +#define orc_x86_add_paddd(c,a0,a1) orc_x86_add_RM_rr(c,paddd,a0,a1) +#define orc_x86_add_paddq(c,a0,a1) orc_x86_add_RM_rr(c,paddq,a0,a1) +#define orc_x86_add_paddsb(c,a0,a1) orc_x86_add_RM_rr(c,paddsb,a0,a1) +#define orc_x86_add_paddsw(c,a0,a1) orc_x86_add_RM_rr(c,paddsw,a0,a1) +#define orc_x86_add_paddsd(c,a0,a1) orc_x86_add_RM_rr(c,paddsd,a0,a1) +#define orc_x86_add_paddusb(c,a0,a1) orc_x86_add_RM_rr(c,paddusb,a0,a1) +#define orc_x86_add_paddusw(c,a0,a1) orc_x86_add_RM_rr(c,paddusw,a0,a1) +#define orc_x86_add_paddusd(c,a0,a1) orc_x86_add_RM_rr(c,paddusd,a0,a1) + +#define orc_x86_add_psubb(c,a0,a1) orc_x86_add_RM_rr(c,psubb,a0,a1) +#define orc_x86_add_psubw(c,a0,a1) orc_x86_add_RM_rr(c,psubw,a0,a1) +#define orc_x86_add_psubd(c,a0,a1) orc_x86_add_RM_rr(c,psubd,a0,a1) +#define orc_x86_add_psubq(c,a0,a1) orc_x86_add_RM_rr(c,psubq,a0,a1) +#define orc_x86_add_psubsb(c,a0,a1) orc_x86_add_RM_rr(c,psubsb,a0,a1) +#define orc_x86_add_psubsw(c,a0,a1) orc_x86_add_RM_rr(c,psubsw,a0,a1) +#define orc_x86_add_psubsd(c,a0,a1) orc_x86_add_RM_rr(c,psubsd,a0,a1) +#define orc_x86_add_psubusb(c,a0,a1) orc_x86_add_RM_rr(c,psubusb,a0,a1) +#define orc_x86_add_psubusw(c,a0,a1) orc_x86_add_RM_rr(c,psubusw,a0,a1) +#define orc_x86_add_psubusd(c,a0,a1) orc_x86_add_RM_rr(c,psubusd,a0,a1) + +#define orc_x86_add_pcmpeqb(c,a0,a1) orc_x86_add_RM_rr(c,pcmpeqb,a0,a1) +#define orc_x86_add_pcmpeqw(c,a0,a1) orc_x86_add_RM_rr(c,pcmpeqw,a0,a1) +#define orc_x86_add_pcmpeqd(c,a0,a1) orc_x86_add_RM_rr(c,pcmpeqd,a0,a1) +#define orc_x86_add_pcmpgtb(c,a0,a1) orc_x86_add_RM_rr(c,pcmpgtb,a0,a1) +#define orc_x86_add_pcmpgtw(c,a0,a1) orc_x86_add_RM_rr(c,pcmpgtw,a0,a1) +#define orc_x86_add_pcmpgtd(c,a0,a1) orc_x86_add_RM_rr(c,pcmpgtd,a0,a1) + +#define orc_x86_add_pmaddwd(c,a0,a1) orc_x86_add_RM_rr(c,pmaddwd,a0,a1) +#define orc_x86_add_pmulhw(c,a0,a1) orc_x86_add_RM_rr(c,pmulhw,a0,a1) +#define orc_x86_add_pmullw(c,a0,a1) orc_x86_add_RM_rr(c,pmullw,a0,a1) + +#define orc_x86_add_pavgb(c,a0,a1) orc_x86_add_RM_rr(c,pavgb,a0,a1) +#define orc_x86_add_pavgw(c,a0,a1) orc_x86_add_RM_rr(c,pavgw,a0,a1) +#define orc_x86_add_phaddw(c,a0,a1) orc_x86_add_RM_rr(c,phaddw,a0,a1) +#define orc_x86_add_phaddd(c,a0,a1) orc_x86_add_RM_rr(c,phaddd,a0,a1) + +#define orc_x86_add_pmovsxbw(c,a0) orc_x86_add_RM_r(c,pmovsxbw,a0) +#define orc_x86_add_pmovsxbd(c,a0) orc_x86_add_RM_r(c,pmovsxbd,a0) +#define orc_x86_add_pmovsxbq(c,a0) orc_x86_add_RM_r(c,pmovsxbq,a0) +#define orc_x86_add_pmovsxwd(c,a0) orc_x86_add_RM_r(c,pmovsxwd,a0) +#define orc_x86_add_pmovsxwq(c,a0) orc_x86_add_RM_r(c,pmovsxwq,a0) +#define orc_x86_add_pmovsxdq(c,a0) orc_x86_add_RM_r(c,pmovsxdq,a0) +#define orc_x86_add_pmovzxbw(c,a0) orc_x86_add_RM_r(c,pmovzxbw,a0) +#define orc_x86_add_pmovzxbd(c,a0) orc_x86_add_RM_r(c,pmovzxbd,a0) +#define orc_x86_add_pmovzxbq(c,a0) orc_x86_add_RM_r(c,pmovzxbq,a0) +#define orc_x86_add_pmovzxwd(c,a0) orc_x86_add_RM_r(c,pmovzxwd,a0) +#define orc_x86_add_pmovzxwq(c,a0) orc_x86_add_RM_r(c,pmovzxwq,a0) +#define orc_x86_add_pmovzxdq(c,a0) orc_x86_add_RM_r(c,pmovzxdq,a0) + +#define orc_x86_add_pmuldq(c,a0,a1) orc_x86_add_RM_rr(c,pmuldq,a0,a1) +#define orc_x86_add_pmulld(c,a0,a1) orc_x86_add_RM_rr(c,pmulld,a0,a1) + +#define orc_x86_add_pcmpeqq(c,a0,a1) orc_x86_add_RM_rr(c,pcmpeqq,a0,a1) +#define orc_x86_add_pcmpgtq(c,a0,a1) orc_x86_add_RM_rr(c,pcmpgtq,a0,a1) + +#define orc_x86_add_addps(c,a0,a1) orc_x86_add_RM_rr(c,addps,a0,a1) +#define orc_x86_add_subps(c,a0,a1) orc_x86_add_RM_rr(c,subps,a0,a1) +#define orc_x86_add_mulps(c,a0,a1) orc_x86_add_RM_rr(c,mulps,a0,a1) +#define orc_x86_add_divps(c,a0,a1) orc_x86_add_RM_rr(c,divps,a0,a1) +#define orc_x86_add_sqrtps(c,a0) orc_x86_add_RM_r(c,sqrtps,a0) + +#define orc_x86_add_addpd(c,a0,a1) orc_x86_add_RM_rr(c,addpd,a0,a1) +#define orc_x86_add_subpd(c,a0,a1) orc_x86_add_RM_rr(c,subpd,a0,a1) +#define orc_x86_add_mulpd(c,a0,a1) orc_x86_add_RM_rr(c,mulpd,a0,a1) +#define orc_x86_add_divpd(c,a0,a1) orc_x86_add_RM_rr(c,divpd,a0,a1) +#define orc_x86_add_sqrtpd(c,a0) orc_x86_add_RM_r(c,sqrtpd,a0) + +#define orc_x86_add_cmpeqps(c,a0,a1) orc_x86_add_RM_rr(c,cmpeqps,a0,a1) +#define orc_x86_add_cmpeqpd(c,a0,a1) orc_x86_add_RM_rr(c,cmpeqpd,a0,a1) +#define orc_x86_add_cmpltps(c,a0,a1) orc_x86_add_RM_rr(c,cmpltps,a0,a1) +#define orc_x86_add_cmpltpd(c,a0,a1) orc_x86_add_RM_rr(c,cmpltpd,a0,a1) +#define orc_x86_add_cmpleps(c,a0,a1) orc_x86_add_RM_rr(c,cmpleps,a0,a1) +#define orc_x86_add_cmplepd(c,a0,a1) orc_x86_add_RM_rr(c,cmplepd,a0,a1) + +#define orc_x86_add_cvttps2dq(c,a0) orc_x86_add_RM_r(c,cvttps2dq,a0) +#define orc_x86_add_cvttpd2dq(c,a0) orc_x86_add_RM_r(c,cvttpd2dq,a0) +#define orc_x86_add_cvtdq2ps(c,a0) orc_x86_add_RM_r(c,cvtdq2ps,a0) +#define orc_x86_add_cvtdq2pd(c,a0) orc_x86_add_RM_r(c,cvtdq2pd,a0) +#define orc_x86_add_cvtps2pd(c,a0) orc_x86_add_RM_r(c,cvtps2pd,a0) +#define orc_x86_add_cvtpd2ps(c,a0) orc_x86_add_RM_r(c,cvtpd2ps,a0) void x86_add_label2 (OrcX86Compiler *compiler, int index, int label) @@ -350,26 +365,26 @@ label_x86_add (OrcX86Compiler *c, OrcInstruction *insn, int cost) if (orc_program_check_hadd (p, insn, &arg1)) { OrcInstruction *a1 = GET_INSN (p, arg1); if (a1->bits == 32 && orc_program_check_mull (p, a1, &arg1, &arg2)) { - orc_labeler_label_args (l, insn, ORC_X86_pmaddwd, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_pmaddwd, 1, arg1, arg2); } else if (INSN_BITS (insn) == 16) { - orc_labeler_label_args (l, insn, ORC_X86_phaddw, 1, arg1, -1); + orc_labeler_label_args (l, insn, ORC_X86_label_phaddw, 1, arg1, -1); } else if (INSN_BITS (insn) == 32) { - orc_labeler_label_args (l, insn, ORC_X86_phaddd, 1, arg1, -1); + orc_labeler_label_args (l, insn, ORC_X86_label_phaddd, 1, arg1, -1); } } switch (INSN_BITS (insn)) { case 8: - orc_labeler_label (l, insn, ORC_X86_paddb, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_paddb, cost + 1); break; case 16: - orc_labeler_label (l, insn, ORC_X86_paddw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_paddw, cost + 1); break; case 32: - orc_labeler_label (l, insn, ORC_X86_paddd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_paddd, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_paddq, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_paddq, cost + 1); break; default: break; @@ -388,16 +403,16 @@ label_x86_sub (OrcX86Compiler *c, OrcInstruction *insn, int cost) switch (INSN_BITS (insn)) { case 8: - orc_labeler_label (l, insn, ORC_X86_psubb, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psubb, cost + 1); break; case 16: - orc_labeler_label (l, insn, ORC_X86_psubw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psubw, cost + 1); break; case 32: - orc_labeler_label (l, insn, ORC_X86_psubd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psubd, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_psubq, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psubq, cost + 1); break; default: break; @@ -419,15 +434,15 @@ label_x86_mul (OrcX86Compiler *c, OrcInstruction *insn, int cost) int arg1, arg2; if (insn->bits == 64 && orc_program_check_mull (p, insn, &arg1, &arg2)) { - orc_labeler_label_args (l, insn, ORC_X86_pmuldq, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_pmuldq, 1, arg1, arg2); } switch (INSN_BITS (insn)) { case 16: - orc_labeler_label (l, insn, ORC_X86_pmullw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_pmullw, cost + 1); break; case 32: - orc_labeler_label (l, insn, ORC_X86_pmulld, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_pmulld, cost + 1); break; default: break; @@ -454,7 +469,7 @@ label_x86_divs (OrcX86Compiler *c, OrcInstruction *insn, int cost) static void label_x86_and (OrcX86Compiler *c, OrcInstruction *insn, int cost) { - orc_labeler_label (GET_LABELER (c), insn, ORC_X86_pand, cost + 1); + orc_labeler_label (GET_LABELER (c), insn, ORC_X86_label_pand, cost + 1); } /* or iX -> por @@ -462,7 +477,7 @@ label_x86_and (OrcX86Compiler *c, OrcInstruction *insn, int cost) static void label_x86_or (OrcX86Compiler *c, OrcInstruction *insn, int cost) { - orc_labeler_label (GET_LABELER (c), insn, ORC_X86_por, cost + 1); + orc_labeler_label (GET_LABELER (c), insn, ORC_X86_label_por, cost + 1); } /* xor i8 -> pxor @@ -470,7 +485,7 @@ label_x86_or (OrcX86Compiler *c, OrcInstruction *insn, int cost) static void label_x86_xor (OrcX86Compiler *c, OrcInstruction *insn, int cost) { - orc_labeler_label (GET_LABELER (c), insn, ORC_X86_pxor, cost + 1); + orc_labeler_label (GET_LABELER (c), insn, ORC_X86_label_pxor, cost + 1); } /* shl i8 -> shl8 @@ -494,21 +509,21 @@ label_x86_shl (OrcX86Compiler *c, OrcInstruction *insn, int cost) break; case 16: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_psllw_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_psllw_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_psllw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psllw, cost + 1); break; case 32: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_pslld_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_pslld_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_pslld, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_pslld, cost + 1); break; case 64: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_psllq_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_psllq_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_psllq, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psllq, cost + 1); cost += 1; break; default: @@ -566,21 +581,21 @@ label_x86_shru (OrcX86Compiler *c, OrcInstruction *insn, int cost) break; case 16: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_psrlw_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_psrlw_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_psrlw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psrlw, cost + 1); break; case 32: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_psrld_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_psrld_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_psrld, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psrld, cost + 1); break; case 64: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_psrlq_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_psrlq_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_psrlq, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psrlq, cost + 1); break; default: break; @@ -638,15 +653,15 @@ label_x86_shrs (OrcX86Compiler *c, OrcInstruction *insn, int cost) break; case 16: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_psraw_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_psraw_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_psraw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psraw, cost + 1); break; case 32: if (is_const) - orc_labeler_label_args (l, insn, ORC_X86_psrad_imm, cost + 1, insn->arg[0], -1); + orc_labeler_label_args (l, insn, ORC_X86_label_psrad_imm, cost + 1, insn->arg[0], -1); else - orc_labeler_label (l, insn, ORC_X86_psrad, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_psrad, cost + 1); break; case 64: orc_labeler_label (l, insn, ORC_X86_label_shrs, cost + 5); @@ -686,9 +701,9 @@ label_x86_trunc (OrcX86Compiler *c, OrcInstruction *insn, int cost) if (orc_program_check_avgu (p, insn, &arg1, &arg2, &bits)) { if (bits == 8) - orc_labeler_label_args (l, insn, ORC_X86_pavgb, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_pavgb, 1, arg1, arg2); else if (bits == 16) - orc_labeler_label_args (l, insn, ORC_X86_pavgw, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_pavgw, 1, arg1, arg2); } orc_labeler_label (l, insn, ORC_X86_label_trunc, cost + 1); } @@ -756,7 +771,7 @@ label_x86_clampu (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 16: switch (INSN_BITS (insn)) { case 8: - orc_labeler_label (l, insn, ORC_X86_packuswb, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_packuswb, cost + 1); break; default: break; @@ -768,7 +783,7 @@ label_x86_clampu (OrcX86Compiler *c, OrcInstruction *insn, int cost) orc_labeler_label (l, insn, ORC_X86_label_clampu, cost + 2); break; case 16: - orc_labeler_label (l, insn, ORC_X86_packusdw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_packusdw, cost + 1); break; default: break; @@ -818,7 +833,7 @@ label_x86_clamps (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 16: switch (INSN_BITS (insn)) { case 8: - orc_labeler_label (l, insn, ORC_X86_packsswb, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_packsswb, cost + 1); break; default: break; @@ -830,7 +845,7 @@ label_x86_clamps (OrcX86Compiler *c, OrcInstruction *insn, int cost) orc_labeler_label (l, insn, ORC_X86_label_clamps, cost + 2); break; case 16: - orc_labeler_label (l, insn, ORC_X86_packssdw, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_packssdw, cost + 1); break; default: break; @@ -892,13 +907,13 @@ label_x86_extu (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 8: switch (INSN_BITS (insn)) { case 16: - label = ORC_X86_pmovzxbw; + label = ORC_X86_label_pmovzxbw; break; case 32: - label = ORC_X86_pmovzxbd; + label = ORC_X86_label_pmovzxbd; break; case 64: - label = ORC_X86_pmovzxbq; + label = ORC_X86_label_pmovzxbq; break; default: break; @@ -907,10 +922,10 @@ label_x86_extu (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 16: switch (INSN_BITS (insn)) { case 32: - label = ORC_X86_pmovzxwd; + label = ORC_X86_label_pmovzxwd; break; case 64: - label = ORC_X86_pmovzxwq; + label = ORC_X86_label_pmovzxwq; break; default: break; @@ -919,7 +934,7 @@ label_x86_extu (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 32: switch (INSN_BITS (insn)) { case 64: - label = ORC_X86_pmovzxdq; + label = ORC_X86_label_pmovzxdq; break; default: break; @@ -969,13 +984,13 @@ label_x86_exts (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 8: switch (INSN_BITS (insn)) { case 16: - label = extu ? ORC_X86_pmovzxbw : ORC_X86_pmovsxbw; + label = extu ? ORC_X86_label_pmovzxbw : ORC_X86_label_pmovsxbw; break; case 32: - label = extu ? ORC_X86_pmovzxbd : ORC_X86_pmovsxbd; + label = extu ? ORC_X86_label_pmovzxbd : ORC_X86_label_pmovsxbd; break; case 64: - label = extu ? ORC_X86_pmovzxbq : ORC_X86_pmovsxbq; + label = extu ? ORC_X86_label_pmovzxbq : ORC_X86_label_pmovsxbq; break; default: break; @@ -984,10 +999,10 @@ label_x86_exts (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 16: switch (INSN_BITS (insn)) { case 32: - label = extu ? ORC_X86_pmovzxwd : ORC_X86_pmovsxwd; + label = extu ? ORC_X86_label_pmovzxwd : ORC_X86_label_pmovsxwd; break; case 64: - label = extu ? ORC_X86_pmovzxwq : ORC_X86_pmovsxwq; + label = extu ? ORC_X86_label_pmovzxwq : ORC_X86_label_pmovsxwq; break; default: break; @@ -996,7 +1011,7 @@ label_x86_exts (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 32: switch (INSN_BITS (insn)) { case 64: - label = extu ? ORC_X86_pmovzxdq : ORC_X86_pmovsxdq; + label = extu ? ORC_X86_label_pmovzxdq : ORC_X86_label_pmovsxdq; break; default: break; @@ -1030,7 +1045,7 @@ label_x86_shuff (OrcX86Compiler *c, OrcInstruction *insn, int cost) if (orc_program_check_one_reg_shuff (p, insn, &arg1)) { ORC_DEBUG ("matched one reg shuff %d", insn->id); - orc_labeler_label_args (l, insn, ORC_X86_pshufb, 1, arg1, -1); + orc_labeler_label_args (l, insn, ORC_X86_label_pshufb, 1, arg1, -1); } if (orc_program_check_select (p, insn, &elem, &arg1)) { @@ -1040,7 +1055,7 @@ label_x86_shuff (OrcX86Compiler *c, OrcInstruction *insn, int cost) int a1, a2; if (orc_program_check_mull (p, GET_INSN (p, arg1), &a1, &a2) && IID_BITS (p, arg1) == 32) { - orc_labeler_label_args (l, insn, ORC_X86_pmulhw, 1, a1, a2); + orc_labeler_label_args (l, insn, ORC_X86_label_pmulhw, 1, a1, a2); goto next; } } @@ -1073,16 +1088,16 @@ next: if (orc_program_check_zip (p, insn, &arg1, &arg2)) { switch (INSN_ARGBITS (insn)) { case 8: - orc_labeler_label_args (l, insn, ORC_X86_punpcklbw, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_punpcklbw, 1, arg1, arg2); break; case 16: - orc_labeler_label_args (l, insn, ORC_X86_punpcklwd, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_punpcklwd, 1, arg1, arg2); break; case 32: - orc_labeler_label_args (l, insn, ORC_X86_punpckldq, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_punpckldq, 1, arg1, arg2); break; case 64: - orc_labeler_label_args (l, insn, ORC_X86_punpcklqdq, 1, arg1, arg2); + orc_labeler_label_args (l, insn, ORC_X86_label_punpcklqdq, 1, arg1, arg2); break; default: break; @@ -1128,10 +1143,10 @@ label_x86_fadd (OrcX86Compiler *c, OrcInstruction *insn, int cost) switch (INSN_BITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_addps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_addps, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_addpd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_addpd, cost + 1); break; default: break; @@ -1145,10 +1160,10 @@ label_x86_fsub (OrcX86Compiler *c, OrcInstruction *insn, int cost) switch (INSN_BITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_subps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_subps, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_subpd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_subpd, cost + 1); break; default: break; @@ -1162,10 +1177,10 @@ label_x86_fmul (OrcX86Compiler *c, OrcInstruction *insn, int cost) switch (INSN_BITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_mulps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_mulps, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_mulpd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_mulpd, cost + 1); break; default: break; @@ -1179,10 +1194,10 @@ label_x86_fdiv (OrcX86Compiler *c, OrcInstruction *insn, int cost) switch (INSN_BITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_divps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_divps, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_divpd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_divpd, cost + 1); break; default: break; @@ -1196,10 +1211,10 @@ label_x86_fsqrt (OrcX86Compiler *c, OrcInstruction *insn, int cost) switch (INSN_BITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_sqrtps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_sqrtps, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_sqrtpd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_sqrtpd, cost + 1); break; default: break; @@ -1215,13 +1230,13 @@ label_x86_fcmp (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 32: switch (insn->extra) { case ORC_CMP_EQ: - orc_labeler_label (l, insn, ORC_X86_cmpeqps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cmpeqps, cost + 1); break; case ORC_CMP_LE: - orc_labeler_label (l, insn, ORC_X86_cmpleps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cmpleps, cost + 1); break; case ORC_CMP_LT: - orc_labeler_label (l, insn, ORC_X86_cmpltps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cmpltps, cost + 1); break; default: break; @@ -1230,13 +1245,13 @@ label_x86_fcmp (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 64: switch (insn->extra) { case ORC_CMP_EQ: - orc_labeler_label (l, insn, ORC_X86_cmpeqpd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cmpeqpd, cost + 1); break; case ORC_CMP_LE: - orc_labeler_label (l, insn, ORC_X86_cmplepd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cmplepd, cost + 1); break; case ORC_CMP_LT: - orc_labeler_label (l, insn, ORC_X86_cmpltpd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cmpltpd, cost + 1); break; default: break; @@ -1256,7 +1271,7 @@ label_x86_convff (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 64: switch (INSN_ARGBITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_cvtpd2ps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cvtpd2ps, cost + 1); break; default: break; @@ -1265,7 +1280,7 @@ label_x86_convff (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 32: switch (INSN_ARGBITS (insn)) { case 64: - orc_labeler_label (l, insn, ORC_X86_cvtps2pd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cvtps2pd, cost + 1); break; default: break; @@ -1285,7 +1300,7 @@ label_x86_convfi (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 32: switch (INSN_ARGBITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_cvttps2dq, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cvttps2dq, cost + 1); break; default: break; @@ -1294,7 +1309,7 @@ label_x86_convfi (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 64: switch (INSN_ARGBITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_cvttpd2dq, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cvttpd2dq, cost + 1); break; default: break; @@ -1313,10 +1328,10 @@ label_x86_convif (OrcX86Compiler *c, OrcInstruction *insn, int cost) case 32: switch (INSN_ARGBITS (insn)) { case 32: - orc_labeler_label (l, insn, ORC_X86_cvtdq2ps, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cvtdq2ps, cost + 1); break; case 64: - orc_labeler_label (l, insn, ORC_X86_cvtdq2pd, cost + 1); + orc_labeler_label (l, insn, ORC_X86_label_cvtdq2pd, cost + 1); break; default: break; @@ -1697,395 +1712,394 @@ reduce_x86 (OrcX86Compiler *c, OrcInstruction *insn) break; /* MMX */ - case ORC_X86_packsswb: + case ORC_X86_label_packsswb: res->lane[n++] = orc_x86_add_packsswb (c, arg[0]->lane[0], arg[0]->lane[0]); break; - case ORC_X86_packssdw: + case ORC_X86_label_packssdw: res->lane[n++] = orc_x86_add_packssdw (c, arg[0]->lane[0], arg[0]->lane[0]); break; - case ORC_X86_packuswb: + case ORC_X86_label_packuswb: res->lane[n++] = orc_x86_add_packuswb (c, arg[0]->lane[0], arg[0]->lane[0]); break; - case ORC_X86_paddb: + case ORC_X86_label_paddb: res->lane[n++] = orc_x86_add_paddb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_paddw: + case ORC_X86_label_paddw: res->lane[n++] = orc_x86_add_paddw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_paddd: + case ORC_X86_label_paddd: res->lane[n++] = orc_x86_add_paddd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_paddsb: + case ORC_X86_label_paddsb: res->lane[n++] = orc_x86_add_paddsb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_paddsw: + case ORC_X86_label_paddsw: res->lane[n++] = orc_x86_add_paddsw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_paddusb: + case ORC_X86_label_paddusb: res->lane[n++] = orc_x86_add_paddusb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_paddusw: + case ORC_X86_label_paddusw: res->lane[n++] = orc_x86_add_paddusw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pand: + case ORC_X86_label_pand: res->lane[n++] = orc_x86_add_pand (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pandn: + case ORC_X86_label_pandn: res->lane[n++] = orc_x86_add_pandn (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pcmpeqb: + case ORC_X86_label_pcmpeqb: res->lane[n++] = orc_x86_add_pcmpeqb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pcmpeqw: + case ORC_X86_label_pcmpeqw: res->lane[n++] = orc_x86_add_pcmpeqw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pcmpeqd: + case ORC_X86_label_pcmpeqd: res->lane[n++] = orc_x86_add_pcmpeqd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pcmpgtb: + case ORC_X86_label_pcmpgtb: res->lane[n++] = orc_x86_add_pcmpgtb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pcmpgtw: + case ORC_X86_label_pcmpgtw: res->lane[n++] = orc_x86_add_pcmpgtw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pcmpgtd: + case ORC_X86_label_pcmpgtd: res->lane[n++] = orc_x86_add_pcmpgtd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pmaddwd: + case ORC_X86_label_pmaddwd: res->lane[n++] = orc_x86_add_pmaddwd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pmulhw: + case ORC_X86_label_pmulhw: res->lane[n++] = orc_x86_add_pmulhw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pmullw: + case ORC_X86_label_pmullw: res->lane[n++] = orc_x86_add_pmullw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_por: + case ORC_X86_label_por: res->lane[n++] = orc_x86_add_por (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psllw: + case ORC_X86_label_psllw: res->lane[n++] = orc_x86_add_psllw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pslld: + case ORC_X86_label_pslld: res->lane[n++] = orc_x86_add_pslld (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psllq: + case ORC_X86_label_psllq: res->lane[n++] = orc_x86_add_psllq (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psraw: + case ORC_X86_label_psraw: res->lane[n++] = orc_x86_add_psraw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psrad: + case ORC_X86_label_psrad: res->lane[n++] = orc_x86_add_psrad (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psrlw: + case ORC_X86_label_psrlw: res->lane[n++] = orc_x86_add_psrlw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psrld: + case ORC_X86_label_psrld: res->lane[n++] = orc_x86_add_psrld (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psrlq: + case ORC_X86_label_psrlq: res->lane[n++] = orc_x86_add_psrlq (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psllw_imm: + case ORC_X86_label_psllw_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_psllw_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_pslld_imm: + case ORC_X86_label_pslld_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_pslld_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_psllq_imm: + case ORC_X86_label_psllq_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_psllq_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_psraw_imm: + case ORC_X86_label_psraw_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_psraw_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_psrad_imm: + case ORC_X86_label_psrad_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_psrad_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_psrlw_imm: + case ORC_X86_label_psrlw_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_psrlw_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_psrld_imm: + case ORC_X86_label_psrld_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_psrld_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_psrlq_imm: + case ORC_X86_label_psrlq_imm: if (orc_program_check_constant (p, INSN_ARG (p, insn, 1), &val)) res->lane[n++] = orc_x86_add_psrlq_imm (c, arg[0]->lane[0], val); break; - case ORC_X86_psubb: + case ORC_X86_label_psubb: res->lane[n++] = orc_x86_add_psubb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psubw: + case ORC_X86_label_psubw: res->lane[n++] = orc_x86_add_psubw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psubd: + case ORC_X86_label_psubd: res->lane[n++] = orc_x86_add_psubd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psubsb: + case ORC_X86_label_psubsb: res->lane[n++] = orc_x86_add_psubsb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psubsw: + case ORC_X86_label_psubsw: res->lane[n++] = orc_x86_add_psubsw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psubusb: + case ORC_X86_label_psubusb: res->lane[n++] = orc_x86_add_psubusb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_psubusw: + case ORC_X86_label_psubusw: res->lane[n++] = orc_x86_add_psubusw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pxor: + case ORC_X86_label_pxor: res->lane[n++] = orc_x86_add_pxor (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_punpckhbw: + case ORC_X86_label_punpckhbw: res->lane[n++] = orc_x86_add_punpckhbw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_punpckhwd: + case ORC_X86_label_punpckhwd: res->lane[n++] = orc_x86_add_punpckhwd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_punpckhdq: + case ORC_X86_label_punpckhdq: res->lane[n++] = orc_x86_add_punpckhdq (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_punpcklbw: + case ORC_X86_label_punpcklbw: res->lane[n++] = orc_x86_add_punpcklbw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_punpcklwd: + case ORC_X86_label_punpcklwd: res->lane[n++] = orc_x86_add_punpcklwd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_punpckldq: + case ORC_X86_label_punpckldq: res->lane[n++] = orc_x86_add_punpckldq (c, arg[0]->lane[0], arg[1]->lane[0]); break; /* SSE */ - case ORC_X86_pavgb: + case ORC_X86_label_pavgb: res->lane[n++] = orc_x86_add_pavgb (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pavgw: + case ORC_X86_label_pavgw: res->lane[n++] = orc_x86_add_pavgw (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pextrw: - case ORC_X86_pinsrw: - case ORC_X86_pmaxsw: - case ORC_X86_pmaxub: - case ORC_X86_pminsw: - case ORC_X86_pminub: - case ORC_X86_pmulhuw: - case ORC_X86_psadbw: - case ORC_X86_pshufw: + case ORC_X86_label_pextrw: + case ORC_X86_label_pinsrw: + case ORC_X86_label_pmaxsw: + case ORC_X86_label_pmaxub: + case ORC_X86_label_pminsw: + case ORC_X86_label_pminub: + case ORC_X86_label_pmulhuw: + case ORC_X86_label_psadbw: + case ORC_X86_label_pshufw: break; /* SSE2 */ - case ORC_X86_paddq: + case ORC_X86_label_paddq: res->lane[n++] = orc_x86_add_paddq (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pmuludq: + case ORC_X86_label_pmuludq: printf ("pmuludq\n"); break; - case ORC_X86_pshufd: + case ORC_X86_label_pshufd: printf ("pshufd\n"); break; - case ORC_X86_pshufhw: + case ORC_X86_label_pshufhw: printf ("pshufhw\n"); break; - case ORC_X86_pshuflw: + case ORC_X86_label_pshuflw: printf ("pshuflw\n"); break; - case ORC_X86_pslldq: + case ORC_X86_label_pslldq: printf ("pslldq\n"); break; - case ORC_X86_psrldq: + case ORC_X86_label_psrldq: printf ("psrldq\n"); break; - case ORC_X86_psubq: + case ORC_X86_label_psubq: printf ("psubq t%d, t%d, t%d\n", insn->id, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_punpckhqdq: + case ORC_X86_label_punpckhqdq: printf ("punpckhqdq\n"); break; - case ORC_X86_punpcklqdq: + case ORC_X86_label_punpcklqdq: printf ("punpcklqdq\n"); break; /* SSSE3 */ - case ORC_X86_palignr: + case ORC_X86_label_palignr: break; - case ORC_X86_phaddw: + case ORC_X86_label_phaddw: res->lane[n++] = orc_x86_add_phaddw (c, arg[0]->lane[0], arg[0]->lane[0]); break; - case ORC_X86_phaddd: + case ORC_X86_label_phaddd: res->lane[n++] = orc_x86_add_phaddd (c, arg[0]->lane[0], arg[0]->lane[0]); break; - case ORC_X86_phaddsw: + case ORC_X86_label_phaddsw: printf ("phaddsw\n"); break; - case ORC_X86_phsubw: + case ORC_X86_label_phsubw: printf ("phsubw\n"); break; - case ORC_X86_phsubd: + case ORC_X86_label_phsubd: printf ("phsubd\n"); break; - case ORC_X86_phsubsw: + case ORC_X86_label_phsubsw: printf ("phsubsw\n"); break; - case ORC_X86_pmaddubsw: + case ORC_X86_label_pmaddubsw: printf ("pmaddubsw\n"); break; - case ORC_X86_pabsb: + case ORC_X86_label_pabsb: printf ("pabsb\n"); break; - case ORC_X86_pabsw: + case ORC_X86_label_pabsw: printf ("pabsw\n"); break; - case ORC_X86_pabsd: + case ORC_X86_label_pabsd: printf ("pabsd\n"); break; - case ORC_X86_pmulhrsw: + case ORC_X86_label_pmulhrsw: printf ("pmulhrsw\n"); break; - case ORC_X86_pshufb: + case ORC_X86_label_pshufb: reduce_x86_pshufb (c, insn, res, arg); n = res->n_lanes; break; - case ORC_X86_psignb: - case ORC_X86_psignw: - case ORC_X86_psignd: + case ORC_X86_label_psignb: + case ORC_X86_label_psignw: + case ORC_X86_label_psignd: break; /* SSE4_1 */ - case ORC_X86_packusdw: + case ORC_X86_label_packusdw: res->lane[n++] = orc_x86_add_packusdw (c, arg[0]->lane[0], arg[0]->lane[0]); break; - case ORC_X86_pcmpeqq: - case ORC_X86_pmaxsb: - case ORC_X86_pmaxsd: - case ORC_X86_pmaxud: - case ORC_X86_pmaxuw: - case ORC_X86_pminsb: - case ORC_X86_pminsd: - case ORC_X86_pminud: - case ORC_X86_pminuw: - break; - case ORC_X86_pmovsxbw: + case ORC_X86_label_pcmpeqq: + case ORC_X86_label_pmaxsb: + case ORC_X86_label_pmaxsd: + case ORC_X86_label_pmaxud: + case ORC_X86_label_pmaxuw: + case ORC_X86_label_pminsb: + case ORC_X86_label_pminsd: + case ORC_X86_label_pminud: + case ORC_X86_label_pminuw: + break; + case ORC_X86_label_pmovsxbw: res->lane[n++] = orc_x86_add_pmovsxbw (c, arg[0]->lane[0]); break; - case ORC_X86_pmovsxbd: + case ORC_X86_label_pmovsxbd: res->lane[n++] = orc_x86_add_pmovsxbd (c, arg[0]->lane[0]); break; - case ORC_X86_pmovsxbq: + case ORC_X86_label_pmovsxbq: res->lane[n++] = orc_x86_add_pmovsxbq (c, arg[0]->lane[0]); break; - case ORC_X86_pmovsxwd: + case ORC_X86_label_pmovsxwd: res->lane[n++] = orc_x86_add_pmovsxwd (c, arg[0]->lane[0]); break; - case ORC_X86_pmovsxwq: + case ORC_X86_label_pmovsxwq: res->lane[n++] = orc_x86_add_pmovsxwq (c, arg[0]->lane[0]); break; - case ORC_X86_pmovsxdq: + case ORC_X86_label_pmovsxdq: res->lane[n++] = orc_x86_add_pmovsxdq (c, arg[0]->lane[0]); break; - case ORC_X86_pmovzxbw: + case ORC_X86_label_pmovzxbw: res->lane[n++] = orc_x86_add_pmovzxbw (c, arg[0]->lane[0]); break; - case ORC_X86_pmovzxbd: + case ORC_X86_label_pmovzxbd: res->lane[n++] = orc_x86_add_pmovzxbd (c, arg[0]->lane[0]); break; - case ORC_X86_pmovzxbq: + case ORC_X86_label_pmovzxbq: res->lane[n++] = orc_x86_add_pmovzxbq (c, arg[0]->lane[0]); break; - case ORC_X86_pmovzxwd: + case ORC_X86_label_pmovzxwd: res->lane[n++] = orc_x86_add_pmovzxwd (c, arg[0]->lane[0]); break; - case ORC_X86_pmovzxwq: + case ORC_X86_label_pmovzxwq: res->lane[n++] = orc_x86_add_pmovzxwq (c, arg[0]->lane[0]); break; - case ORC_X86_pmovzxdq: + case ORC_X86_label_pmovzxdq: res->lane[n++] = orc_x86_add_pmovzxdq (c, arg[0]->lane[0]); break; - case ORC_X86_pmuldq: + case ORC_X86_label_pmuldq: res->lane[n++] = orc_x86_add_pmuldq (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_pmulld: + case ORC_X86_label_pmulld: res->lane[n++] = orc_x86_add_pmulld (c, arg[0]->lane[0], arg[1]->lane[0]); break; /* SSE4_2 */ - case ORC_X86_pcmpgtq: + case ORC_X86_label_pcmpgtq: res->lane[n++] = orc_x86_add_pcmpgtq (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_addps: + case ORC_X86_label_addps: res->lane[n++] = orc_x86_add_addps (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_subps: + case ORC_X86_label_subps: res->lane[n++] = orc_x86_add_subps (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_mulps: + case ORC_X86_label_mulps: res->lane[n++] = orc_x86_add_mulps (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_divps: + case ORC_X86_label_divps: res->lane[n++] = orc_x86_add_divps (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_sqrtps: - res->lane[n++] = orc_x86_add_sqrtps (c, arg[0]->lane[0], arg[1]->lane[0]); + case ORC_X86_label_sqrtps: + res->lane[n++] = orc_x86_add_sqrtps (c, arg[0]->lane[0]); break; - case ORC_X86_addpd: + case ORC_X86_label_addpd: res->lane[n++] = orc_x86_add_addpd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_subpd: + case ORC_X86_label_subpd: res->lane[n++] = orc_x86_add_subpd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_mulpd: + case ORC_X86_label_mulpd: res->lane[n++] = orc_x86_add_mulpd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_divpd: + case ORC_X86_label_divpd: res->lane[n++] = orc_x86_add_divpd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_sqrtpd: - res->lane[n++] = orc_x86_add_sqrtpd (c, arg[0]->lane[0], arg[1]->lane[0]); + case ORC_X86_label_sqrtpd: + res->lane[n++] = orc_x86_add_sqrtpd (c, arg[0]->lane[0]); break; - case ORC_X86_cmpeqps: + case ORC_X86_label_cmpeqps: res->lane[n++] = orc_x86_add_cmpeqps (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_cmpeqpd: + case ORC_X86_label_cmpeqpd: res->lane[n++] = orc_x86_add_cmpeqpd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_cmpltps: + case ORC_X86_label_cmpltps: res->lane[n++] = orc_x86_add_cmpltps (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_cmpltpd: + case ORC_X86_label_cmpltpd: res->lane[n++] = orc_x86_add_cmpltpd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_cmpleps: + case ORC_X86_label_cmpleps: res->lane[n++] = orc_x86_add_cmpleps (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_cmplepd: + case ORC_X86_label_cmplepd: res->lane[n++] = orc_x86_add_cmplepd (c, arg[0]->lane[0], arg[1]->lane[0]); break; - case ORC_X86_cvttps2dq: + case ORC_X86_label_cvttps2dq: res->lane[n++] = orc_x86_add_cvttps2dq (c, arg[0]->lane[0]); break; - case ORC_X86_cvttpd2dq: + case ORC_X86_label_cvttpd2dq: res->lane[n++] = orc_x86_add_cvttpd2dq (c, arg[0]->lane[0]); break; - case ORC_X86_cvtdq2ps: + case ORC_X86_label_cvtdq2ps: res->lane[n++] = orc_x86_add_cvtdq2ps (c, arg[0]->lane[0]); break; - case ORC_X86_cvtdq2pd: + case ORC_X86_label_cvtdq2pd: res->lane[n++] = orc_x86_add_cvtdq2pd (c, arg[0]->lane[0]); break; - case ORC_X86_cvtps2pd: + case ORC_X86_label_cvtps2pd: res->lane[n++] = orc_x86_add_cvtps2pd (c, arg[0]->lane[0]); break; - case ORC_X86_cvtpd2ps: + case ORC_X86_label_cvtpd2ps: res->lane[n++] = orc_x86_add_cvtpd2ps (c, arg[0]->lane[0]); break; - case ORC_X86_minps: - case ORC_X86_minpd: - case ORC_X86_maxps: - case ORC_X86_maxpd: - case ORC_X86_movhps_load: + case ORC_X86_label_minps: + case ORC_X86_label_minpd: + case ORC_X86_label_maxps: + case ORC_X86_label_maxpd: default: ORC_ERROR ("unhandled label %d", L_INSN_LABEL (l, insn)); break; @@ -2199,6 +2213,7 @@ orc_x86_compiler_schedule (OrcX86Compiler *c) c->scheduled = insn->id; insn->allocated = 1; + insn->mode = ORC_X86_INSN_MODE_SSE; for (i = 0; i < 2; i++) { if ((arg = X86_INSN_ARG (c, insn, i)) && !arg->scheduled) { if (!arg->allocated) { @@ -2206,17 +2221,17 @@ orc_x86_compiler_schedule (OrcX86Compiler *c) /* first time we use the result of an instruction, * allocate a register for it */ - if (i == 0 && insn->dest != -1) { - reg = insn->dest; + if (i == 0 && insn->reg != -1) { + reg = insn->reg; reused = 1; } else reg = alloc_reg (c); - arg->dest = reg; + arg->reg = reg; arg->allocated = 1; } else { - if (i == 0 && arg->dest != insn->dest && insn->opcode != ORC_X86_movq_load) { + if (i == 0 && arg->reg != insn->reg && insn->opcode != ORC_X86_op_movq) { int res, id; id = insn->id; @@ -2229,13 +2244,13 @@ orc_x86_compiler_schedule (OrcX86Compiler *c) arg->n_use--; arg = X86_GET_INSN (c, res); - arg->dest = insn->dest; + arg->reg = insn->reg; arg->allocated = 1; arg->n_use = 1; reused = 1; } } - insn->src = arg->dest; + insn->rm = arg->reg; //printf ("used: %d visited: %d\n", arg->n_use, arg->visited); if (arg->n_use == ++arg->visited) { queue_enqueue (c, &queue, arg); @@ -2244,8 +2259,8 @@ orc_x86_compiler_schedule (OrcX86Compiler *c) } /* this is where the register was first used, scheduling the * instruction frees it again */ - if (insn->dest != -1 && !reused) - free_reg (c, insn->dest); + if (insn->reg != -1 && !reused) + free_reg (c, insn->reg); } } @@ -2260,7 +2275,7 @@ orc_x86_compiler_print (OrcX86Compiler *c) orc_constant_serialize (X86_GET_CONST (c, i), stdout, ORC_CONSTANT_SERIALIZE_VALUE); } for (i = 0; i < c->n_instructions; i++) { - orc_x86_insn_print (X86_GET_INSN (c, i), stdout, 0); + orc_x86_insn_assemble (X86_GET_INSN (c, i), NULL, ORC_X86_ASM_FLAG_PSEUDO); } } @@ -2277,7 +2292,7 @@ orc_x86_compiler_print_scheduled (OrcX86Compiler *c) id = c->scheduled; while (id != -1) { OrcX86Insn *insn = X86_GET_INSN (c, id); - orc_x86_insn_print (insn, stdout, 0); + orc_x86_insn_assemble (insn, NULL, ORC_X86_ASM_FLAG_GAS); id = insn->next; } } diff --git a/orc/x86/orc-x86.h b/orc/x86/orc-x86-compiler.h index b9fecc5..bcab69c 100644 --- a/orc/x86/orc-x86.h +++ b/orc/x86/orc-x86-compiler.h @@ -1,15 +1,15 @@ -#ifndef _ORC_X86_H -#define _ORC_X86_H_ +#ifndef _ORC_X86_COMPILER_H +#define _ORC_X86_COMPILER_H_ typedef struct _OrcX86Reduced OrcX86Reduced; -typedef struct _OrcX86Insn OrcX86Insn; typedef struct _OrcX86Compiler OrcX86Compiler; #include <orc/orcprogram.h> #include <orc/orccompiler.h> #include <orc/orclabel.h> +#include <orc/x86/orc-x86-label.h> #include <orc/x86/orc-x86-insn.h> #define ORC_X86_MAX_LANES 4 @@ -49,7 +49,4 @@ struct _OrcX86Compiler { int scheduled; }; -void orc_x86_init (void); - - -#endif /* _ORC_X86_H_ */ +#endif /* _ORC_X86_COMPILER_H_ */ diff --git a/orc/x86/orc-x86-insn.c b/orc/x86/orc-x86-insn.c index f11f56b..9e6a9e1 100644 --- a/orc/x86/orc-x86-insn.c +++ b/orc/x86/orc-x86-insn.c @@ -5,39 +5,29 @@ #include "orcdebug.h" #include "orcutils.h" -#include "orc-x86.h" +#include "orc-x86-insn.h" #include "orcexecutor.h" #include "orclabel.h" #include "orctarget.h" #include "orcoptimize.h" -#define INSN_ID(insn) ((insn)->id) -#define INSN_RES(insn) ((insn)->id) -#define INSN_BITS(insn) ((insn)->bits) -#define INSN_ARGBITS(insn) ((insn)->argbits) -#define INSN_ITEMS(insn) ((insn)->items) -#define INSN_SIZE(insn) (INSN_ITEMS(insn)*INSN_BITS(insn)) - -#define IID_BITS(p,id) (INSN_BITS(GET_INSN(p,id))) - -#define INSN_ARG_RES(insn,n) ((insn)->arg[n]) - -#define EXEC_VAR(e,idx) ((e)->var + (64 * (idx))) -#define INSN_RES_VAR(e,insn) (EXEC_VAR ((e), INSN_RES (insn))) -#define INSN_ARG(p,insn,n) (GET_INSN(p,INSN_ARG_RES(insn,n))) - #define X86_INSN_ID(insn) ((insn)->id) #define X86_INSN_ARG_ID(insn,i) ((insn)->arg[i]) -#define ORC_GP_REG_BASE 16 -#define X86_MM0 32 -#define X86_XMM0 48 - typedef struct _OrcX86OpcodeInfo OrcX86OpcodeInfo; +typedef int (*OrcX86EmitFunc) (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcCode *code, int flags); +typedef int (*OrcX86AsmFunc) (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcBuffer *buffer, int flags); + +static int orc_x86_emit_generic (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcCode *code, int flags); +static int orc_x86_asm_generic (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcBuffer *buffer, int flags); + struct _OrcX86OpcodeInfo { char name[16]; - int type; + OrcX86EmitFunc emit; + OrcX86AsmFunc assemble; +#define ORC_X86_OPCODE_FLAG_LABEL (1 << 0) +#define ORC_X86_OPCODE_FLAG_ALIGN (1 << 0) int flags; uint8_t prefix; uint32_t code; @@ -46,319 +36,481 @@ struct _OrcX86OpcodeInfo { static const OrcX86OpcodeInfo orc_x86_opcodes[] = { /* MMX */ - { "movd", ORC_X86_INSN_TYPE_REGM_MMX, 0, 0x01, 0x0f6e }, - { "movd", ORC_X86_INSN_TYPE_MMX_REGM_REV, 0, 0x01, 0x0f7e }, - { "movq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0f7e }, - { "movq", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x66, 0x0fd6 }, - - { "packsswb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f63 }, - { "packssdw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f6b }, - { "packuswb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f67 }, - { "paddb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ffc }, - { "paddw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ffd }, - { "paddd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ffe }, - { "paddsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fec }, - { "paddsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fed }, - { "paddusb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fdc }, - { "paddusw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fdd }, - { "pand", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fdb }, - { "pandn", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fdf }, - - { "pcmpeqb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f74 }, - { "pcmpeqw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f75 }, - { "pcmpeqd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f76 }, - { "pcmpgtb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f64 }, - { "pcmpgtw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f65 }, - { "pcmpgtd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f66 }, - - { "pmaddwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff5 }, - { "pmulhw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe5 }, - { "pmullw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fd5 }, - - { "por", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0feb }, - { "pshufw", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0x00, 0x0f70 }, - - { "psllw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff1 }, - { "pslld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff2 }, - { "psllq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff3 }, - { "psraw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe1 }, - { "psrad", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe2 }, - { "psrlw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fd1 }, - { "psrld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fd2 }, - { "psrlq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fd3 }, - { "psllw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f71, 6 }, - { "pslld", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f72, 6 }, - { "psllq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f73, 6 }, - { "psraw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f71, 4 }, - { "psrad", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f72, 4 }, - { "psrlw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f71, 2 }, - { "psrld", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f72, 2 }, - { "psrlq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f73, 2 }, - - { "psubb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff8 }, - { "psubw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff9 }, - { "psubd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ffa }, - { "psubsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe8 }, - { "psubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe9 }, - { "psubusb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fd8 }, - { "psubusw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fd9 }, - - { "punpckhbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f68 }, - { "punpckhwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f69 }, - { "punpckhdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f6a }, - { "punpcklbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f60 }, - { "punpcklwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f61 }, - { "punpckldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f62 }, - - { "pxor", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fef }, + { "movd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f7e }, + { "movq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0fd6 }, + + { "packsswb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f63 }, + { "packssdw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f6b }, + { "packuswb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f67 }, + { "paddb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ffc }, + { "paddw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ffd }, + { "paddd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ffe }, + { "paddsb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fec }, + { "paddsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fed }, + { "paddusb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fdc }, + { "paddusw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fdd }, + { "pand", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fdb }, + { "pandn", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fdf }, + + { "pcmpeqb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f74 }, + { "pcmpeqw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f75 }, + { "pcmpeqd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f76 }, + { "pcmpgtb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f64 }, + { "pcmpgtw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f65 }, + { "pcmpgtd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f66 }, + + { "pmaddwd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff5 }, + { "pmulhw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe5 }, + { "pmullw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fd5 }, + + { "por", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0feb }, + { "pshufw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f70 }, + + { "psllw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff1 }, + { "pslld", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff2 }, + { "psllq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff3 }, + { "psraw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe1 }, + { "psrad", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe2 }, + { "psrlw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fd1 }, + { "psrld", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fd2 }, + { "psrlq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fd3 }, + + { "psubb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff8 }, + { "psubw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff9 }, + { "psubd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ffa }, + { "psubsb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe8 }, + { "psubsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe9 }, + { "psubusb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fd8 }, + { "psubusw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fd9 }, + + { "punpckhbw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f68 }, + { "punpckhwd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f69 }, + { "punpckhdq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f6a }, + { "punpcklbw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f60 }, + { "punpcklwd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f61 }, + { "punpckldq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f62 }, + + { "pxor", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fef }, /* SSE */ - { "pavgb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe0 }, - { "pavgw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe3 }, - { "pextrw", ORC_X86_INSN_TYPE_IMM8_MMX_REG_REV, 0, 0x01, 0x0f3a15 }, - { "pinsrw", ORC_X86_INSN_TYPE_IMM8_REGM_MMX, 0, 0x01, 0x0fc4 }, - { "pmaxsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fee }, - { "pmaxub", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fde }, - { "pminsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fea }, - { "pminub", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fda }, - { "pmulhuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fe4 }, - { "psadbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff6 }, + { "pavgb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe0 }, + { "pavgw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe3 }, + { "pextrw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3a15 }, + { "pinsrw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fc4 }, + { "pmaxsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fee }, + { "pmaxub", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fde }, + { "pminsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fea }, + { "pminub", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fda }, + { "pmulhuw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fe4 }, + { "psadbw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff6 }, /* SSE2 */ - { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f6f }, - { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f6f }, - { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x66, 0x0f7f }, - { "movdqu", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0f6f }, - { "movdqu", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0xf3, 0x0f7f }, - { "movntdq", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x66, 0x0fe7 }, - - { "paddq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0fd4 }, - { "pmuludq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ff4 }, - { "pshufd", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0x66, 0x0f70 }, - { "pshufhw", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0xf3, 0x0f70 }, - { "pshuflw", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0xf2, 0x0f70 }, - { "pslldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f73 }, - { "psrldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f73 }, - { "pslldq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f73, 7 }, - { "psrldq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x01, 0x0f73, 3 }, - { "psubq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0ffb }, - { "punpckhqdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f6d }, - { "punpcklqdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f6c }, + { "movdqa", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f6f }, + { "movdqu", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0xf3, 0x0f6f }, + { "movntdq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0fe7 }, + + { "paddq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0fd4 }, + { "pmuludq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ff4 }, + { "pshufd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f70 }, + { "pshufhw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0xf3, 0x0f70 }, + { "pshuflw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0xf2, 0x0f70 }, + { "pslldq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f73 }, + { "psrldq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f73 }, + { "psubq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0ffb }, + { "punpckhqdq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f6d }, + { "punpcklqdq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f6c }, /* SSSE3 */ - { "palignr", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0x66, 0x0f3a0f }, - { "phaddw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3801 }, - { "phaddd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3802 }, - { "phaddsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3803 }, - { "phsubw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3805 }, - { "phsubd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3806 }, - { "phsubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3807 }, - { "pmaddubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3804 }, - { "pabsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f381c }, - { "pabsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f381d }, - { "pabsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f381e }, - { "pmulhrsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f380b }, - { "pshufb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3800 }, - { "psignb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3808 }, - { "psignw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3809 }, - { "psignd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f380a }, + { "palignr", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f3a0f }, + { "phaddw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3801 }, + { "phaddd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3802 }, + { "phaddsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3803 }, + { "phsubw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3805 }, + { "phsubd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3806 }, + { "phsubsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3807 }, + { "pmaddubsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3804 }, + { "pabsb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f381c }, + { "pabsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f381d }, + { "pabsd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f381e }, + { "pmulhrsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f380b }, + { "pshufb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3800 }, + { "psignb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3808 }, + { "psignw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3809 }, + { "psignd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f380a }, /* SSE4_1 */ - { "packusdw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f382b }, - { "pcmpeqq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3829 }, - { "pextrb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3a14 }, - { "pextrd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3a16 }, - { "pextrq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3a16 }, - { "phminposuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3841 }, - { "pinsrb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3a20 }, - { "pinsrd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3a22 }, - { "pinsrq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3a22 }, - { "pmaxsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f383c }, - { "pmaxsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f383d }, - { "pmaxuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f383e }, - { "pmaxud", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f383f }, - { "pminsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3838 }, - { "pminsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3839 }, - { "pminuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f383a }, - { "pminud", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f383b }, - { "pmovsxbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3820 }, - { "pmovsxbd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3821 }, - { "pmovsxbq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3822 }, - { "pmovsxwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3823 }, - { "pmovsxwq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3824 }, - { "pmovsxdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3825 }, - { "pmovzxbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3830 }, - { "pmovzxbd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3831 }, - { "pmovzxbq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3832 }, - { "pmovzxwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3833 }, - { "pmovzxwq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3834 }, - { "pmovzxdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3835 }, - { "pmuldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3828 }, - { "pmulld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3840 }, + { "packusdw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f382b }, + { "pcmpeqq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3829 }, + { "pextrb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3a14 }, + { "pextrd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3a16 }, + { "pextrq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3a16 }, + { "phminposuw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3841 }, + { "pinsrb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3a20 }, + { "pinsrd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3a22 }, + { "pinsrq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3a22 }, + { "pmaxsb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f383c }, + { "pmaxsd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f383d }, + { "pmaxuw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f383e }, + { "pmaxud", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f383f }, + { "pminsb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3838 }, + { "pminsd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3839 }, + { "pminuw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f383a }, + { "pminud", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f383b }, + { "pmovsxbw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3820 }, + { "pmovsxbd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3821 }, + { "pmovsxbq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3822 }, + { "pmovsxwd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3823 }, + { "pmovsxwq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3824 }, + { "pmovsxdq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3825 }, + { "pmovzxbw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3830 }, + { "pmovzxbd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3831 }, + { "pmovzxbq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3832 }, + { "pmovzxwd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3833 }, + { "pmovzxwq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3834 }, + { "pmovzxdq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3835 }, + { "pmuldq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3828 }, + { "pmulld", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3840 }, /* SSE4_2 */ - { "pcmpgtq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x01, 0x0f3837 }, - - { "addps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f58 }, - { "subps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5c }, - { "mulps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f59 }, - { "divps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5e }, - { "sqrtps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f51 }, - { "addpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f58 }, - { "subpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5c }, - { "mulpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f59 }, - { "divpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5e }, - { "sqrtpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f51 }, - { "cmpeqps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x00, 0x0fc2, 0 }, - { "cmpeqpd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x66, 0x0fc2, 0 }, - { "cmpltps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x00, 0x0fc2, 1 }, - { "cmpltpd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x66, 0x0fc2, 1 }, - { "cmpleps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x00, 0x0fc2, 2 }, - { "cmplepd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x66, 0x0fc2, 2 }, - { "cvttps2dq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0f5b }, - { "cvttpd2dq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe6 }, - { "cvtdq2ps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5b }, - { "cvtdq2pd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0fe6 }, - { "cvtps2pd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5a }, - { "cvtpd2ps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5a }, - { "minps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5d }, - { "minpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5d }, - { "maxps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5f }, - { "maxpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5f }, - { "movhps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f16 }, - - { "ldmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x00, 0x0fae, 2 }, - { "stmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x00, 0x0fae, 3 }, - { "add", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 0 }, - { "add", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 0 }, - { "add", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x03 }, - { "add", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x01 }, - { "or", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 1 }, - { "or", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 1 }, - { "or", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x0b }, - { "or", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x09 }, - { "adc", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 2 }, - { "adc", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 2 }, - { "adc", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x13 }, - { "adc", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x11 }, - { "sbb", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 3 }, - { "sbb", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 3 }, - { "sbb", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x1b }, - { "sbb", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x19 }, - { "and", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 4 }, - { "and", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 4 }, - { "and", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x23 }, - { "and", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x21 }, - { "sub", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 5 }, - { "sub", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 5 }, - { "sub", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x2b }, - { "sub", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x29 }, - { "xor", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 6 }, - { "xor", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 6 }, - { "xor", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x33 }, - { "xor", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x31 }, - { "cmp", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 7 }, - { "cmp", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 7 }, - { "cmp", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x3b }, - { "cmp", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x39 }, - { "jo", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x70 }, - { "jno", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x71 }, - { "jc", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x72 }, - { "jnc", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x73 }, - { "jz", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x74 }, - { "jnz", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x75 }, - { "jbe", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x76 }, - { "ja", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x77 }, - { "js", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x78 }, - { "jns", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x79 }, - { "jp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7a }, - { "jnp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7b }, - { "jl", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7c }, - { "jge", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7d }, - { "jle", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7e }, - { "jg", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7f }, - { "jmp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0xeb }, - { "ret", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0xc3 }, - { "retq", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0xc3 }, - { "emms", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0x0f77 }, - { "rdtsc", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0x0f31 }, - { "nop", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0x90 }, - { "rep movsb", ORC_X86_INSN_TYPE_NONE, 0, 0xf3, 0xa4 }, - { "rep movsw", ORC_X86_INSN_TYPE_NONE, 0, 0x66, 0xf3a5 }, - { "rep movsl", ORC_X86_INSN_TYPE_NONE, 0, 0xf3, 0xa5 }, - { "push", ORC_X86_INSN_TYPE_STACK, 0, 0x00, 0x50 }, - { "pop", ORC_X86_INSN_TYPE_STACK, 0, 0x00, 0x58 }, - { "movzx", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x0fb6 }, - { "movw", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x66, 0x8b }, - { "movl", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8b }, - { "mov", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8b }, - { "mov", ORC_X86_INSN_TYPE_IMM32_REGM_MOV, 0, 0x00, 0xb8 }, - { "movb", ORC_X86_INSN_TYPE_REG8_REGM, 0, 0x00, 0x88 }, - { "movw", ORC_X86_INSN_TYPE_REG16_REGM, 0, 0x66, 0x89 }, - { "movl", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x89 }, - { "mov", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x89 }, - { "test", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x85 }, - { "testl", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0xf7, 0 }, - { "leal", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8d }, - { "leaq", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8d }, - { "imul", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x0faf }, - { "imull", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xf7, 5 }, - { "incl", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xff, 0 }, - { "decl", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xff, 1 }, - { "sar", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0xc1, 7 }, - { "sar", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xd1, 7 }, - { "and", ORC_X86_INSN_TYPE_IMM32_A, 0, 0x00, 0x25, 4 }, - - { "movd", ORC_X86_INSN_TYPE_REGM_MMX, 0, 0x01, 0x0f6e }, - { "", ORC_X86_INSN_TYPE_ALIGN, 0, 0x00, 0x00 }, - { "", ORC_X86_INSN_TYPE_LABEL, 0, 0x00, 0x00 }, + { "pcmpgtq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x01, 0x0f3837 }, + + { "addps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f58 }, + { "subps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f5c }, + { "mulps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f59 }, + { "divps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f5e }, + { "sqrtps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f51 }, + { "addpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f58 }, + { "subpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f5c }, + { "mulpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f59 }, + { "divpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f5e }, + { "sqrtpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f51 }, + { "cmpeqps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0fc2, 0 }, + { "cmpeqpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0fc2, 0 }, + { "cmpltps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0fc2, 1 }, + { "cmpltpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0fc2, 1 }, + { "cmpleps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0fc2, 2 }, + { "cmplepd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0fc2, 2 }, + { "cvttps2dq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0xf3, 0x0f5b }, + { "cvttpd2dq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0fe6 }, + { "cvtdq2ps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f5b }, + { "cvtdq2pd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0xf3, 0x0fe6 }, + { "cvtps2pd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f5a }, + { "cvtpd2ps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f5a }, + { "minps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f5d }, + { "minpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f5d }, + { "maxps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f5f }, + { "maxpd", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0x0f5f }, + { "movhps", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f16 }, + + { "ldmxcsr", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0fae, 2 }, + { "stmxcsr", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0fae, 3 }, + { "add", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x01 }, + { "or", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x09 }, + { "adc", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x11 }, + { "sbb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x19 }, + { "and", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x21 }, + { "sub", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x29 }, + { "xor", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x31 }, + { "cmp", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x39 }, + { "jo", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x70 }, + { "jno", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x71 }, + { "jc", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x72 }, + { "jnc", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x73 }, + { "jz", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x74 }, + { "jnz", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x75 }, + { "jbe", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x76 }, + { "ja", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x77 }, + { "js", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x78 }, + { "jns", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x79 }, + { "jp", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x7a }, + { "jnp", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x7b }, + { "jl", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x7c }, + { "jge", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x7d }, + { "jle", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x7e }, + { "jg", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x7f }, + { "jmp", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0xeb }, + { "ret", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0xc3 }, + { "retq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0xc3 }, + { "emms", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f77 }, + { "rdtsc", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0f31 }, + { "nop", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x90 }, + { "rep movsb", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0xf3, 0xa4 }, + { "rep movsw", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x66, 0xf3a5 }, + { "rep movsl", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0xf3, 0xa5 }, + { "push", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x50 }, + { "pop", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x58 }, + { "movzx", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0fb6 }, + { "mov", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x8b }, + { "test", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x85 }, + { "leal", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x8d }, + { "leaq", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x8d }, + { "imul", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0x0faf }, + { "inc", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0xff, 0 }, + { "dec", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0xff, 1 }, + { "sar", orc_x86_emit_generic, orc_x86_asm_generic, 0, 0x00, 0xc1, 7 }, + + { "", orc_x86_emit_generic, orc_x86_asm_generic, ORC_X86_OPCODE_FLAG_LABEL, 0x00, 0x00 }, + { "", orc_x86_emit_generic, orc_x86_asm_generic, ORC_X86_OPCODE_FLAG_ALIGN, 0x00, 0x00 }, }; -void -orc_x86_insn_print (const OrcX86Insn *insn, FILE *output, int flags) +static int +orc_x86_insn_assemble_pseudo (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcBuffer *buffer, int flags) { - const OrcX86OpcodeInfo *info = &orc_x86_opcodes[insn->opcode]; - int src1, src2; + int res, src1, src2; - if (info->type == ORC_X86_INSN_TYPE_ALIGN) { - if (insn->imm > 0) - fprintf (output, ".p2align %d\n", insn->imm); - return; - } - if (info->type == ORC_X86_INSN_TYPE_LABEL) { - fprintf (output, "%d:\n", insn->imm); - return; + if (info->flags & ORC_X86_OPCODE_FLAG_LABEL) { + return orc_buffer_append_printf (buffer, "%d:\n", insn->imm); } src1 = X86_INSN_ARG_ID (insn, 0); src2 = X86_INSN_ARG_ID (insn, 1); - if (insn->allocated) { - fprintf (output ,"%s", info->name); - if (insn->dest != -1) - fprintf (output ," xmm%d", insn->dest); - else - fprintf (output ," %d(ptr%d)", insn->offset, insn->extra); - if (insn->src != -1) - fprintf (output ,", xmm%d", insn->src); - else if (insn->extra != -1) - fprintf (output ,", %d(ptr%d)", insn->offset, insn->extra); - else - fprintf (output ,", c%d", insn->offset); - if (insn->imm != -1) - fprintf (output ,", #%d", insn->imm); + res = orc_buffer_append_printf (buffer ,"t%d = %s", insn->id, info->name); + if (src1 != -1) + res += orc_buffer_append_printf (buffer ," t%d", src1); + if (insn->base != -1) + res += orc_buffer_append_printf (buffer ," %d(ptr%d)", insn->disp, insn->base); + else if (insn->disp != -1) + res += orc_buffer_append_printf (buffer ," c%d", insn->disp); + if (insn->imm != -1) + res += orc_buffer_append_printf (buffer ," #%d", insn->imm); + if (src2 != -1) + res += orc_buffer_append_printf (buffer ," t%d", src2); + res += orc_buffer_append_printf (buffer ,"\n"); + + return res; +} + +#define MAX_REG_SIZE 16 +static char * +orx_x86_insn_assemble_reg (const OrcX86Insn *insn, int reg, int gp, char *out, int flags) +{ + OrcX86InsnMode mode = insn->mode; + static const char *regs32[] = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi" }; + static const char *regs64[] = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" }; + + if (gp) + mode = ORC_X86_INSN_MODE_NONE; + + switch (mode) { + case ORC_X86_INSN_MODE_NONE: + if (insn->is_64bit) + sprintf (out, "%s", regs64[reg & 15]); + else + sprintf (out, "%s", regs32[reg & 7]); + break; + case ORC_X86_INSN_MODE_MMX: + sprintf (out, "mm%d", reg); + break; + case ORC_X86_INSN_MODE_SSE: + case ORC_X86_INSN_MODE_AVX128: + sprintf (out, "xmm%d", reg); + break; + case ORC_X86_INSN_MODE_AVX256: + sprintf (out, "ymm%d", reg); + break; + case ORC_X86_INSN_MODE_AVX512: + sprintf (out, "zmm%d", reg); + break; + } + + return out; +} + +#define MAX_MODRM 100 +static char * +orx_x86_insn_assemble_modrm (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, char *out, int flags) +{ + char reg1[MAX_REG_SIZE]; + char reg2[MAX_REG_SIZE]; + + if (insn->base != -1) { + if (insn->index != -1) { + if (insn->scale != 0) { + sprintf (out, "%d(%s, %s, %d)", insn->disp, + orx_x86_insn_assemble_reg (insn, insn->base, 1, reg1, flags), + orx_x86_insn_assemble_reg (insn, insn->index, 1, reg2, flags), + 1 << insn->scale); + } else { + sprintf (out, "%d(%s, %s)", insn->disp, + orx_x86_insn_assemble_reg (insn, insn->base, 1, reg1, flags), + orx_x86_insn_assemble_reg (insn, insn->index, 1, reg2, flags)); + } + } else { + sprintf (out, "%d(%s)", insn->disp, + orx_x86_insn_assemble_reg (insn, insn->base, 1, reg1, flags)); + } } else { - fprintf (output ,"t%d = %s", insn->id, info->name); - if (src1 != -1) - fprintf (output ," t%d", src1); - if (insn->extra != -1) - fprintf (output ," %d(ptr%d)", insn->offset, insn->extra); - else if (insn->offset != -1) - fprintf (output ," c%d", insn->offset); - if (insn->imm != -1) - fprintf (output ," #%d", insn->imm); - if (src2 != -1) - fprintf (output ," t%d", src2); + orx_x86_insn_assemble_reg (insn, insn->rm, 0, out, flags); } - fprintf (output ,"\n"); + return out; } + +static int +orc_x86_insn_assemble_gas (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcBuffer *buffer, int flags) +{ + int res = 0; + const char *avx_prefix; + char modrm[MAX_MODRM]; + char reg1[MAX_REG_SIZE]; + char reg2[MAX_REG_SIZE]; + char reg3[MAX_REG_SIZE]; + + if (info->flags & ORC_X86_OPCODE_FLAG_ALIGN) { + if (insn->imm > 0) + res += orc_buffer_append_printf (buffer, ".p2align %d\n", insn->imm); + return res; + } + if (info->flags & ORC_X86_OPCODE_FLAG_LABEL) { + res += orc_buffer_append_printf (buffer, "%d:\n", insn->imm); + return res; + } + if (insn->mode == ORC_X86_INSN_MODE_NONE) + return orc_x86_insn_assemble_pseudo (info, insn, buffer, flags); + + avx_prefix = (insn->mode >= ORC_X86_INSN_MODE_AVX128 ? "v" : ""); + + res += orc_buffer_append_printf (buffer ,"%s%s", avx_prefix, info->name); + + switch (insn->enc) { + case ORC_X86_INSN_ENC_NP: + break; + + case ORC_X86_INSN_ENC_M: + res += orc_buffer_append_printf (buffer ," %s", + orx_x86_insn_assemble_modrm (info, insn, modrm, flags)); + break; + case ORC_X86_INSN_ENC_MI: + res += orc_buffer_append_printf (buffer ," $0x%x, %s", + insn->imm, + orx_x86_insn_assemble_modrm (info, insn, modrm, flags)); + break; + + case ORC_X86_INSN_ENC_RM: + res += orc_buffer_append_printf (buffer ," %s, %s", + orx_x86_insn_assemble_modrm (info, insn, modrm, flags), + orx_x86_insn_assemble_reg (insn, insn->reg, 0, reg1, flags)); + break; + + case ORC_X86_INSN_ENC_MR: + res += orc_buffer_append_printf (buffer ," %s, %s", + orx_x86_insn_assemble_reg (insn, insn->rm, 0, reg1, flags), + orx_x86_insn_assemble_modrm (info, insn, modrm, flags)); + break; + case ORC_X86_INSN_ENC_RMI: + res += orc_buffer_append_printf (buffer ," $0x%x, %s, %s", + insn->imm, + orx_x86_insn_assemble_modrm (info, insn, modrm, flags), + orx_x86_insn_assemble_reg (insn, insn->reg, 0, reg1, flags)); + break; + case ORC_X86_INSN_ENC_MRI: + res += orc_buffer_append_printf (buffer ," $0x%x, %s, %s", + insn->imm, + orx_x86_insn_assemble_reg (insn, insn->reg, 0, reg1, flags), + orx_x86_insn_assemble_modrm (info, insn, modrm, flags)); + break; + + case ORC_X86_INSN_ENC_VMI: + res += orc_buffer_append_printf (buffer ," $0x%x, %s, %s", + insn->imm, + orx_x86_insn_assemble_modrm (info, insn, modrm, flags), + orx_x86_insn_assemble_reg (insn, insn->v, 0, reg1, flags)); + break; + case ORC_X86_INSN_ENC_RVM: + res += orc_buffer_append_printf (buffer ," %s, %s, %s", + orx_x86_insn_assemble_modrm (info, insn, modrm, flags), + orx_x86_insn_assemble_reg (insn, insn->v, 0, reg1, flags), + orx_x86_insn_assemble_reg (insn, insn->reg, 0, reg2, flags)); + break; + case ORC_X86_INSN_ENC_MVR: + res += orc_buffer_append_printf (buffer ," %s, %s, %s", + orx_x86_insn_assemble_reg (insn, insn->reg, 0, reg1, flags), + orx_x86_insn_assemble_reg (insn, insn->v, 0, reg2, flags), + orx_x86_insn_assemble_modrm (info, insn, modrm, flags)); + break; + case ORC_X86_INSN_ENC_RVMI: + res += orc_buffer_append_printf (buffer ," $0x%x, %s, %s, %s", + insn->imm, + orx_x86_insn_assemble_modrm (info, insn, modrm, flags), + orx_x86_insn_assemble_reg (insn, insn->v, 0, reg1, flags), + orx_x86_insn_assemble_reg (insn, insn->reg, 0, reg2, flags)); + break; + case ORC_X86_INSN_ENC_RVMR: + res += orc_buffer_append_printf (buffer ," %s, %s, %s, %s", + orx_x86_insn_assemble_reg (insn, insn->imm, 0, reg1, flags), + orx_x86_insn_assemble_modrm (info, insn, modrm, flags), + orx_x86_insn_assemble_reg (insn, insn->v, 0, reg2, flags), + orx_x86_insn_assemble_reg (insn, insn->reg, 0, reg3, flags)); + break; + } + res += orc_buffer_append_printf (buffer ,"\n"); + + return res; +} + +static int +orc_x86_insn_assemble_intrin (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcBuffer *buffer, int flags) +{ + int res, src1, src2; + + if (info->flags & ORC_X86_OPCODE_FLAG_LABEL) { + return orc_buffer_append_printf (buffer, "%d:\n", insn->imm); + } + + src1 = X86_INSN_ARG_ID (insn, 0); + src2 = X86_INSN_ARG_ID (insn, 1); + + res = orc_buffer_append_printf (buffer ,"t%d = %s", insn->id, info->name); + if (src1 != -1) + res += orc_buffer_append_printf (buffer ," t%d", src1); + if (insn->base != -1) + res += orc_buffer_append_printf (buffer ," %d(ptr%d)", insn->disp, insn->base); + else if (insn->disp != -1) + res += orc_buffer_append_printf (buffer ," c%d", insn->disp); + if (insn->imm != -1) + res += orc_buffer_append_printf (buffer ," #%d", insn->imm); + if (src2 != -1) + res += orc_buffer_append_printf (buffer ," t%d", src2); + res += orc_buffer_append_printf (buffer ,"\n"); + + return res; +} + +static int +orc_x86_asm_generic (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcBuffer *buffer, int flags) +{ + int res = 0; + + if (flags & ORC_X86_ASM_FLAG_PSEUDO) + res = orc_x86_insn_assemble_pseudo (info, insn, buffer, flags); + else if (flags & ORC_X86_ASM_FLAG_GAS) + res = orc_x86_insn_assemble_gas (info, insn, buffer, flags); + else if (flags & ORC_X86_ASM_FLAG_INTRIN) + res = orc_x86_insn_assemble_intrin (info, insn, buffer, flags); + + return res; +} + +static int +orc_x86_emit_generic (const OrcX86OpcodeInfo *info, const OrcX86Insn *insn, OrcCode *code, int flags) +{ + return 0; +} + +int +orc_x86_insn_assemble (const OrcX86Insn *insn, OrcBuffer *buffer, int flags) +{ + const OrcX86OpcodeInfo *info = &orc_x86_opcodes[insn->opcode]; + + return info->assemble (info, insn, buffer, flags); +} + +int +orc_x86_insn_emit (const OrcX86Insn *insn, OrcCode *code, int flags) +{ + const OrcX86OpcodeInfo *info = &orc_x86_opcodes[insn->opcode]; + + return info->emit (info, insn, code, flags); +} + diff --git a/orc/x86/orc-x86-insn.h b/orc/x86/orc-x86-insn.h index a0ae23c..9f34919 100644 --- a/orc/x86/orc-x86-insn.h +++ b/orc/x86/orc-x86-insn.h @@ -2,349 +2,293 @@ #ifndef _ORC_X86_INSN_H_ #define _ORC_X86_INSN_H_ -typedef struct _OrcX86Insn OrcX86Insn; +#include <orc/orcbuffer.h> -typedef enum { - ORC_X86_INSN_TYPE_MMXM_MMX, /* mem/mmx, mmx */ - ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, /* $shift, mmx. opcode in src */ - ORC_X86_INSN_TYPE_SSEM_SSE, /* mem/mmx, sse */ - ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, - ORC_X86_INSN_TYPE_IMM8_MMX_REG_REV, - ORC_X86_INSN_TYPE_MMXM_MMX_REV, - ORC_X86_INSN_TYPE_SSEM_SSE_REV, - ORC_X86_INSN_TYPE_REGM_MMX, - ORC_X86_INSN_TYPE_MMX_REGM_REV, - ORC_X86_INSN_TYPE_REGM, - ORC_X86_INSN_TYPE_MEM, - ORC_X86_INSN_TYPE_IMM8_REGM, - ORC_X86_INSN_TYPE_IMM32_REGM, - ORC_X86_INSN_TYPE_REGM_REG, - ORC_X86_INSN_TYPE_REG_REGM, - ORC_X86_INSN_TYPE_LABEL, - ORC_X86_INSN_TYPE_ALIGN, - ORC_X86_INSN_TYPE_BRANCH, - ORC_X86_INSN_TYPE_NONE, - ORC_X86_INSN_TYPE_STACK, - ORC_X86_INSN_TYPE_IMM32_REGM_MOV, - ORC_X86_INSN_TYPE_REG8_REGM, - ORC_X86_INSN_TYPE_REG16_REGM, - ORC_X86_INSN_TYPE_IMM32_A, - ORC_X86_INSN_TYPE_IMM8_REGM_MMX, -} OrcX86InsnType; +typedef struct _OrcX86Insn OrcX86Insn; typedef enum { /* MMX */ - ORC_X86_movd_load, - ORC_X86_movd_store, - ORC_X86_movq_load, - ORC_X86_movq_store, - - ORC_X86_packsswb, - ORC_X86_packssdw, - ORC_X86_packuswb, - ORC_X86_paddb, - ORC_X86_paddw, - ORC_X86_paddd, - ORC_X86_paddsb, - ORC_X86_paddsw, - ORC_X86_paddusb, - ORC_X86_paddusw, - ORC_X86_pand, - ORC_X86_pandn, - - ORC_X86_pcmpeqb, - ORC_X86_pcmpeqw, - ORC_X86_pcmpeqd, - ORC_X86_pcmpgtb, - ORC_X86_pcmpgtw, - ORC_X86_pcmpgtd, - - ORC_X86_pmaddwd, - ORC_X86_pmulhw, - ORC_X86_pmullw, - - ORC_X86_por, - ORC_X86_pshufw, - - ORC_X86_psllw, - ORC_X86_pslld, - ORC_X86_psllq, - ORC_X86_psraw, - ORC_X86_psrad, - ORC_X86_psrlw, - ORC_X86_psrld, - ORC_X86_psrlq, - - ORC_X86_psllw_imm, - ORC_X86_pslld_imm, - ORC_X86_psllq_imm, - ORC_X86_psraw_imm, - ORC_X86_psrad_imm, - ORC_X86_psrlw_imm, - ORC_X86_psrld_imm, - ORC_X86_psrlq_imm, - - ORC_X86_psubb, - ORC_X86_psubw, - ORC_X86_psubd, - ORC_X86_psubsb, - ORC_X86_psubsw, - ORC_X86_psubusb, - ORC_X86_psubusw, - - ORC_X86_punpckhbw, - ORC_X86_punpckhwd, - ORC_X86_punpckhdq, - ORC_X86_punpcklbw, - ORC_X86_punpcklwd, - ORC_X86_punpckldq, - ORC_X86_pxor, + ORC_X86_op_movd, + ORC_X86_op_movq, + + ORC_X86_op_packsswb, + ORC_X86_op_packssdw, + ORC_X86_op_packuswb, + ORC_X86_op_paddb, + ORC_X86_op_paddw, + ORC_X86_op_paddd, + ORC_X86_op_paddsb, + ORC_X86_op_paddsw, + ORC_X86_op_paddusb, + ORC_X86_op_paddusw, + ORC_X86_op_pand, + ORC_X86_op_pandn, + + ORC_X86_op_pcmpeqb, + ORC_X86_op_pcmpeqw, + ORC_X86_op_pcmpeqd, + ORC_X86_op_pcmpgtb, + ORC_X86_op_pcmpgtw, + ORC_X86_op_pcmpgtd, + + ORC_X86_op_pmaddwd, + ORC_X86_op_pmulhw, + ORC_X86_op_pmullw, + + ORC_X86_op_por, + ORC_X86_op_pshufw, + + ORC_X86_op_psllw, + ORC_X86_op_pslld, + ORC_X86_op_psllq, + ORC_X86_op_psraw, + ORC_X86_op_psrad, + ORC_X86_op_psrlw, + ORC_X86_op_psrld, + ORC_X86_op_psrlq, + + ORC_X86_op_psubb, + ORC_X86_op_psubw, + ORC_X86_op_psubd, + ORC_X86_op_psubsb, + ORC_X86_op_psubsw, + ORC_X86_op_psubusb, + ORC_X86_op_psubusw, + + ORC_X86_op_punpckhbw, + ORC_X86_op_punpckhwd, + ORC_X86_op_punpckhdq, + ORC_X86_op_punpcklbw, + ORC_X86_op_punpcklwd, + ORC_X86_op_punpckldq, + + ORC_X86_op_pxor, /* SSE */ - ORC_X86_pavgb, - ORC_X86_pavgw, - ORC_X86_pextrw, - ORC_X86_pinsrw, - ORC_X86_pmaxsw, - ORC_X86_pmaxub, - ORC_X86_pminsw, - ORC_X86_pminub, - ORC_X86_pmulhuw, - ORC_X86_psadbw, + ORC_X86_op_pavgb, + ORC_X86_op_pavgw, + ORC_X86_op_pextrw, + ORC_X86_op_pinsrw, + ORC_X86_op_pmaxsw, + ORC_X86_op_pmaxub, + ORC_X86_op_pminsw, + ORC_X86_op_pminub, + ORC_X86_op_pmulhuw, + ORC_X86_op_psadbw, /* SSE2 */ - ORC_X86_movdqa, - ORC_X86_movdqa_load, - ORC_X86_movdqa_store, - ORC_X86_movdqu_load, - ORC_X86_movdqu_store, - ORC_X86_movntdq_store, - ORC_X86_paddq, - ORC_X86_pmuludq, - ORC_X86_pshufd, - ORC_X86_pshufhw, - ORC_X86_pshuflw, - ORC_X86_pslldq, - ORC_X86_psrldq, - ORC_X86_pslldq_imm, - ORC_X86_psrldq_imm, - ORC_X86_psubq, - ORC_X86_punpckhqdq, - ORC_X86_punpcklqdq, + ORC_X86_op_movdqa, + ORC_X86_op_movdqu, + ORC_X86_op_movntdq, + + ORC_X86_op_paddq, + ORC_X86_op_pmuludq, + ORC_X86_op_pshufd, + ORC_X86_op_pshufhw, + ORC_X86_op_pshuflw, + ORC_X86_op_pslldq, + ORC_X86_op_psrldq, + ORC_X86_op_psubq, + ORC_X86_op_punpckhqdq, + ORC_X86_op_punpcklqdq, /* SSSE3 */ - ORC_X86_palignr, - ORC_X86_phaddw, - ORC_X86_phaddd, - ORC_X86_phaddsw, - ORC_X86_phsubw, - ORC_X86_phsubd, - ORC_X86_phsubsw, - ORC_X86_pmaddubsw, - ORC_X86_pabsb, - ORC_X86_pabsw, - ORC_X86_pabsd, - ORC_X86_pmulhrsw, - ORC_X86_pshufb, - ORC_X86_psignb, - ORC_X86_psignw, - ORC_X86_psignd, + ORC_X86_op_palignr, + ORC_X86_op_phaddw, + ORC_X86_op_phaddd, + ORC_X86_op_phaddsw, + ORC_X86_op_phsubw, + ORC_X86_op_phsubd, + ORC_X86_op_phsubsw, + ORC_X86_op_pmaddubsw, + ORC_X86_op_pabsb, + ORC_X86_op_pabsw, + ORC_X86_op_pabsd, + ORC_X86_op_pmulhrsw, + ORC_X86_op_pshufb, + ORC_X86_op_psignb, + ORC_X86_op_psignw, + ORC_X86_op_psignd, /* SSE4_1 */ - ORC_X86_packusdw, - ORC_X86_pcmpeqq, - ORC_X86_pextrb, - ORC_X86_pextrd, - ORC_X86_pextrq, - ORC_X86_phminposuw, - ORC_X86_pinsrb, - ORC_X86_pinsrd, - ORC_X86_pinsrq, - ORC_X86_pmaxsb, - ORC_X86_pmaxsd, - ORC_X86_pmaxuw, - ORC_X86_pmaxud, - ORC_X86_pminsb, - ORC_X86_pminsd, - ORC_X86_pminuw, - ORC_X86_pminud, - ORC_X86_pmovsxbw, - ORC_X86_pmovsxbd, - ORC_X86_pmovsxbq, - ORC_X86_pmovsxwd, - ORC_X86_pmovsxwq, - ORC_X86_pmovsxdq, - ORC_X86_pmovzxbw, - ORC_X86_pmovzxbd, - ORC_X86_pmovzxbq, - ORC_X86_pmovzxwd, - ORC_X86_pmovzxwq, - ORC_X86_pmovzxdq, - ORC_X86_pmuldq, - ORC_X86_pmulld, + ORC_X86_op_packusdw, + ORC_X86_op_pcmpeqq, + ORC_X86_op_pextrb, + ORC_X86_op_pextrd, + ORC_X86_op_pextrq, + ORC_X86_op_phminposuw, + ORC_X86_op_pinsrb, + ORC_X86_op_pinsrd, + ORC_X86_op_pinsrq, + ORC_X86_op_pmaxsb, + ORC_X86_op_pmaxsd, + ORC_X86_op_pmaxuw, + ORC_X86_op_pmaxud, + ORC_X86_op_pminsb, + ORC_X86_op_pminsd, + ORC_X86_op_pminuw, + ORC_X86_op_pminud, + ORC_X86_op_pmovsxbw, + ORC_X86_op_pmovsxbd, + ORC_X86_op_pmovsxbq, + ORC_X86_op_pmovsxwd, + ORC_X86_op_pmovsxwq, + ORC_X86_op_pmovsxdq, + ORC_X86_op_pmovzxbw, + ORC_X86_op_pmovzxbd, + ORC_X86_op_pmovzxbq, + ORC_X86_op_pmovzxwd, + ORC_X86_op_pmovzxwq, + ORC_X86_op_pmovzxdq, + ORC_X86_op_pmuldq, + ORC_X86_op_pmulld, /* SSE4_2 */ - ORC_X86_pcmpgtq, - - ORC_X86_addps, - ORC_X86_subps, - ORC_X86_mulps, - ORC_X86_divps, - ORC_X86_sqrtps, - ORC_X86_addpd, - ORC_X86_subpd, - ORC_X86_mulpd, - ORC_X86_divpd, - ORC_X86_sqrtpd, - ORC_X86_cmpeqps, - ORC_X86_cmpeqpd, - ORC_X86_cmpltps, - ORC_X86_cmpltpd, - ORC_X86_cmpleps, - ORC_X86_cmplepd, - ORC_X86_cvttps2dq, - ORC_X86_cvttpd2dq, - ORC_X86_cvtdq2ps, - ORC_X86_cvtdq2pd, - ORC_X86_cvtps2pd, - ORC_X86_cvtpd2ps, - ORC_X86_minps, - ORC_X86_minpd, - ORC_X86_maxps, - ORC_X86_maxpd, - ORC_X86_movhps_load, - - ORC_X86_ldmxcsr, - ORC_X86_stmxcsr, - ORC_X86_add_imm8_rm, - ORC_X86_add_imm32_rm, - ORC_X86_add_rm_r, - ORC_X86_add_r_rm, - ORC_X86_or_imm8_rm, - ORC_X86_or_imm32_rm, - ORC_X86_or_rm_r, - ORC_X86_or_r_rm, - ORC_X86_adc_imm8_rm, - ORC_X86_adc_imm32_rm, - ORC_X86_adc_rm_r, - ORC_X86_adc_r_rm, - ORC_X86_sbb_imm8_rm, - ORC_X86_sbb_imm32_rm, - ORC_X86_sbb_rm_r, - ORC_X86_sbb_r_rm, - ORC_X86_and_imm8_rm, - ORC_X86_and_imm32_rm, - ORC_X86_and_rm_r, - ORC_X86_and_r_rm, - ORC_X86_sub_imm8_rm, - ORC_X86_sub_imm32_rm, - ORC_X86_sub_rm_r, - ORC_X86_sub_r_rm, - ORC_X86_xor_imm8_rm, - ORC_X86_xor_imm32_rm, - ORC_X86_xor_rm_r, - ORC_X86_xor_r_rm, - ORC_X86_cmp_imm8_rm, - ORC_X86_cmp_imm32_rm, - ORC_X86_cmp_rm_r, - ORC_X86_cmp_r_rm, - ORC_X86_jo, - ORC_X86_jno, - ORC_X86_jc, - ORC_X86_jnc, - ORC_X86_jz, - ORC_X86_jnz, - ORC_X86_jbe, - ORC_X86_ja, - ORC_X86_js, - ORC_X86_jns, - ORC_X86_jp, - ORC_X86_jnp, - ORC_X86_jl, - ORC_X86_jge, - ORC_X86_jle, - ORC_X86_jg, - ORC_X86_jmp, - ORC_X86_ret, - ORC_X86_retq, - ORC_X86_emms, - ORC_X86_rdtsc, - ORC_X86_nop, - ORC_X86_rep_movsb, - ORC_X86_rep_movsw, - ORC_X86_rep_movsl, - ORC_X86_push, - ORC_X86_pop, - ORC_X86_movzx_rm_r, - ORC_X86_movw_rm_r, - ORC_X86_movl_rm_r, - ORC_X86_mov_rm_r, - ORC_X86_mov_imm32_r, - ORC_X86_movb_r_rm, - ORC_X86_movw_r_rm, - ORC_X86_movl_r_rm, - ORC_X86_mov_r_rm, - ORC_X86_test, - ORC_X86_test_imm, - ORC_X86_leal, - ORC_X86_leaq, - ORC_X86_imul_rm_r, - ORC_X86_imul_rm, - ORC_X86_inc, - ORC_X86_dec, - ORC_X86_sar_imm, - ORC_X86_sar, - ORC_X86_and_imm32_a, + ORC_X86_op_pcmpgtq, + + ORC_X86_op_addps, + ORC_X86_op_subps, + ORC_X86_op_mulps, + ORC_X86_op_divps, + ORC_X86_op_sqrtps, + ORC_X86_op_addpd, + ORC_X86_op_subpd, + ORC_X86_op_mulpd, + ORC_X86_op_divpd, + ORC_X86_op_sqrtpd, + ORC_X86_op_cmpeqps, + ORC_X86_op_cmpeqpd, + ORC_X86_op_cmpltps, + ORC_X86_op_cmpltpd, + ORC_X86_op_cmpleps, + ORC_X86_op_cmplepd, + ORC_X86_op_cvttps2dq, + ORC_X86_op_cvttpd2dq, + ORC_X86_op_cvtdq2ps, + ORC_X86_op_cvtdq2pd, + ORC_X86_op_cvtps2pd, + ORC_X86_op_cvtpd2ps, + ORC_X86_op_minps, + ORC_X86_op_minpd, + ORC_X86_op_maxps, + ORC_X86_op_maxpd, + ORC_X86_op_movhps_load, + + ORC_X86_op_ldmxcsr, + ORC_X86_op_stmxcsr, + ORC_X86_op_add, + ORC_X86_op_or, + ORC_X86_op_adc, + ORC_X86_op_sbb, + ORC_X86_op_and, + ORC_X86_op_sub, + ORC_X86_op_xor, + ORC_X86_op_cmp, + ORC_X86_op_jo, + ORC_X86_op_jno, + ORC_X86_op_jc, + ORC_X86_op_jnc, + ORC_X86_op_jz, + ORC_X86_op_jnz, + ORC_X86_op_jbe, + ORC_X86_op_ja, + ORC_X86_op_js, + ORC_X86_op_jns, + ORC_X86_op_jp, + ORC_X86_op_jnp, + ORC_X86_op_jl, + ORC_X86_op_jge, + ORC_X86_op_jle, + ORC_X86_op_jg, + ORC_X86_op_jmp, + ORC_X86_op_ret, + ORC_X86_op_retq, + ORC_X86_op_emms, + ORC_X86_op_rdtsc, + ORC_X86_op_nop, + ORC_X86_op_rep_movsb, + ORC_X86_op_rep_movsw, + ORC_X86_op_rep_movsl, + ORC_X86_op_push, + ORC_X86_op_pop, + ORC_X86_op_movzx, + ORC_X86_op_movb, + ORC_X86_op_movw, + ORC_X86_op_movl, + ORC_X86_op_mov, + ORC_X86_op_test, + ORC_X86_op_leal, + ORC_X86_op_leaq, + ORC_X86_op_imul, + ORC_X86_op_inc, + ORC_X86_op_dec, + ORC_X86_op_sar, /* other opcodes */ - ORC_X86_load_const, - ORC_X86_LABEL, - ORC_X86_ALIGN, - - /* labels */ - ORC_X86_label_load, - ORC_X86_label_load_const, - ORC_X86_label_store, - ORC_X86_label_shl, - ORC_X86_label_shru, - ORC_X86_label_shrs, - ORC_X86_label_trunc, - ORC_X86_label_clampu, - ORC_X86_label_clamps, - - /* shuffle patterns */ - ORC_X86_label_dup2, - ORC_X86_label_dup4, - ORC_X86_label_dup8, - ORC_X86_label_dup16, - ORC_X86_label_select0, - ORC_X86_label_select1, - ORC_X86_label_select2, - ORC_X86_label_select3, - ORC_X86_label_select4, - ORC_X86_label_select5, - ORC_X86_label_select6, - ORC_X86_label_select7, - ORC_X86_label_zip, - + ORC_X86_op_LABEL, + ORC_X86_op_ALIGN, } OrcX86Opcode; +typedef enum { + ORC_X86_INSN_ENC_NP, /* */ + + ORC_X86_INSN_ENC_M, /* ModRM:r/m */ + ORC_X86_INSN_ENC_MI, /* ModRM:r/m imm8 */ + + ORC_X86_INSN_ENC_RM, /* ModRM:reg ModRM:r/m */ + ORC_X86_INSN_ENC_MR, /* ModRM:r/m ModRM:reg */ + ORC_X86_INSN_ENC_RMI, /* ModRM:reg ModRM:r/m imm8 */ + ORC_X86_INSN_ENC_MRI, /* ModRM:r/m ModRM:reg imm8 */ + + ORC_X86_INSN_ENC_VMI, /* VEX.vvvv ModRM:r/m imm8 */ + ORC_X86_INSN_ENC_RVM, /* ModRM:reg VEX.vvvv ModRM:r/m */ + ORC_X86_INSN_ENC_MVR, /* ModRM:r/m VEX.vvvv ModRM:reg */ + ORC_X86_INSN_ENC_RVMI, /* ModRM:reg VEX.vvvv ModRM:r/m imm8 */ + ORC_X86_INSN_ENC_RVMR, /* ModRM:reg VEX.vvvv ModRM:r/m imm8[7:4] */ +} OrcX86InsnEnc; + +/** + * OrcX86InsnMode: + * @ORC_X86_INSN_MODE_NONE: + * @ORC_X86_INSN_MODE_MMX: + * @ORC_X86_INSN_MODE_SSE: + * @ORC_X86_INSN_MODE_AVX128: + * @ORC_X86_INSN_MODE_AVX256: + * @ORC_X86_INSN_MODE_AVX512: + * + * Different modes of the instruction + */ +typedef enum { + ORC_X86_INSN_MODE_NONE, + ORC_X86_INSN_MODE_MMX, + ORC_X86_INSN_MODE_SSE, + ORC_X86_INSN_MODE_AVX128, + ORC_X86_INSN_MODE_AVX256, + ORC_X86_INSN_MODE_AVX512, +} OrcX86InsnMode; + struct _OrcX86Insn { OrcX86Opcode opcode; int id; int arg[2]; - int extra; - int offset; - int imm; + OrcX86InsnEnc enc; + OrcX86InsnMode mode; + + int is_64bit; int n_use; - int dest; - int src; - int label; - int type; + /* for generating the instruction */ + int reg; + int rm; + int disp; + int scale; + int index; + int base; + int imm; + int v; int visited; int scheduled; @@ -353,7 +297,15 @@ struct _OrcX86Insn { int next; }; -void orc_x86_insn_print (const OrcX86Insn *insn, FILE *output, int flags); +#define ORC_X86_ASM_FLAG_NONE (0) +#define ORC_X86_ASM_FLAG_PSEUDO (1 << 0) +#define ORC_X86_ASM_FLAG_INTEL (1 << 1) +#define ORC_X86_ASM_FLAG_GAS (1 << 2) +#define ORC_X86_ASM_FLAG_INTRIN (1 << 3) + +int orc_x86_insn_assemble (const OrcX86Insn *insn, OrcBuffer *buffer, int flags); + +#define orc_x86_add_ #endif /* _ORC_X86_INSN_H_ */ |