sse: more conversion to sysinsn
authorDavid Schleef <ds@schleef.org>
Wed, 3 Nov 2010 17:54:00 +0000 (18:54 +0100)
committerDavid Schleef <ds@schleef.org>
Wed, 3 Nov 2010 17:54:00 +0000 (18:54 +0100)
orc/orcsse.c
orc/orcsse.h
orc/orcx86.c
orc/orcx86.h
orc/orcx86insn.c
orc/orcx86insn.h

index 241aa2b..0c4f766 100644 (file)
@@ -39,24 +39,6 @@ orc_x86_get_regname_sse(int i)
 }
 
 
-#if 0
-void
-orc_sse_emit_pextrw_memoffset (OrcCompiler *p, int imm, int src,
-    int offset, int dest)
-{
-  ORC_ASM_CODE(p,"  pextrw $%d, %%%s, %d(%%%s)\n", imm,
-      orc_x86_get_regname_sse(src),
-      offset, orc_x86_get_regname_ptr (p, dest));
-  *p->codeptr++ = 0x66;
-  orc_x86_emit_rex (p, 0, src, 0, dest);
-  *p->codeptr++ = 0x0f;
-  *p->codeptr++ = 0x3a;
-  *p->codeptr++ = 0x15;
-  orc_x86_emit_modrm_memoffset_old (p, src, offset, dest);
-  *p->codeptr++ = imm;
-}
-#endif
-
 void
 orc_x86_emit_mov_memoffset_sse (OrcCompiler *compiler, int size, int offset,
     int reg1, int reg2, int is_aligned)
@@ -94,48 +76,26 @@ orc_x86_emit_mov_memindex_sse (OrcCompiler *compiler, int size, int offset,
 {
   switch (size) {
     case 4:
-      ORC_ASM_CODE(compiler,"  movd %d(%%%s,%%%s,%d), %%%s\n", offset,
-          orc_x86_get_regname_ptr(compiler, reg1),
-          orc_x86_get_regname_ptr(compiler, regindex), 1<<shift,
-          orc_x86_get_regname_sse(reg2));
-      *compiler->codeptr++ = 0x66;
-      orc_x86_emit_rex(compiler, 0, reg2, 0, reg1);
-      *compiler->codeptr++ = 0x0f;
-      *compiler->codeptr++ = 0x6e;
+      orc_sse_emit_movd_load_memindex (compiler, offset,
+          reg1, regindex, shift, reg2);
       break;
     case 8:
-      ORC_ASM_CODE(compiler,"  movq %d(%%%s,%%%s,%d), %%%s\n", offset, orc_x86_get_regname_ptr(compiler, reg1),
-          orc_x86_get_regname_ptr(compiler, regindex), 1<<shift,
-          orc_x86_get_regname_sse(reg2));
-      *compiler->codeptr++ = 0xf3;
-      orc_x86_emit_rex(compiler, 0, reg2, 0, reg1);
-      *compiler->codeptr++ = 0x0f;
-      *compiler->codeptr++ = 0x7e;
+      orc_sse_emit_movq_load_memindex (compiler, offset,
+          reg1, regindex, shift, reg2);
       break;
     case 16:
       if (is_aligned) {
-        ORC_ASM_CODE(compiler,"  movdqa %d(%%%s,%%%s,%d), %%%s\n", offset, orc_x86_get_regname_ptr(compiler, reg1),
-            orc_x86_get_regname_ptr(compiler, regindex), 1<<shift,
-            orc_x86_get_regname_sse(reg2));
-        *compiler->codeptr++ = 0x66;
-        orc_x86_emit_rex(compiler, 0, reg2, 0, reg1);
-        *compiler->codeptr++ = 0x0f;
-        *compiler->codeptr++ = 0x6f;
+        orc_sse_emit_movdqa_load_memindex (compiler, offset,
+            reg1, regindex, shift, reg2);
       } else {
-        ORC_ASM_CODE(compiler,"  movdqu %d(%%%s,%%%s,%d), %%%s\n", offset, orc_x86_get_regname_ptr(compiler, reg1),
-            orc_x86_get_regname_ptr(compiler, regindex), 1<<shift,
-            orc_x86_get_regname_sse(reg2));
-        *compiler->codeptr++ = 0xf3;
-        orc_x86_emit_rex(compiler, 0, reg2, 0, reg1);
-        *compiler->codeptr++ = 0x0f;
-        *compiler->codeptr++ = 0x6f;
+        orc_sse_emit_movdqu_load_memindex (compiler, offset,
+            reg1, regindex, shift, reg2);
       }
       break;
     default:
       ORC_COMPILER_ERROR(compiler, "bad size");
       break;
   }
-  orc_x86_emit_modrm_memindex (compiler, reg2, offset, reg1, regindex, shift);
 }
 
 void
@@ -174,38 +134,16 @@ void orc_x86_emit_mov_sse_reg_reg (OrcCompiler *compiler, int reg1, int reg2)
   }
 
   orc_sse_emit_movdqu (compiler, offset, reg1, reg2);
