|
From: <sv...@va...> - 2007-11-15 23:30:17
|
Author: sewardj
Date: 2007-11-15 23:30:16 +0000 (Thu, 15 Nov 2007)
New Revision: 1794
Log:
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 val...@li... 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.
Modified:
trunk/priv/guest-amd64/toIR.c
Modified: trunk/priv/guest-amd64/toIR.c
===================================================================
--- trunk/priv/guest-amd64/toIR.c 2007-11-09 21:15:04 UTC (rev 1793)
+++ trunk/priv/guest-amd64/toIR.c 2007-11-15 23:30:16 UTC (rev 1794)
@@ -2509,7 +2509,6 @@
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 @@
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 @@
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 @@
//.. //-- 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;
|