From: Julian Seward Date: Tue, 26 Dec 2006 02:06:09 +0000 (+0000) Subject: Merge r1676 (amd64 ret imm16) X-Git-Tag: svn/VALGRIND_3_2_3^2~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b0b1de69a3e7cb2312c004c2e9fba9e3a784d6e;p=thirdparty%2Fvalgrind.git Merge r1676 (amd64 ret imm16) git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_2_BRANCH@1694 --- diff --git a/VEX/priv/guest-amd64/toIR.c b/VEX/priv/guest-amd64/toIR.c index 74fc124f2d..50eaac302b 100644 --- a/VEX/priv/guest-amd64/toIR.c +++ b/VEX/priv/guest-amd64/toIR.c @@ -514,13 +514,13 @@ static UChar getUChar ( Long delta ) return v; } -//.. static UInt getUDisp16 ( Long delta ) -//.. { -//.. UInt v = guest_code[delta+1]; v <<= 8; -//.. v |= guest_code[delta+0]; -//.. return v & 0xFFFF; -//.. } -//.. +static UInt getUDisp16 ( Long delta ) +{ + UInt v = guest_code[delta+1]; v <<= 8; + v |= guest_code[delta+0]; + return v & 0xFFFF; +} + //.. static UInt getUDisp ( Int size, Long delta ) //.. { //.. switch (size) { @@ -733,6 +733,12 @@ static Bool have66orF2orF3 ( Prefix pfx ) return toBool( ! haveNo66noF2noF3(pfx) ); } +/* 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 @@ DisResult disInstr_AMD64_WRK ( /* ------------------------ Control flow --------------- */ -//.. case 0xC2: /* RET imm16 */ -//.. d32 = getUDisp16(delta); -//.. delta += 2; -//.. dis_ret(d32); -//.. whatNext = Dis_StopHere; -//.. DIP("ret %d\n", d32); -//.. break; + case 0xC2: /* RET imm16 */ + if (have66orF2orF3(pfx)) goto decode_failure; + d64 = getUDisp16(delta); + delta += 2; + dis_ret(vmi, d64); + dres.whatNext = 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 = Dis_StopHere;