|
From: <sv...@va...> - 2006-12-26 02:06:10
|
Author: sewardj
Date: 2006-12-26 02:06:09 +0000 (Tue, 26 Dec 2006)
New Revision: 1694
Log:
Merge r1676 (amd64 ret imm16)
Modified:
branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c
Modified: branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c 2006-12-26 02:04:04 U=
TC (rev 1693)
+++ branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c 2006-12-26 02:06:09 U=
TC (rev 1694)
@@ -514,13 +514,13 @@
return v;
}
=20
-//.. static UInt getUDisp16 ( Long delta )
-//.. {
-//.. UInt v =3D guest_code[delta+1]; v <<=3D 8;
-//.. v |=3D guest_code[delta+0];
-//.. return v & 0xFFFF;
-//.. }
-//..=20
+static UInt getUDisp16 ( Long delta )
+{
+ UInt v =3D guest_code[delta+1]; v <<=3D 8;
+ v |=3D guest_code[delta+0];
+ return v & 0xFFFF;
+}
+
//.. static UInt getUDisp ( Int size, Long delta )
//.. {
//.. switch (size) {
@@ -733,6 +733,12 @@
return toBool( ! haveNo66noF2noF3(pfx) );
}
=20
+/* Return True iff pfx has 66 or F2 set */
+static Bool have66orF2 ( Prefix pfx )
+{
+ return toBool((pfx & (PFX_66|PFX_F2)) > 0);
+}
+
/* Clear all the segment-override bits in a prefix. */
static Prefix clearSegBits ( Prefix p )
{
@@ -12160,15 +12166,17 @@
=20
/* ------------------------ Control flow --------------- */
=20
-//.. case 0xC2: /* RET imm16 */
-//.. d32 =3D getUDisp16(delta);=20
-//.. delta +=3D 2;
-//.. dis_ret(d32);
-//.. whatNext =3D Dis_StopHere;
-//.. DIP("ret %d\n", d32);
-//.. break;
+ case 0xC2: /* RET imm16 */
+ if (have66orF2orF3(pfx)) goto decode_failure;
+ d64 =3D getUDisp16(delta);=20
+ delta +=3D 2;
+ dis_ret(vmi, d64);
+ dres.whatNext =3D Dis_StopHere;
+ DIP("ret %lld\n", d64);
+ break;
+
case 0xC3: /* RET */
- if (haveF2(pfx)) goto decode_failure;
+ if (have66orF2(pfx)) goto decode_failure;
/* F3 is acceptable on AMD. */
dis_ret(0);
dres.whatNext =3D Dis_StopHere;
|