summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2015-09-18 17:45:40 +0200
committerWim Taymans <wtaymans@redhat.com>2016-03-07 10:33:29 +0100
commite811740a9cbc135123558f73d5380f042f020697 (patch)
treeb32b0c318d66a1e201ebc5e73e4a7b4badeed6e0
parent5bd45589614bf4e015fdc572b240fe761ac7e943 (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--LICENSE27
-rw-r--r--orc/Makefile.am2
-rw-r--r--orc/c/orc-c.c8
-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.c782
-rw-r--r--orc/x86/orc-x86-insn.h586
7 files changed, 1147 insertions, 1004 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a94dbfb
--- /dev/null
+++ b/LICENSE
@@ -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_ */