-#if 0
-  ORC_ASM_CODE(compiler,"  movdqa %%%s, %%%s\n", orc_x86_get_regname_sse(reg1),
-        orc_x86_get_regname_sse(reg2));
-
-  *compiler->codeptr++ = 0x66;
-  orc_x86_emit_rex(compiler, 0, reg2, 0, reg1);
-  *compiler->codeptr++ = 0x0f;
-  *compiler->codeptr++ = 0x6f;
-  orc_x86_emit_modrm_reg (compiler, reg1, reg2);
-#endif
 }
 
 void orc_x86_emit_mov_reg_sse (OrcCompiler *compiler, int reg1, int reg2)
 {
-  ORC_ASM_CODE(compiler,"  movd %%%s, %%%s\n", orc_x86_get_regname(reg1),
-      orc_x86_get_regname_sse(reg2));
-  *compiler->codeptr++ = 0x66;
-  orc_x86_emit_rex(compiler, 0, reg2, 0, reg1);
-  *compiler->codeptr++ = 0x0f;
-  *compiler->codeptr++ = 0x6e;
-  orc_x86_emit_modrm_reg (compiler, reg1, reg2);
+  orc_sse_emit_movd_load_register (compiler, reg1, reg2);
 }
 
 void orc_x86_emit_mov_sse_reg (OrcCompiler *compiler, int reg1, int reg2)
 {
-  ORC_ASM_CODE(compiler,"  movd %%%s, %%%s\n", orc_x86_get_regname_sse(reg1),
-      orc_x86_get_regname(reg2));
-  *compiler->codeptr++ = 0x66;
-  orc_x86_emit_rex(compiler, 0, reg1, 0, reg2);
-  *compiler->codeptr++ = 0x0f;
-  *compiler->codeptr++ = 0x7e;
-  orc_x86_emit_modrm_reg (compiler, reg2, reg1);
+  orc_sse_emit_movd_store_register (compiler, reg1, reg2);
 }
 
 void
@@ -213,13 +151,9 @@ orc_sse_set_mxcsr (OrcCompiler *compiler)
 {
   int value;
 
-  ORC_ASM_CODE(compiler,"  stmxcsr %d(%%%s)\n",
+  orc_sse_emit_sysinsn_load_memoffset (compiler, ORC_X86_stmxcsr, 0,
       (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]),
-      orc_x86_get_regname_ptr(compiler, compiler->exec_reg));
-  *compiler->codeptr++ = 0x0f;
-  *compiler->codeptr++ = 0xae;
-  orc_x86_emit_modrm_memoffset_old (compiler, 3,
-      (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]), compiler->exec_reg);
+      compiler->exec_reg, -1);
 
   orc_x86_emit_mov_memoffset_reg (compiler, 4,
       (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]),
@@ -244,24 +178,16 @@ orc_sse_set_mxcsr (OrcCompiler *compiler)
       (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]),
       compiler->exec_reg);
 
