#define X86_SIB(ss, ind, reg) ((((ss)&3)<<6)|(((ind)&7)<<3)|((reg)&7))
void
-orc_x86_emit_modrm_memoffset (OrcCompiler *compiler, int reg1, int offset, int reg2)
+orc_x86_emit_modrm_memoffset_old (OrcCompiler *compiler, int reg1, int offset, int reg2)
{
if (offset == 0 && reg2 != compiler->exec_reg) {
if (reg2 == X86_ESP) {
}
}
+void
+orc_x86_emit_modrm_memoffset (OrcCompiler *compiler, int offset, int src, int dest)
+{
+ if (offset == 0 && src != compiler->exec_reg) {
+ if (src == X86_ESP) {
+ *compiler->codeptr++ = X86_MODRM(0, 4, dest);
+ *compiler->codeptr++ = X86_SIB(0, 4, src);
+ } else {
+ *compiler->codeptr++ = X86_MODRM(0, src, dest);
+ }
+ } else if (offset >= -128 && offset < 128) {
+ *compiler->codeptr++ = X86_MODRM(1, src, dest);
+ if (src == X86_ESP) {
+ *compiler->codeptr++ = X86_SIB(0, 4, src);
+ }
+ *compiler->codeptr++ = (offset & 0xff);
+ } else {
+ *compiler->codeptr++ = X86_MODRM(2, src, dest);
+ if (src == X86_ESP) {
+ *compiler->codeptr++ = X86_SIB(0, 4, 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_memindex (OrcCompiler *compiler, int reg1, int offset,
int reg2, int regindex, int shift)
{
orc_x86_emit_rex(compiler, size, reg2, 0, reg1);
*compiler->codeptr++ = 0x0f;
*compiler->codeptr++ = 0xb6;
- orc_x86_emit_modrm_memoffset (compiler, reg2, offset, reg1);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg2, offset, reg1);
return;
case 2:
ORC_ASM_CODE(compiler," movw %d(%%%s), %%%s\n", offset, orc_x86_get_regname_ptr(compiler, reg1),
orc_x86_emit_rex(compiler, size, reg2, 0, reg1);
*compiler->codeptr++ = 0x8b;
- orc_x86_emit_modrm_memoffset (compiler, reg2, offset, reg1);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg2, offset, reg1);
}
void
orc_x86_get_regname_ptr(compiler, reg2));
orc_x86_emit_rex(compiler, size, reg1, 0, reg2);
*compiler->codeptr++ = 0x88;
- orc_x86_emit_modrm_memoffset (compiler, reg1, offset, reg2);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg1, offset, reg2);
return;
case 2:
ORC_ASM_CODE(compiler," movw %%%s, %d(%%%s)\n", orc_x86_get_regname_16(reg1), offset,
orc_x86_emit_rex(compiler, size, reg1, 0, reg2);
*compiler->codeptr++ = 0x89;
- orc_x86_emit_modrm_memoffset (compiler, reg1, offset, reg2);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg1, offset, reg2);
}
void
if (value >= -128 && value < 128) {
*compiler->codeptr++ = 0x83;
/* FIXME */
- orc_x86_emit_modrm_memoffset (compiler, 0, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 0, offset, reg);
*compiler->codeptr++ = (value & 0xff);
} else {
*compiler->codeptr++ = 0x81;
/* FIXME */
- orc_x86_emit_modrm_memoffset (compiler, 0, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 0, offset, reg);
*compiler->codeptr++ = (value & 0xff);
*compiler->codeptr++ = ((value>>8) & 0xff);
if (size == 4) {
orc_x86_emit_rex(compiler, size, 0, 0, reg);
if (value >= -128 && value < 128) {
*compiler->codeptr++ = 0x83;
- orc_x86_emit_modrm_memoffset (compiler, 0, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 0, offset, reg);
*compiler->codeptr++ = (value & 0xff);
} else {
*compiler->codeptr++ = 0x81;
- orc_x86_emit_modrm_memoffset (compiler, 0, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 0, offset, reg);
*compiler->codeptr++ = (value & 0xff);
*compiler->codeptr++ = ((value>>8) & 0xff);
if (size == 4 || size == 8) {
orc_x86_emit_rex(compiler, size, reg1, 0, reg);
*compiler->codeptr++ = 0x01;
- orc_x86_emit_modrm_memoffset (compiler, reg1, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg1, offset, reg);
}
void
orc_x86_get_regname(reg), orc_x86_get_regname(reg));
orc_x86_emit_rex(compiler, size, 0, 0, reg);
*compiler->codeptr++ = 0x8d;
- orc_x86_emit_modrm_memoffset (compiler, reg, value, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg, value, reg);
return;
}
if (size == 8 && compiler->is_64bit) {
orc_x86_get_regname_64(reg), orc_x86_get_regname_64(reg));
orc_x86_emit_rex(compiler, size, reg, 0, reg);
*compiler->codeptr++ = 0x8d;
- orc_x86_emit_modrm_memoffset (compiler, reg, value, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg, value, reg);
return;
}
}
orc_x86_emit_rex(compiler, size, 0, 0, reg);
*compiler->codeptr++ = 0x0f;
*compiler->codeptr++ = 0xaf;
- orc_x86_emit_modrm_memoffset (compiler, destreg, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, destreg, offset, reg);
}
void
orc_x86_emit_rex(compiler, size, destreg, 0, reg);
*compiler->codeptr++ = 0x03;
- orc_x86_emit_modrm_memoffset (compiler, destreg, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, destreg, offset, reg);
}
void
orc_x86_emit_rex(compiler, size, 0, 0, reg);
*compiler->codeptr++ = 0x2b;
- orc_x86_emit_modrm_memoffset (compiler, destreg, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, destreg, offset, reg);
}
void
orc_x86_emit_rex(compiler, size, 0, 0, reg);
*compiler->codeptr++ = 0x39;
- orc_x86_emit_modrm_memoffset (compiler, reg1, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, reg1, offset, reg);
}
void
orc_x86_emit_rex(compiler, size, 0, 0, reg);
if (value >= -128 && value < 128) {
*compiler->codeptr++ = 0x83;
- orc_x86_emit_modrm_memoffset (compiler, 7, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 7, offset, reg);
*compiler->codeptr++ = (value & 0xff);
} else {
*compiler->codeptr++ = 0x81;
- orc_x86_emit_modrm_memoffset (compiler, 7, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 7, offset, reg);
*compiler->codeptr++ = (value & 0xff);
*compiler->codeptr++ = ((value>>8) & 0xff);
if (size == 4) {
orc_x86_emit_rex(compiler, size, 0, 0, reg);
*compiler->codeptr++ = 0xf7;
- orc_x86_emit_modrm_memoffset (compiler, 0, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 0, offset, reg);
*compiler->codeptr++ = (value & 0xff);
*compiler->codeptr++ = ((value>>8) & 0xff);
if (size == 4) {
ORC_ASM_CODE(compiler," addl $-1, %d(%%%s)\n", offset, orc_x86_get_regname_ptr(compiler, reg));
orc_x86_emit_rex(compiler, size, 0, 0, reg);
*compiler->codeptr++ = 0x83;
- orc_x86_emit_modrm_memoffset (compiler, 0, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 0, offset, reg);
*compiler->codeptr++ = 0xff;
return;
} else {
orc_x86_emit_rex(compiler, size, 0, 0, reg);
*compiler->codeptr++ = 0xff;
- orc_x86_emit_modrm_memoffset (compiler, 1, offset, reg);
+ orc_x86_emit_modrm_memoffset_old (compiler, 1, offset, reg);
}
void orc_x86_emit_ret (OrcCompiler *compiler)
{ "pshuflw", ORC_X86_INSN_TYPE_SDI, 0, 0xf20f70 },
{ "pshufhw", ORC_X86_INSN_TYPE_SDI, 0, 0xf30f70 },
{ "palignr", ORC_X86_INSN_TYPE_SDI, 0, 0x660f3a0f },
- { "pinsrw", ORC_X86_INSN_TYPE_SDI_REV, 0, 0x660fc4 },
- { "movd", ORC_X86_INSN_TYPE_SD_REV, 0, 0x660f6e },
- { "movq", ORC_X86_INSN_TYPE_SD_REV, 0, 0xf30f7e },
- { "movdqa", ORC_X86_INSN_TYPE_SD_REV, 0, 0x660f6f },
- { "movdqu", ORC_X86_INSN_TYPE_SD_REV, 0, 0xf30f6f },
- { "movhps", ORC_X86_INSN_TYPE_SD_REV, 0, 0x0f16 },
- { "pextrw", ORC_X86_INSN_TYPE_SDI, 0, 0x660f3a15 },
- { "movd", ORC_X86_INSN_TYPE_SD, 0, 0x660f7e },
- { "movq", ORC_X86_INSN_TYPE_SD, 0, 0x660fd6 },
- { "movdqa", ORC_X86_INSN_TYPE_SD, 0, 0x660f7f },
- { "movdqu", ORC_X86_INSN_TYPE_SD, 0, 0xf30f7f },
- { "movntdq", ORC_X86_INSN_TYPE_SD, 0, 0x660fe7 },
+ { "pinsrw", ORC_X86_INSN_TYPE_SDI, 0, 0x660fc4 },
+ { "movd", ORC_X86_INSN_TYPE_SD, 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 },
+ { "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 },
};
switch (opcode->type) {
case ORC_X86_INSN_TYPE_SD:
- orc_x86_emit_modrm_memoffset (p, src, offset, dest);
+ orc_x86_emit_modrm_memoffset (p, offset, src, dest);
break;
case ORC_X86_INSN_TYPE_SDI:
- orc_x86_emit_modrm_memoffset (p, src, offset, dest);
+ orc_x86_emit_modrm_memoffset (p, offset, src, dest);
*p->codeptr++ = imm;
break;
case ORC_X86_INSN_TYPE_SDI_REV:
- orc_x86_emit_modrm_memoffset (p, dest, offset, src);
+ orc_x86_emit_modrm_memoffset (p, offset, dest, src);
*p->codeptr++ = imm;
break;
case ORC_X86_INSN_TYPE_SD_REV:
- orc_x86_emit_modrm_memoffset (p, dest, offset, src);
+ orc_x86_emit_modrm_memoffset (p, offset, dest, src);
break;
case ORC_X86_INSN_TYPE_SD2:
- orc_x86_emit_modrm_memoffset (p, src, offset, dest);
+ orc_x86_emit_modrm_memoffset (p, offset, src, dest);
*p->codeptr++ = opcode->code2;
break;
default:
switch (opcode->type) {
case ORC_X86_INSN_TYPE_SD:
- orc_x86_emit_modrm_memoffset (p, src, offset, dest);
+ orc_x86_emit_modrm_memoffset (p, offset, src, dest);
break;
case ORC_X86_INSN_TYPE_SDI:
- orc_x86_emit_modrm_memoffset (p, src, offset, dest);
+ orc_x86_emit_modrm_memoffset (p, offset, src, dest);
*p->codeptr++ = imm;
break;
-#if 0
case ORC_X86_INSN_TYPE_SDI_REV:
- orc_x86_emit_modrm_memoffset (p, dest, offset, src);
+ orc_x86_emit_modrm_memoffset (p, offset, dest, src);
*p->codeptr++ = imm;
break;
case ORC_X86_INSN_TYPE_SD_REV:
- orc_x86_emit_modrm_memoffset (p, dest, offset, src);
+ orc_x86_emit_modrm_memoffset (p, offset, dest, src);
break;
case ORC_X86_INSN_TYPE_SD2:
- orc_x86_emit_modrm_memoffset (p, src, offset, dest);
+ orc_x86_emit_modrm_memoffset (p, offset, src, dest);
*p->codeptr++ = opcode->code2;
break;
-#endif
default:
ORC_ASSERT(0);
break;