From c7fac261126f8b5a0293978b8819fbee4d3aacb1 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Thu, 4 Nov 2010 12:59:09 -0700 Subject: [PATCH] x86: more sysinsn conversion --- orc/orcx86.c | 46 ++++++++++------------------------------------ orc/orcx86.h | 1 + orc/orcx86insn.c | 30 ++++++++++++++++++++++++++++++ orc/orcx86insn.h | 8 ++++++++ 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/orc/orcx86.c b/orc/orcx86.c index 85d83bb..69c88e6 100644 --- a/orc/orcx86.c +++ b/orc/orcx86.c @@ -269,19 +269,12 @@ orc_x86_emit_mov_reg_memoffset (OrcCompiler *compiler, int size, int reg1, int o { switch (size) { case 1: - ORC_ASM_CODE(compiler," movb %%%s, %d(%%%s)\n", orc_x86_get_regname_8(reg1), offset, - orc_x86_get_regname_ptr(compiler, reg2)); - orc_x86_emit_rex(compiler, size, reg1, 0, reg2); - *compiler->codeptr++ = 0x88; - orc_x86_emit_modrm_memoffset_old (compiler, reg1, offset, reg2); - return; + orc_sse_emit_sysinsn_reg_memoffset (compiler, ORC_X86_movb_r_rm, + reg1, offset, reg2); + break; case 2: - ORC_ASM_CODE(compiler," movw %%%s, %d(%%%s)\n", orc_x86_get_regname_16(reg1), offset, - orc_x86_get_regname_ptr(compiler, reg2)); - *compiler->codeptr++ = 0x66; - orc_x86_emit_rex(compiler, size, reg1, 0, reg2); - *compiler->codeptr++ = 0x89; - orc_x86_emit_modrm_memoffset_old (compiler, reg1, offset, reg2); + orc_sse_emit_sysinsn_reg_memoffset (compiler, ORC_X86_movw_r_rm, + reg1, offset, reg2); break; case 4: orc_sse_emit_sysinsn_reg_memoffset (compiler, ORC_X86_movl_r_rm, @@ -320,22 +313,10 @@ orc_x86_emit_sar_imm_reg (OrcCompiler *compiler, int size, int value, int reg) { if (value == 0) return; - if (size == 2) { - ORC_ASM_CODE(compiler," sarw $%d, %%%s\n", value, orc_x86_get_regname_16(reg)); - } else if (size == 4) { - ORC_ASM_CODE(compiler," sarl $%d, %%%s\n", value, orc_x86_get_regname(reg)); - } else { - ORC_ASM_CODE(compiler," sar $%d, %%%s\n", value, orc_x86_get_regname_64(reg)); - } - - orc_x86_emit_rex(compiler, size, reg, 0, 0); if (value == 1) { - *compiler->codeptr++ = 0xd1; - orc_x86_emit_modrm_reg (compiler, reg, 7); + orc_sse_emit_sysinsn_imm_reg (compiler, ORC_X86_sar, value, reg); } else { - *compiler->codeptr++ = 0xc1; - orc_x86_emit_modrm_reg (compiler, reg, 7); - *compiler->codeptr++ = value; + orc_sse_emit_sysinsn_imm_reg (compiler, ORC_X86_sar_imm, value, reg); } } @@ -497,20 +478,13 @@ void orc_x86_emit_dec_memoffset (OrcCompiler *compiler, int size, int offset, int reg) { - if (size == 2) { - ORC_ASM_CODE(compiler," decw %d(%%%s)\n", offset, orc_x86_get_regname_ptr(compiler, reg)); - *compiler->codeptr++ = 0x66; - } else if (size == 4) { + if (size == 4) { orc_sse_emit_sysinsn_imm_memoffset (compiler, ORC_X86_add_imm8_rm, -1, offset, reg); - return; } else { - ORC_ASM_CODE(compiler," dec %d(%%%s)\n", offset, orc_x86_get_regname_ptr(compiler, reg)); + orc_sse_emit_sysinsn_load_memoffset (compiler, ORC_X86_dec, + 0, offset, reg, -1); } - - orc_x86_emit_rex(compiler, size, 0, 0, reg); - *compiler->codeptr++ = 0xff; - orc_x86_emit_modrm_memoffset_old (compiler, 1, offset, reg); } void orc_x86_emit_ret (OrcCompiler *compiler) diff --git a/orc/orcx86.h b/orc/orcx86.h index 4eb73d8..a822663 100644 --- a/orc/orcx86.h +++ b/orc/orcx86.h @@ -42,6 +42,7 @@ enum { const char * orc_x86_get_regname(int i); int orc_x86_get_regnum(int i); +const char * orc_x86_get_regname_8(int i); const char * orc_x86_get_regname_16(int i); const char * orc_x86_get_regname_64(int i); const char * orc_x86_get_regname_ptr(OrcCompiler *compiler, int i); diff --git a/orc/orcx86insn.c b/orc/orcx86insn.c index 759c526..994baec 100644 --- a/orc/orcx86insn.c +++ b/orc/orcx86insn.c @@ -230,6 +230,8 @@ static const OrcSysOpcode orc_x86_opcodes[] = { { "movl", ORC_X86_INSN_TYPE_rm_r, 0, 0x8b }, { "mov", ORC_X86_INSN_TYPE_rm_r, 0, 0x8b }, { "mov", ORC_X86_INSN_TYPE_mov_imm32, 0, 0xb8 }, + { "movb", ORC_X86_INSN_TYPE_r_rm_byte, 0, 0x88 }, + { "movw", ORC_X86_INSN_TYPE_r_rm_word, 0, 0x6689 }, { "movl", ORC_X86_INSN_TYPE_r_rm, 0, 0x89 }, { "mov", ORC_X86_INSN_TYPE_r_rm, 0, 0x89 }, { "test", ORC_X86_INSN_TYPE_rm_r, 0, 0x85 }, @@ -238,6 +240,10 @@ static const OrcSysOpcode orc_x86_opcodes[] = { { "leaq", ORC_X86_INSN_TYPE_rm_r, 0, 0x8d }, { "imul", ORC_X86_INSN_TYPE_rm_r, 0, 0x0faf }, { "imul", ORC_X86_INSN_TYPE_MEM, 0, 0xf7, 5 }, + { "incl", ORC_X86_INSN_TYPE_MEM, 0, 0xff, 0 }, + { "decl", ORC_X86_INSN_TYPE_MEM, 0, 0xff, 1 }, + { "sar", ORC_X86_INSN_TYPE_imm8_rm, 0, 0xc1, 7 }, + { "sar", ORC_X86_INSN_TYPE_MEM, 0, 0xd1, 7 }, }; @@ -574,6 +580,15 @@ orc_sse_emit_sysinsn_imm_reg (OrcCompiler *p, int index, int imm, int dest) orc_x86_get_regname_64(dest)); } break; + case ORC_X86_INSN_TYPE_MEM: + if (size == 4) { + ORC_ASM_CODE(p," %s %%%s\n", opcode->name, + orc_x86_get_regname(dest)); + } else { + ORC_ASM_CODE(p," %s %%%s\n", opcode->name, + orc_x86_get_regname_64(dest)); + } + break; default: ORC_ASSERT(0); break; @@ -602,6 +617,9 @@ orc_sse_emit_sysinsn_imm_reg (OrcCompiler *p, int index, int imm, int dest) *p->codeptr++ = (imm>>16)&0xff; *p->codeptr++ = (imm>>24)&0xff; break; + case ORC_X86_INSN_TYPE_MEM: + orc_x86_emit_modrm_reg (p, dest, opcode->code2); + break; default: ORC_ASSERT(0); break; @@ -672,6 +690,16 @@ orc_sse_emit_sysinsn_reg_memoffset (OrcCompiler *p, int index, int src, orc_x86_get_regname_64(dest)); } break; + case ORC_X86_INSN_TYPE_r_rm_byte: + ORC_ASM_CODE(p," %s %%%s, %d(%%%s)\n", opcode->name, + orc_x86_get_regname_8(src), offset, + orc_x86_get_regname(dest)); + break; + case ORC_X86_INSN_TYPE_r_rm_word: + ORC_ASM_CODE(p," %s %%%s, %d(%%%s)\n", opcode->name, + orc_x86_get_regname_16(src), offset, + orc_x86_get_regname(dest)); + break; default: ORC_ASSERT(0); break; @@ -681,6 +709,8 @@ orc_sse_emit_sysinsn_reg_memoffset (OrcCompiler *p, int index, int src, switch (opcode->type) { case ORC_X86_INSN_TYPE_r_rm: + case ORC_X86_INSN_TYPE_r_rm_byte: + case ORC_X86_INSN_TYPE_r_rm_word: orc_x86_emit_modrm_memoffset (p, offset, dest, src); break; default: diff --git a/orc/orcx86insn.h b/orc/orcx86insn.h index 5a15993..66e59ed 100644 --- a/orc/orcx86insn.h +++ b/orc/orcx86insn.h @@ -20,6 +20,8 @@ enum { ORC_X86_INSN_TYPE_NONE, ORC_X86_INSN_TYPE_STACK, ORC_X86_INSN_TYPE_mov_imm32, + ORC_X86_INSN_TYPE_r_rm_byte, + ORC_X86_INSN_TYPE_r_rm_word, }; enum { @@ -244,6 +246,8 @@ enum { 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, @@ -252,6 +256,10 @@ enum { 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, }; -- 2.7.4