-  ORC_ASM_CODE(compiler,"  ldmxcsr %d(%%%s)\n",
+  orc_sse_emit_sysinsn_load_memoffset (compiler, ORC_X86_ldmxcsr, 0,
       (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]),
-      orc_x86_get_regname_ptr(compiler, compiler->exec_reg));
-  *compiler->codeptr++ = 0x0f;
-  *compiler->codeptr++ = 0xae;
-  orc_x86_emit_modrm_memoffset_old (compiler, 2,
-      (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]), compiler->exec_reg);
+      compiler->exec_reg, -1);
 }
 
 void
 orc_sse_restore_mxcsr (OrcCompiler *compiler)
 {
-  ORC_ASM_CODE(compiler,"  ldmxcsr %d(%%%s)\n",
-      (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_C1]),
-      orc_x86_get_regname_ptr(compiler, compiler->exec_reg));
-  *compiler->codeptr++ = 0x0f;
-  *compiler->codeptr++ = 0xae;
-  orc_x86_emit_modrm_memoffset_old (compiler, 2,
-      (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_C1]), compiler->exec_reg);
+  orc_sse_emit_sysinsn_load_memoffset (compiler, ORC_X86_ldmxcsr, 0,
+      (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]),
+      compiler->exec_reg, -1);
 }
 
index def5688..7c5d451 100644 (file)
@@ -72,6 +72,10 @@ void orc_sse_emit_sysinsn_load_memoffset (OrcCompiler *p, int index, int offset,
     int src, int dest, int imm);
 void orc_sse_emit_sysinsn_store_memoffset (OrcCompiler *p, int index, int src,
     int offset, int dest, int imm);
+void orc_sse_emit_sysinsn_load_memindex (OrcCompiler *p, int index, int imm,
+    int offset, int src, int src_index, int shift, int dest);
+void orc_sse_emit_sysinsn_load_register (OrcCompiler *p, int index, int imm,
+    int src, int dest);
 
 unsigned int orc_sse_get_cpu_flags (void);
 
index 0c1f9d7..214f464 100644 (file)
@@ -216,6 +216,26 @@ void orc_x86_emit_modrm_memindex (OrcCompiler *compiler, int reg1, int offset,
   }
 }
 
