From: Julian Seward Date: Mon, 3 Oct 2005 02:07:08 +0000 (+0000) Subject: Fix various adc/sbb instruction variants. X-Git-Tag: svn/VALGRIND_3_1_1^2~85 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3a129fb8803ccb9b6942cccd91fed2e7f6e7f13f;p=thirdparty%2Fvalgrind.git Fix various adc/sbb instruction variants. git-svn-id: svn://svn.valgrind.org/vex/trunk@1406 --- diff --git a/VEX/priv/guest-x86/toIR.c b/VEX/priv/guest-x86/toIR.c index e6ec7851fd..e966fca5b9 100644 --- a/VEX/priv/guest-x86/toIR.c +++ b/VEX/priv/guest-x86/toIR.c @@ -1975,6 +1975,10 @@ UInt dis_op_imm_A ( Int size, if (op8 == Iop_Add8 && carrying) { helper_ADC( size, dst1, dst0, src ); } + else + if (op8 == Iop_Sub8 && carrying) { + helper_SBB( size, dst1, dst0, src ); + } else vpanic("dis_op_imm_A(x86,guest)"); @@ -10810,13 +10814,13 @@ DisResult disInstr_X86_WRK ( delta = dis_op_imm_A( sz, True, Iop_Add8, True, delta, "adc" ); break; -//-- case 0x1C: /* SBB Ib, AL */ -//-- delta = dis_op_imm_A( 1, SBB, True, delta, "sbb" ); -//-- break; -//-- case 0x1D: /* SBB Iv, eAX */ -//-- delta = dis_op_imm_A( sz, SBB, True, delta, "sbb" ); -//-- break; -//-- + case 0x1C: /* SBB Ib, AL */ + delta = dis_op_imm_A( 1, True, Iop_Sub8, True, delta, "sbb" ); + break; + case 0x1D: /* SBB Iv, eAX */ + delta = dis_op_imm_A( sz, True, Iop_Sub8, True, delta, "sbb" ); + break; + case 0x24: /* AND Ib, AL */ delta = dis_op_imm_A( 1, False, Iop_And8, True, delta, "and" ); break; @@ -10867,17 +10871,17 @@ DisResult disInstr_X86_WRK ( case 0x0B: /* OR Ev,Gv */ delta = dis_op2_E_G ( sorb, False, Iop_Or8, True, sz, delta, "or" ); break; -//-- -//-- case 0x12: /* ADC Eb,Gb */ -//-- delta = dis_op2_E_G ( sorb, True, ADC, True, 1, delta, "adc" ); -//-- break; + + case 0x12: /* ADC Eb,Gb */ + delta = dis_op2_E_G ( sorb, True, Iop_Add8, True, 1, delta, "adc" ); + break; case 0x13: /* ADC Ev,Gv */ delta = dis_op2_E_G ( sorb, True, Iop_Add8, True, sz, delta, "adc" ); break; -//-- case 0x1A: /* SBB Eb,Gb */ -//-- delta = dis_op2_E_G ( sorb, True, SBB, True, 1, delta, "sbb" ); -//-- break; + case 0x1A: /* SBB Eb,Gb */ + delta = dis_op2_E_G ( sorb, True, Iop_Sub8, True, 1, delta, "sbb" ); + break; case 0x1B: /* SBB Ev,Gv */ delta = dis_op2_E_G ( sorb, True, Iop_Sub8, True, sz, delta, "sbb" ); break;