From: Julian Seward Date: Mon, 6 Mar 2006 13:42:01 +0000 (+0000) Subject: Merge r1583 (fix for 8-bit xadd G,E) X-Git-Tag: svn/VALGRIND_3_1_1^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8bb598735a02a10a6b55ba5e73ffc82980e2c28e;p=thirdparty%2Fvalgrind.git Merge r1583 (fix for 8-bit xadd G,E) git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_1_BRANCH@1584 --- diff --git a/VEX/priv/guest-x86/toIR.c b/VEX/priv/guest-x86/toIR.c index 9be59295b8..183e7ce424 100644 --- a/VEX/priv/guest-x86/toIR.c +++ b/VEX/priv/guest-x86/toIR.c @@ -6202,7 +6202,7 @@ UInt dis_cmov_E_G ( UChar sorb, static -UInt dis_xadd_G_E ( UChar sorb, Int sz, Int delta0 ) +UInt dis_xadd_G_E ( UChar sorb, Int sz, Int delta0, Bool* decodeOK ) { Int len; UChar rm = getIByte(delta0); @@ -6217,7 +6217,9 @@ UInt dis_xadd_G_E ( UChar sorb, Int sz, Int delta0 ) IRTemp tmpt1 = newTemp(ty); if (epartIsReg(rm)) { - unimplemented("x86 xadd instruction with register operand"); + *decodeOK = False; + return delta0; + /* Currently we don't handle xadd_G_E with register operand. */ #if 0 uInstr2(cb, GET, sz, ArchReg, eregOfRM(rm), TempReg, tmpd); uInstr2(cb, GET, sz, ArchReg, gregOfRM(rm), TempReg, tmpt); @@ -6239,6 +6241,7 @@ UInt dis_xadd_G_E ( UChar sorb, Int sz, Int delta0 ) putIReg(sz, gregOfRM(rm), mkexpr(tmpd)); DIP("xadd%c %s, %s\n", nameISize(sz), nameIReg(sz,gregOfRM(rm)), dis_buf); + *decodeOK = True; return len+delta0; } } @@ -12359,12 +12362,18 @@ DisResult disInstr_X86_WRK ( /* =-=-=-=-=-=-=-=-=- XADD -=-=-=-=-=-=-=-=-=-= */ -//-- case 0xC0: /* XADD Gb,Eb */ -//-- eip = dis_xadd_G_E ( cb, sorb, 1, eip ); -//-- break; - case 0xC1: /* XADD Gv,Ev */ - delta = dis_xadd_G_E ( sorb, sz, delta ); + case 0xC0: { /* XADD Gb,Eb */ + Bool decodeOK; + delta = dis_xadd_G_E ( sorb, 1, delta, &decodeOK ); + if (!decodeOK) goto decode_failure; + break; + } + case 0xC1: { /* XADD Gv,Ev */ + Bool decodeOK; + delta = dis_xadd_G_E ( sorb, sz, delta, &decodeOK ); + if (!decodeOK) goto decode_failure; break; + } /* =-=-=-=-=-=-=-=-=- MMXery =-=-=-=-=-=-=-=-=-=-= */