+void orc_x86_emit_modrm_memindex2 (OrcCompiler *compiler, int offset,
+    int src, int src_index, int shift, int dest)
+{
+  if (offset == 0) {
+    *compiler->codeptr++ = X86_MODRM(0, 4, dest);
+    *compiler->codeptr++ = X86_SIB(shift, src_index, src);
+  } else if (offset >= -128 && offset < 128) {
+    *compiler->codeptr++ = X86_MODRM(1, 4, dest);
+    *compiler->codeptr++ = X86_SIB(shift, src_index, src);
+    *compiler->codeptr++ = (offset & 0xff);
+  } else {
+    *compiler->codeptr++ = X86_MODRM(2, 4, dest);
+    *compiler->codeptr++ = X86_SIB(shift, src_index, src);
+    *compiler->codeptr++ = (offset & 0xff);
+    *compiler->codeptr++ = ((offset>>8) & 0xff);
+    *compiler->codeptr++ = ((offset>>16) & 0xff);
+    *compiler->codeptr++ = ((offset>>24) & 0xff);
+  }
+}
+
 void
 orc_x86_emit_modrm_reg (OrcCompiler *compiler, int reg1, int reg2)
 {
index e478e26..cdd0a60 100644 (file)
@@ -97,6 +97,8 @@ void orc_x86_emit_modrm_memoffset (OrcCompiler *compiler, int offset, int reg1,
 void orc_x86_emit_modrm_reg (OrcCompiler *compiler, int reg1, int reg2);
 void orc_x86_emit_modrm_memindex (OrcCompiler *compiler, int reg1, int offset,
     int reg2, int regindex, int shift);
+void orc_x86_emit_modrm_memindex2 (OrcCompiler *compiler, int offset,
+    int src, int src_index, int shift, int dest);
 
 void orc_x86_do_fixups (OrcCompiler *compiler);
 
index 917dd72..d471b7a 100644 (file)
@@ -152,17 +152,19 @@ static const OrcSysOpcode orc_x86_opcodes[] = {
   { "pshufhw", ORC_X86_INSN_TYPE_SDI, 0, 0xf30f70 },
   { "palignr", ORC_X86_INSN_TYPE_SDI, 0, 0x660f3a0f },
   { "pinsrw", ORC_X86_INSN_TYPE_SDI, 0, 0x660fc4 },
-  { "movd", ORC_X86_INSN_TYPE_SD, 0, 0x660f6e },
+  { "movd", ORC_X86_INSN_TYPE_ED, 0, 0x660f6e },
   { "movq", ORC_X86_INSN_TYPE_SD, 0, 0xf30f7e },
   { "movdqa", ORC_X86_INSN_TYPE_SD, 0, 0x660f6f },
   { "movdqu", ORC_X86_INSN_TYPE_SD, 0, 0xf30f6f },
   { "movhps", ORC_X86_INSN_TYPE_SD, 0, 0x0f16 },
   { "pextrw", ORC_X86_INSN_TYPE_SDI_REV, 0, 0x660f3a15 },
-  { "movd", ORC_X86_INSN_TYPE_SD_REV, 0, 0x660f7e },
+  { "movd", ORC_X86_INSN_TYPE_ED_REV, 0, 0x660f7e },
   { "movq", ORC_X86_INSN_TYPE_SD_REV, 0, 0x660fd6 },
   { "movdqa", ORC_X86_INSN_TYPE_SD_REV, 0, 0x660f7f },
   { "movdqu", ORC_X86_INSN_TYPE_SD_REV, 0, 0xf30f7f },
   { "movntdq", ORC_X86_INSN_TYPE_SD_REV, 0, 0x660fe7 },
+  { "ldmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x0fae, 2 },
+  { "stmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x0fae, 3 },
 
 };
 
@@ -180,6 +182,16 @@ orc_sse_emit_sysinsn (OrcCompiler *p, int index, int imm, int src, int dest)
           orc_x86_get_regname_sse(src),
           orc_x86_get_regname_sse(dest));
       break;
+    case ORC_X86_INSN_TYPE_ED:
+      ORC_ASM_CODE(p,"  %s %%%s, %%%s\n", opcode->name,
+          orc_x86_get_regname(src),
+          orc_x86_get_regname_sse(dest));
+      break;
+    case ORC_X86_INSN_TYPE_ED_REV:
+      ORC_ASM_CODE(p,"  %s %%%s, %%%s\n", opcode->name,
+          orc_x86_get_regname_sse(src),
+          orc_x86_get_regname(dest));
+      break;
     case ORC_X86_INSN_TYPE_SHIFTIMM:
       ORC_ASM_CODE(p,"  %s $%d, %%%s\n", opcode->name,
           imm,
@@ -191,6 +203,7 @@ orc_sse_emit_sysinsn (OrcCompiler *p, int index, int imm, int src, int dest)
           orc_x86_get_regname_sse(src),
           orc_x86_get_regname_sse(dest));
       break;
+    case ORC_X86_INSN_TYPE_MEM:
     default:
       ORC_ASSERT(0);
       break;
@@ -214,10 +227,14 @@ orc_sse_emit_sysinsn (OrcCompiler *p, int index, int imm, int src, int dest)
   }
 
   switch (opcode->type) {
+    case ORC_X86_INSN_TYPE_ED:
     case ORC_X86_INSN_TYPE_SD:
-    case ORC_X86_INSN_TYPE_SD_REV:
       orc_x86_emit_modrm_reg (p, src, dest);
       break;
+    case ORC_X86_INSN_TYPE_SD_REV:
+    case ORC_X86_INSN_TYPE_ED_REV:
+      orc_x86_emit_modrm_reg (p, dest, src);
+      break;
     case ORC_X86_INSN_TYPE_SHIFTIMM:
       orc_x86_emit_modrm_reg (p, dest, opcode->code2);
       *p->codeptr++ = imm;
@@ -230,6 +247,7 @@ orc_sse_emit_sysinsn (OrcCompiler *p, int index, int imm, int src, int dest)
       orc_x86_emit_modrm_reg (p, src, dest);
       *p->codeptr++ = opcode->code2;
       break;
+    case ORC_X86_INSN_TYPE_MEM:
     default:
       ORC_ASSERT(0);
       break;
@@ -247,6 +265,8 @@ orc_sse_emit_sysinsn_load_memoffset (OrcCompiler *p, int index, int imm, int off
     case ORC_X86_INSN_TYPE_SD:
     case ORC_X86_INSN_TYPE_SD_REV:
     case ORC_X86_INSN_TYPE_SD2:
+    case ORC_X86_INSN_TYPE_ED:
+    case ORC_X86_INSN_TYPE_ED_REV:
       ORC_ASM_CODE(p,"  %s %d(%%%s), %%%s\n", opcode->name,
           offset,
           orc_x86_get_regname_ptr(p, src),
@@ -259,6 +279,11 @@ orc_sse_emit_sysinsn_load_memoffset (OrcCompiler *p, int index, int imm, int off
           orc_x86_get_regname_ptr(p, src),
           orc_x86_get_regname_sse(dest));
       break;
+    case ORC_X86_INSN_TYPE_MEM:
+      ORC_ASM_CODE(p,"  %s %d(%%%s)\n", opcode->name,
+          offset,
+          orc_x86_get_regname_ptr(p, src));
+      break;
     default:
       ORC_ASSERT(0);
       break;
@@ -283,6 +308,7 @@ orc_sse_emit_sysinsn_load_memoffset (OrcCompiler *p, int index, int imm, int off
 
   switch (opcode->type) {
     case ORC_X86_INSN_TYPE_SD:
+    case ORC_X86_INSN_TYPE_ED:
       orc_x86_emit_modrm_memoffset (p, offset, src, dest);
       break;
     case ORC_X86_INSN_TYPE_SDI:
@@ -294,12 +320,16 @@ orc_sse_emit_sysinsn_load_memoffset (OrcCompiler *p, int index, int imm, int off
       *p->codeptr++ = imm;
       break;
     case ORC_X86_INSN_TYPE_SD_REV:
+    case ORC_X86_INSN_TYPE_ED_REV:
       orc_x86_emit_modrm_memoffset (p, offset, dest, src);
       break;
     case ORC_X86_INSN_TYPE_SD2:
       orc_x86_emit_modrm_memoffset (p, offset, src, dest);
       *p->codeptr++ = opcode->code2;
       break;
+    case ORC_X86_INSN_TYPE_MEM:
+      orc_x86_emit_modrm_memoffset (p, offset, src, opcode->code2);
+      break;
     default:
       ORC_ASSERT(0);
       break;
@@ -316,6 +346,7 @@ orc_sse_emit_sysinsn_store_memoffset (OrcCompiler *p, int index, int imm, int of
     case ORC_X86_INSN_TYPE_SD:
     case ORC_X86_INSN_TYPE_SD_REV:
     case ORC_X86_INSN_TYPE_SD2:
+    case ORC_X86_INSN_TYPE_ED_REV:
       ORC_ASM_CODE(p,"  %s %%%s, %d(%%%s)\n", opcode->name,
           orc_x86_get_regname_sse(src),
           offset,
@@ -328,6 +359,7 @@ orc_sse_emit_sysinsn_store_memoffset (OrcCompiler *p, int index, int imm, int of
           offset,
           orc_x86_get_regname_ptr(p, dest));
       break;
+    case ORC_X86_INSN_TYPE_ED:
     default:
       ORC_ASSERT(0);
       break;
@@ -363,12 +395,90 @@ orc_sse_emit_sysinsn_store_memoffset (OrcCompiler *p, int index, int imm, int of
       *p->codeptr++ = imm;
       break;
     case ORC_X86_INSN_TYPE_SD_REV:
+    case ORC_X86_INSN_TYPE_ED_REV:
       orc_x86_emit_modrm_memoffset (p, offset, dest, src);
       break;
     case ORC_X86_INSN_TYPE_SD2:
       orc_x86_emit_modrm_memoffset (p, offset, src, dest);
       *p->codeptr++ = opcode->code2;
       break;
+    case ORC_X86_INSN_TYPE_ED:
+    default:
+      ORC_ASSERT(0);
+      break;
+  }
+}
+
+void
+orc_sse_emit_sysinsn_load_memindex (OrcCompiler *p, int index, int imm,
+    int offset, int src, int src_index, int shift, int dest)
+{
+  const OrcSysOpcode *opcode = orc_x86_opcodes + index;
+
+  switch (opcode->type) {
+    case ORC_X86_INSN_TYPE_SD:
+    case ORC_X86_INSN_TYPE_SD_REV:
+    case ORC_X86_INSN_TYPE_SD2:
+    case ORC_X86_INSN_TYPE_ED:
+    case ORC_X86_INSN_TYPE_ED_REV:
+      ORC_ASM_CODE(p,"  %s %d(%%%s,%%%s,%d), %%%s\n", opcode->name,
+          offset,
+          orc_x86_get_regname_ptr(p, src),
+          orc_x86_get_regname_ptr(p, src_index), 1<<shift,
+          orc_x86_get_regname_sse(dest));
+      break;
+    case ORC_X86_INSN_TYPE_SDI:
+    case ORC_X86_INSN_TYPE_SDI_REV:
+      ORC_ASM_CODE(p,"  %s $%d, %d(%%%s,%%%s,%d), %%%s\n", opcode->name,
+          imm, offset,
+          orc_x86_get_regname_ptr(p, src),
+          orc_x86_get_regname_ptr(p, src_index), 1<<shift,
+          orc_x86_get_regname_sse(dest));
+      break;
+    default:
+      ORC_ASSERT(0);
+      break;
+  }
+
+  ORC_ASSERT(opcode->code != 0);
+  if (opcode->code & 0xff000000) {
+    *p->codeptr++ = (opcode->code >> 24) & 0xff;
+    orc_x86_emit_rex (p, 0, dest, 0, src);
+    *p->codeptr++ = (opcode->code >> 16) & 0xff;
+    *p->codeptr++ = (opcode->code >> 8) & 0xff;
+    *p->codeptr++ = (opcode->code >> 0) & 0xff;
+  } else if (opcode->code & 0xff0000) {
+    *p->codeptr++ = (opcode->code >> 16) & 0xff;
+    orc_x86_emit_rex (p, 0, dest, 0, src);
+    *p->codeptr++ = (opcode->code >> 8) & 0xff;
+    *p->codeptr++ = (opcode->code >> 0) & 0xff;
+  } else {
+    *p->codeptr++ = (opcode->code >> 8) & 0xff;
+    orc_x86_emit_rex (p, 0, dest, 0, src);
+    *p->codeptr++ = (opcode->code >> 0) & 0xff;
+  }
+
+  switch (opcode->type) {
+    case ORC_X86_INSN_TYPE_SD:
+    case ORC_X86_INSN_TYPE_ED:
+    case ORC_X86_INSN_TYPE_ED_REV:
+      orc_x86_emit_modrm_memindex2 (p, offset, src, src_index, shift, dest);
+      break;
+    case ORC_X86_INSN_TYPE_SDI:
+      orc_x86_emit_modrm_memindex2 (p, offset, src, src_index, shift, dest);
+      *p->codeptr++ = imm;
+      break;
+    case ORC_X86_INSN_TYPE_SDI_REV:
+      orc_x86_emit_modrm_memindex2 (p, offset, dest, src_index, shift, src);
+      *p->codeptr++ = imm;
+      break;
+    case ORC_X86_INSN_TYPE_SD_REV:
+      orc_x86_emit_modrm_memindex2 (p, offset, dest, src_index, shift, src);
+      break;
+    case ORC_X86_INSN_TYPE_SD2:
+      orc_x86_emit_modrm_memindex2 (p, offset, src, src_index, shift, dest);
+      *p->codeptr++ = opcode->code2;
+      break;
     default:
       ORC_ASSERT(0);
       break;
index 812031e..5c830c6 100644 (file)
@@ -8,7 +8,10 @@ enum {
   ORC_X86_INSN_TYPE_SD2,
   ORC_X86_INSN_TYPE_SDI,
   ORC_X86_INSN_TYPE_SDI_REV,
-  ORC_X86_INSN_TYPE_SD_REV
+  ORC_X86_INSN_TYPE_SD_REV,
+  ORC_X86_INSN_TYPE_ED,
+  ORC_X86_INSN_TYPE_ED_REV,
+  ORC_X86_INSN_TYPE_MEM
 };
 
 enum {
@@ -166,6 +169,8 @@ enum {
   ORC_X86_movdqa_store,
   ORC_X86_movdqu_store,
   ORC_X86_movntdq_store,
+  ORC_X86_ldmxcsr,
+  ORC_X86_stmxcsr,
 };
 
 
@@ -328,5 +333,27 @@ enum {
 #define orc_sse_emit_movdqu_store_memoffset(p,a,offset,b) orc_sse_emit_sysinsn_store_memoffset(p, ORC_X86_movdqu_store, 0, a, offset, b)
 #define orc_sse_emit_movntdq_store_memoffset(p,a,offset,b) orc_sse_emit_sysinsn_store_memoffset(p, ORC_X86_movntdq_store, 0, a, offset, b)
 
+#define orc_sse_emit_pinsrw_memindex(p,imm,offset,a,a_index,shift,b) orc_sse_emit_sysinsn_load_memindex(p, ORC_X86_pinsrw, imm, offset, a, a_index, shift, b)
+#define orc_sse_emit_movd_load_memindex(p,offset,a,a_index,shift,b) orc_sse_emit_sysinsn_load_memindex(p, ORC_X86_movd_load, 0, offset, a, a_index, shift, b)
+#define orc_sse_emit_movq_load_memindex(p,offset,a,a_index,shift,b) orc_sse_emit_sysinsn_load_memindex(p, ORC_X86_movq_load, 0, offset, a, a_index, shift, b)
+#define orc_sse_emit_movdqa_load_memindex(p,offset,a,a_index,shift,b) orc_sse_emit_sysinsn_load_memindex(p, ORC_X86_movdqa_load, 0, offset, a, a_index, shift, b)
+#define orc_sse_emit_movdqu_load_memindex(p,offset,a,a_index,shift,b) orc_sse_emit_sysinsn_load_memindex(p, ORC_X86_movdqu_load, 0, offset, a, a_index, shift, b)
+#define orc_sse_emit_movhps_load_memindex(p,offset,a,a_index,shift,b) orc_sse_emit_sysinsn_load_memindex(p, ORC_X86_movhps_load, 0, offset, a, a_index, shift, b)
+
+#define orc_sse_emit_pextrw_memindex(p,imm,a,offset,b,b_index,shift) orc_sse_emit_sysinsn_store_memindex(p, ORC_X86_pextrw, imm, a, offset, b, b_index, shift)
+#define orc_sse_emit_movd_store_memindex(p,a,offset,b,b_index,shift) orc_sse_emit_sysinsn_store_memindex(p, ORC_X86_movd_store, 0, a, offset, b, b_index, shift)
+#define orc_sse_emit_movq_store_memindex(p,a,offset,b,b_index,shift) orc_sse_emit_sysinsn_store_memindex(p, ORC_X86_movq_store, 0, a, offset, b, b_index, shift)
+#define orc_sse_emit_movdqa_store_memindex(p,a,offset,b,b_index,shift) orc_sse_emit_sysinsn_store_memindex(p, ORC_X86_movdqa_store, 0, a, offset, b, b_index, shift)
+#define orc_sse_emit_movdqu_store_memindex(p,a,offset,b,b_index,shift) orc_sse_emit_sysinsn_store_memindex(p, ORC_X86_movdqu_store, 0, a, offset, b, b_index, shift)
+#define orc_sse_emit_movntdq_store_memindex(p,a,offset,b,b_index,shift) orc_sse_emit_sysinsn_store_memindex(p, ORC_X86_movntdq_store, 0, a, offset, b, b_index, shift)
+
+#define orc_sse_emit_pinsrw_register(p,imm,a,b) orc_sse_emit_sysinsn(p, ORC_X86_pinsrw, imm, a, b)
+#define orc_sse_emit_movd_load_register(p,a,b) orc_sse_emit_sysinsn(p, ORC_X86_movd_load, 0, a, b)
+#define orc_sse_emit_movq_load_register(p,a,b) orc_sse_emit_sysinsn(p, ORC_X86_movq_load, 0, a, b)
+
+#define orc_sse_emit_pextrw_register(p,imm,a,b) orc_sse_emit_sysinsn(p, ORC_X86_pextrw, imm, a, b)
+#define orc_sse_emit_movd_store_register(p,a,b) orc_sse_emit_sysinsn(p, ORC_X86_movd_store, 0, a, b)
+#define orc_sse_emit_movq_store_register(p,a,b) orc_sse_emit_sysinsn(p, ORC_X86_movq_store, 0, a, b)
+
 #endif