|
From: <sv...@va...> - 2006-05-12 20:15:36
|
Author: sewardj
Date: 2006-05-12 21:15:33 +0100 (Fri, 12 May 2006)
New Revision: 1613
Log:
Implement CLC/STC/CMC. Fixes #125651.
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 2006-05-12 17:47:21 UTC (rev 1612)
+++ trunk/priv/guest-amd64/toIR.c 2006-05-12 20:15:33 UTC (rev 1613)
@@ -12825,30 +12825,39 @@
DIP("std\n");
break;
=20
-//.. //-- case 0xF8: /* CLC */
-//.. //-- uInstr0(cb, CALLM_S, 0);
-//.. //-- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_CLC));
-//.. //-- uFlagsRWU(cb, FlagsEmpty, FlagC, FlagsOSZAP);
-//.. //-- uInstr0(cb, CALLM_E, 0);
-//.. //-- DIP("clc\n");
-//.. //-- break;
-//.. //--=20
-//.. //-- case 0xF9: /* STC */
-//.. //-- uInstr0(cb, CALLM_S, 0);
-//.. //-- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_STC));
-//.. //-- uFlagsRWU(cb, FlagsEmpty, FlagC, FlagsOSZAP);
-//.. //-- uInstr0(cb, CALLM_E, 0);
-//.. //-- DIP("stc\n");
-//.. //-- break;
-//.. //--=20
-//.. //-- case 0xF5: /* CMC */
-//.. //-- uInstr0(cb, CALLM_S, 0);
-//.. //-- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_CMC));
-//.. //-- uFlagsRWU(cb, FlagC, FlagC, FlagsOSZAP);
-//.. //-- uInstr0(cb, CALLM_E, 0);
-//.. //-- DIP("cmc\n");
-//.. //-- break;
-//..=20
+ case 0xF8: /* CLC */
+ case 0xF9: /* STC */
+ case 0xF5: /* CMC */
+ t0 =3D newTemp(Ity_I64);
+ t1 =3D newTemp(Ity_I64);
+ assign( t0, mk_amd64g_calculate_rflags_all() );
+ switch (opc) {
+ case 0xF8:=20
+ assign( t1, binop(Iop_And64, mkexpr(t0),=20
+ mkU64(~AMD64G_CC_MASK_C)));
+ DIP("clc\n");
+ break;
+ case 0xF9:=20
+ assign( t1, binop(Iop_Or64, mkexpr(t0),=20
+ mkU64(AMD64G_CC_MASK_C)));
+ DIP("stc\n");
+ break;
+ case 0xF5:=20
+ assign( t1, binop(Iop_Xor64, mkexpr(t0),=20
+ mkU64(AMD64G_CC_MASK_C)));
+ DIP("cmc\n");
+ break;
+ default:=20
+ vpanic("disInstr(x64)(clc/stc/cmc)");
+ }
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU64(AMD64G_CC_OP_COPY) ));
+ stmt( IRStmt_Put( OFFB_CC_DEP2, mkU64(0) ));
+ stmt( IRStmt_Put( OFFB_CC_DEP1, mkexpr(t1) ));
+ /* Set NDEP even though it isn't used. This makes redundant-PUT
+ elimination of previous stores to this field work better. */
+ stmt( IRStmt_Put( OFFB_CC_NDEP, mkU64(0) ));
+ break;
+
//.. /* REPNE prefix insn */
//.. case 0xF2: {=20
//.. Addr32 eip_orig =3D guest_eip_bbstart + delta - 1;
|