From: Julian Seward Date: Mon, 10 May 2010 20:51:22 +0000 (+0000) Subject: Implement XADD reg,reg (Nicolas Sauzede, nicolas.sauzede@st.com). X-Git-Tag: svn/VALGRIND_3_6_1^2~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d42670ad147496c7a1aaaea371c62cac6ef375d9;p=thirdparty%2Fvalgrind.git Implement XADD reg,reg (Nicolas Sauzede, nicolas.sauzede@st.com). Fixes #195662. git-svn-id: svn://svn.valgrind.org/vex/trunk@1981 --- diff --git a/VEX/priv/guest_amd64_toIR.c b/VEX/priv/guest_amd64_toIR.c index 0e5a68f00c..5fcdf3854c 100644 --- a/VEX/priv/guest_amd64_toIR.c +++ b/VEX/priv/guest_amd64_toIR.c @@ -7720,7 +7720,8 @@ ULong dis_xadd_G_E ( /*OUT*/Bool* decode_ok, /* There are 3 cases to consider: - reg-reg: currently unhandled + reg-reg: ignore any lock prefix, + generate 'naive' (non-atomic) sequence reg-mem, not locked: ignore any lock prefix, generate 'naive' (non-atomic) sequence @@ -7730,9 +7731,18 @@ ULong dis_xadd_G_E ( /*OUT*/Bool* decode_ok, if (epartIsReg(rm)) { /* case 1 */ - *decode_ok = False; - return delta0; - /* Currently we don't handle xadd_G_E with register operand. */ + assign( tmpd, getIRegE(sz, pfx, rm) ); + assign( tmpt0, getIRegG(sz, pfx, rm) ); + assign( tmpt1, binop(mkSizedOp(ty,Iop_Add8), + mkexpr(tmpd), mkexpr(tmpt0)) ); + setFlags_DEP1_DEP2( Iop_Add8, tmpd, tmpt0, ty ); + putIRegG(sz, pfx, rm, mkexpr(tmpd)); + putIRegE(sz, pfx, rm, mkexpr(tmpt1)); + DIP("xadd%c %s, %s\n", + nameISize(sz), nameIRegG(sz,pfx,rm), + nameIRegE(sz,pfx,rm)); + *decode_ok = True; + return 1+delta0; } else if (!epartIsReg(rm) && !(pfx & PFX_LOCK)) { /* case 2 */ diff --git a/VEX/priv/guest_x86_toIR.c b/VEX/priv/guest_x86_toIR.c index f962f000c9..7abfc6cff3 100644 --- a/VEX/priv/guest_x86_toIR.c +++ b/VEX/priv/guest_x86_toIR.c @@ -6615,7 +6615,8 @@ UInt dis_xadd_G_E ( UChar sorb, Bool locked, Int sz, Int delta0, /* There are 3 cases to consider: - reg-reg: currently unhandled + reg-reg: ignore any lock prefix, + generate 'naive' (non-atomic) sequence reg-mem, not locked: ignore any lock prefix, generate 'naive' (non-atomic) sequence @@ -6625,9 +6626,18 @@ UInt dis_xadd_G_E ( UChar sorb, Bool locked, Int sz, Int delta0, if (epartIsReg(rm)) { /* case 1 */ - *decodeOK = False; - return delta0; - /* Currently we don't handle xadd_G_E with register operand. */ + assign( tmpd, getIReg(sz, eregOfRM(rm))); + assign( tmpt0, getIReg(sz, gregOfRM(rm)) ); + assign( tmpt1, binop(mkSizedOp(ty,Iop_Add8), + mkexpr(tmpd), mkexpr(tmpt0)) ); + setFlags_DEP1_DEP2( Iop_Add8, tmpd, tmpt0, ty ); + putIReg(sz, eregOfRM(rm), mkexpr(tmpt1)); + putIReg(sz, gregOfRM(rm), mkexpr(tmpd)); + DIP("xadd%c %s, %s\n", + nameISize(sz), nameIReg(sz,gregOfRM(rm)), + nameIReg(sz,eregOfRM(rm))); + *decodeOK = True; + return 1+delta0; } else if (!epartIsReg(rm) && !locked) { /* case 2 */