From: Julian Seward Date: Thu, 15 Nov 2007 23:30:16 +0000 (+0000) Subject: Handle the "alternative" (non-binutils) encoding of 'adc' and tidy up X-Git-Tag: svn/VALGRIND_3_3_1^2~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ebdbbf8d9a47b02afb1f457d672dfb43b61ba10;p=thirdparty%2Fvalgrind.git Handle the "alternative" (non-binutils) encoding of 'adc' and tidy up some other op-G-E / op-E-G decodings. This fixes a bug which was reported on valgrind-users@lists.sourceforge.net on 11 Aug 2007 ("LibVEX called failure_exit() with 3.3.0svn-r6769 with Linux on AMD64") I don't think it ever was formally filed as a bug report. git-svn-id: svn://svn.valgrind.org/vex/trunk@1794 --- diff --git a/VEX/priv/guest-amd64/toIR.c b/VEX/priv/guest-amd64/toIR.c index 67a2b321fc..d0def4c760 100644 --- a/VEX/priv/guest-amd64/toIR.c +++ b/VEX/priv/guest-amd64/toIR.c @@ -2509,7 +2509,6 @@ ULong dis_op2_E_G ( Prefix pfx, assign( src, getIRegE(size,pfx,rm) ); if (addSubCarry && op8 == Iop_Add8) { - vassert(0); /* awaiting test case */ helper_ADC( size, dst1, dst0, src ); putIRegG(size, pfx, rm, mkexpr(dst1)); } else @@ -13059,6 +13058,7 @@ DisResult disInstr_AMD64_WRK ( break; case 0x14: /* ADC Ib, AL */ + if (haveF2orF3(pfx)) goto decode_failure; delta = dis_op_imm_A( 1, True, Iop_Add8, True, delta, "adc" ); break; //.. //-- case 0x15: /* ADC Iv, eAX */ @@ -13137,11 +13137,13 @@ DisResult disInstr_AMD64_WRK ( if (haveF2orF3(pfx)) goto decode_failure; delta = dis_op2_E_G ( pfx, 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 */ + if (haveF2orF3(pfx)) goto decode_failure; + delta = dis_op2_E_G ( pfx, True, Iop_Add8, True, 1, delta, "adc" ); + break; case 0x13: /* ADC Ev,Gv */ + if (haveF2orF3(pfx)) goto decode_failure; delta = dis_op2_E_G ( pfx, True, Iop_Add8, True, sz, delta, "adc" ); break; @@ -13149,6 +13151,7 @@ DisResult disInstr_AMD64_WRK ( //.. //-- delta = dis_op2_E_G ( sorb, True, SBB, True, 1, delta, "sbb" ); //.. //-- break; case 0x1B: /* SBB Ev,Gv */ + if (haveF2orF3(pfx)) goto decode_failure; delta = dis_op2_E_G ( pfx, True, Iop_Sub8, True, sz, delta, "sbb" ); break;