|
From: <sv...@va...> - 2005-08-01 13:03:39
|
Author: sewardj
Date: 2005-08-01 14:03:32 +0100 (Mon, 01 Aug 2005)
New Revision: 1307
Log:
Implement 0xA1 /* MOV Ov,eAX */ and 0xA3 /* MOV eAX,Ov */. This
should fix #109810.
Modified:
trunk/priv/guest-amd64/toIR.c
Modified: trunk/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
--- trunk/priv/guest-amd64/toIR.c 2005-07-29 21:58:51 UTC (rev 1306)
+++ trunk/priv/guest-amd64/toIR.c 2005-08-01 13:03:32 UTC (rev 1307)
@@ -11671,28 +11671,33 @@
//.. case 0xA0: /* MOV Ob,AL */
//.. sz =3D 1;
//.. /* Fall through ... */
-//.. case 0xA1: /* MOV Ov,eAX */
-//.. d32 =3D getUDisp32(delta); delta +=3D 4;
-//.. ty =3D szToITy(sz);
-//.. addr =3D newTemp(Ity_I32);
-//.. assign( addr, handleSegOverride(sorb, mkU32(d32)) );
-//.. putIReg(sz, R_EAX, loadLE(ty, mkexpr(addr)));
-//.. DIP("mov%c %s0x%x, %s\n", nameISize(sz), sorbTxt(sorb),
-//.. d32, nameIReg(sz,R_EAX));
-//.. break;
-//..=20
-//.. case 0xA2: /* MOV Ob,AL */
+ case 0xA1: /* MOV Ov,eAX */
+ if (sz !=3D 8 && sz !=3D 4 && sz !=3D 2) goto decode_failure;
+ d64 =3D getDisp64(delta);=20
+ delta +=3D 8;
+ ty =3D szToITy(sz);
+ addr =3D newTemp(Ity_I64);
+ assign( addr, handleSegOverride(pfx, mkU64(d64)) );
+ putIRegRAX(sz, loadLE( ty, mkexpr(addr) ));
+ DIP("mov%c %s0x%llx, %s\n", nameISize(sz),=20
+ sorbTxt(pfx), d64,
+ nameIRegRAX(sz));
+ break;
+
+//.. case 0xA2: /* MOV AL,Ob */
//.. sz =3D 1;
//.. /* Fall through ... */
-//.. case 0xA3: /* MOV eAX,Ov */
-//.. d32 =3D getUDisp32(delta); delta +=3D 4;
-//.. ty =3D szToITy(sz);
-//.. addr =3D newTemp(Ity_I32);
-//.. assign( addr, handleSegOverride(sorb, mkU32(d32)) );
-//.. storeLE( mkexpr(addr), getIReg(sz,R_EAX) );
-//.. DIP("mov%c %s, %s0x%x\n", nameISize(sz), nameIReg(sz,R_EAX),
-//.. sorbTxt(sorb), d32);
-//.. break;
+ case 0xA3: /* MOV eAX,Ov */
+ if (sz !=3D 8 && sz !=3D 4 && sz !=3D 2) goto decode_failure;
+ d64 =3D getDisp64(delta);=20
+ delta +=3D 8;
+ ty =3D szToITy(sz);
+ addr =3D newTemp(Ity_I64);
+ assign( addr, handleSegOverride(pfx, mkU64(d64)) );
+ storeLE( mkexpr(addr), getIRegRAX(sz) );
+ DIP("mov%c %s, %s0x%llx\n", nameISize(sz), nameIRegRAX(sz),
+ sorbTxt(pfx), d64);
+ break;
=20
/* XXXX be careful here with moves to AH/BH/CH/DH */
case 0xB0: /* MOV imm,AL */
|