|
From: <sv...@va...> - 2010-05-10 20:51:29
|
Author: sewardj
Date: 2010-05-10 21:51:22 +0100 (Mon, 10 May 2010)
New Revision: 1981
Log:
Implement XADD reg,reg (Nicolas Sauzede, nic...@st...).
Fixes #195662.
Modified:
trunk/priv/guest_amd64_toIR.c
trunk/priv/guest_x86_toIR.c
Modified: trunk/priv/guest_amd64_toIR.c
===================================================================
--- trunk/priv/guest_amd64_toIR.c 2010-05-10 20:08:12 UTC (rev 1980)
+++ trunk/priv/guest_amd64_toIR.c 2010-05-10 20:51:22 UTC (rev 1981)
@@ -7720,7 +7720,8 @@
/* 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 @@
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 */
Modified: trunk/priv/guest_x86_toIR.c
===================================================================
--- trunk/priv/guest_x86_toIR.c 2010-05-10 20:08:12 UTC (rev 1980)
+++ trunk/priv/guest_x86_toIR.c 2010-05-10 20:51:22 UTC (rev 1981)
@@ -6615,7 +6615,8 @@
/* 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 @@
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 */
|