summaryrefslogtreecommitdiff
path: root/src/arch/x86/processor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-08-16 23:04:49 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-08-16 23:04:49 (GMT)
commit9ed927a6b6405633a82f378438c533fd0112f16d (patch)
tree69875ffb288bf0dcd57a3b7cee546eca85115914 /src/arch/x86/processor.c
parentdb70af80e01199bd2329f0363b9f7769dee1a783 (diff)
Supported several extra x86 instructions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@181 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/x86/processor.c')
-rw-r--r--src/arch/x86/processor.c63
1 files changed, 49 insertions, 14 deletions
diff --git a/src/arch/x86/processor.c b/src/arch/x86/processor.c
index 54008d7..7048890 100644
--- a/src/arch/x86/processor.c
+++ b/src/arch/x86/processor.c
@@ -182,6 +182,8 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor
static const x86_read_instr decodings[XOP_COUNT] = {
+ /* Instructions avec opcode sur un octet */
+
[XOP_ADD_RM8_R8] = x86_read_instr_add_rm8_r8,
[XOP_ADD_RM1632_R1632] = x86_read_instr_add_rm1632_r1632,
[XOP_ADD_R8_RM8] = x86_read_instr_add_r8_rm8,
@@ -193,26 +195,15 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor
[XOP_OR_R8_RM8] = x86_read_instr_or_r8_rm8,
[XOP_OR_R1632_RM1632] = x86_read_instr_or_r1632_rm1632,
[XOP_OR_AL_IMM8] = x86_read_instr_or_al_imm8,
- [XOP_JE_REL1632] = x86_read_instr_je_rel1632,
- [XOP_JNE_REL1632] = x86_read_instr_jne_rel1632,
- [XOP_JBE_REL1632] = x86_read_instr_jbe_rel1632,
- [XOP_JA_REL1632] = x86_read_instr_ja_rel1632,
- [XOP_JGE_REL1632] = x86_read_instr_jge_rel1632,
- [XOP_JLE_REL1632] = x86_read_instr_jle_rel1632,
- [XOP_JG_REL1632] = x86_read_instr_jg_rel1632,
- [XOP_SETE_RM8] = x86_read_instr_sete_rm8,
- [XOP_SETNE_RM8] = x86_read_instr_setne_rm8,
- [XOP_SETL_RM8] = x86_read_instr_setl_rm8,
- [XOP_MOVZX_R1632_RM8] = x86_read_instr_movzx_r1632_rm8,
- [XOP_MOVSX_R1632_RM8] = x86_read_instr_movsx_r1632_rm8,
- [XOP_MOVSX_R1632_RM1632] = x86_read_instr_movsx_r1632_rm1632,
[XOP_ADC_RM8_R8] = x86_read_instr_adc_rm8_r8,
+ [XOP_SBB_RM1632_R1632] = x86_read_instr_sbb_rm1632_r1632,
[XOP_AND_RM8_R8] = x86_read_instr_and_rm8_r8,
[XOP_AND_RM1632_R1632] = x86_read_instr_and_rm1632_r1632,
[XOP_AND_AL_IMM8] = x86_read_instr_and_al_imm8,
[XOP_AND_E_AX_IMM1632] = x86_read_instr_and_e_ax_imm1632,
[XOP_SUB_RM1632_R1632] = x86_read_instr_sub_rm1632_r1632,
[XOP_SUB_R8_RM8] = x86_read_instr_sub_r8_rm8,
+ [XOP_SUB_R1632_RM1632] = x86_read_instr_sub_r1632_rm1632,
[XOP_SUB_AL_IMM8] = x86_read_instr_sub_al_imm8,
[XOP_SUB_E_AX_IMM1632] = x86_read_instr_sub_e_ax_imm1632,
[XOP_XOR_RM8_R8] = x86_read_instr_xor_rm8_r8,
@@ -221,8 +212,11 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor
[XOP_XOR_R1632_RM1632] = x86_read_instr_xor_r1632_rm1632,
[XOP_XOR_AL_IMM8] = x86_read_instr_xor_al_imm8,
[XOP_XOR_E_AX_IMM1632] = x86_read_instr_xor_e_ax_imm1632,
+ [XOP_CMP_RM8_R8] = x86_read_instr_cmp_rm8_r8,
[XOP_CMP_RM1632_R1632] = x86_read_instr_cmp_rm1632_r1632,
[XOP_CMP_R1632_RM1632] = x86_read_instr_cmp_r1632_rm1632,
+ [XOP_CMP_AL_IMM8] = x86_read_instr_cmp_al_imm8,
+ [XOP_CMP_E_AX_IMM1632] = x86_read_instr_cmp_e_ax_imm1632,
[XOP_INC_E_AX] = x86_read_instr_inc_r1632,
[XOP_INC_E_CX] = x86_read_instr_inc_r1632,
[XOP_INC_E_DX] = x86_read_instr_inc_r1632,
@@ -320,6 +314,7 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor
[XOP_MOV_MOFFS8_AL] = x86_read_instr_mov_moffs8_al,
[XOP_MOV_MOFFS1632_E_AX] = x86_read_instr_mov_moffs1632_e_ax,
[XOP_MOVS_M1632_M1632] = x86_read_instr_movs_m1632_m1632,
+ [XOP_CMPS_M8_M8] = x86_read_instr_cmps_m8_m8,
[XOP_TEST_AL_IMM8] = x86_read_instr_test_al_imm8,
[XOP_TEST_E_AX_IMM1632] = x86_read_instr_test_e_ax_imm1632,
[XOP_STOS_M1632_E_AX] = x86_read_instr_stos_m1632_e_ax,
@@ -373,7 +368,45 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor
[XOP_DEC_RM1632] = x86_read_instr_dec_rm1632,
[XOP_CALL_RM1632] = x86_read_instr_call_rm1632,
[XOP_JMP_RM1632] = x86_read_instr_jmp_rm1632,
- [XOP_PUSH_RM1632] = x86_read_instr_push_rm1632
+ [XOP_PUSH_RM1632] = x86_read_instr_push_rm1632,
+
+ /* Instructions avec opcode sur deux octets */
+
+ [XOP_JO_REL1632] = x86_read_instr_jo_rel1632,
+ [XOP_JNO_REL1632] = x86_read_instr_jno_rel1632,
+ [XOP_JB_REL1632] = x86_read_instr_jb_rel1632,
+ [XOP_JNB_REL1632] = x86_read_instr_jnb_rel1632,
+ [XOP_JE_REL1632] = x86_read_instr_je_rel1632,
+ [XOP_JNE_REL1632] = x86_read_instr_jne_rel1632,
+ [XOP_JNA_REL1632] = x86_read_instr_jna_rel1632,
+ [XOP_JA_REL1632] = x86_read_instr_ja_rel1632,
+ [XOP_JS_REL1632] = x86_read_instr_js_rel1632,
+ [XOP_JNS_REL1632] = x86_read_instr_jns_rel1632,
+ [XOP_JP_REL1632] = x86_read_instr_jp_rel1632,
+ [XOP_JNP_REL1632] = x86_read_instr_jnp_rel1632,
+ [XOP_JL_REL1632] = x86_read_instr_jl_rel1632,
+ [XOP_JNL_REL1632] = x86_read_instr_jnl_rel1632,
+ [XOP_JNG_REL1632] = x86_read_instr_jng_rel1632,
+ [XOP_JG_REL1632] = x86_read_instr_jg_rel1632,
+ [XOP_SETO_RM8] = x86_read_instr_seto_rm8,
+ [XOP_SETNO_RM8] = x86_read_instr_setno_rm8,
+ [XOP_SETB_RM8] = x86_read_instr_setb_rm8,
+ [XOP_SETNB_RM8] = x86_read_instr_setnb_rm8,
+ [XOP_SETE_RM8] = x86_read_instr_sete_rm8,
+ [XOP_SETNE_RM8] = x86_read_instr_setne_rm8,
+ [XOP_SETNA_RM8] = x86_read_instr_setna_rm8,
+ [XOP_SETA_RM8] = x86_read_instr_seta_rm8,
+ [XOP_SETS_RM8] = x86_read_instr_sets_rm8,
+ [XOP_SETNS_RM8] = x86_read_instr_setns_rm8,
+ [XOP_SETP_RM8] = x86_read_instr_setp_rm8,
+ [XOP_SETNP_RM8] = x86_read_instr_setnp_rm8,
+ [XOP_SETL_RM8] = x86_read_instr_setl_rm8,
+ [XOP_SETNL_RM8] = x86_read_instr_setnl_rm8,
+ [XOP_SETNG_RM8] = x86_read_instr_setng_rm8,
+ [XOP_SETG_RM8] = x86_read_instr_setg_rm8,
+ [XOP_MOVZX_R1632_RM8] = x86_read_instr_movzx_r1632_rm8,
+ [XOP_MOVSX_R1632_RM8] = x86_read_instr_movsx_r1632_rm8,
+ [XOP_MOVSX_R1632_RM1632] = x86_read_instr_movsx_r1632_rm1632
};
@@ -385,6 +418,8 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor
addr++;
}
if (prefix & XPX_OPERAND_SIZE_OVERRIDE) (*pos)++;
+ if (prefix & XPX_REPEAT_STR_OPERATION_F2) (*pos)++;
+ if (prefix & XPX_REPEAT_STR_OPERATION_F3) (*pos)++;
if (id != XOP_COUNT && !care) (*pos)++;