|
From: <sv...@va...> - 2005-09-09 19:45:10
|
Author: sewardj
Date: 2005-09-09 20:45:02 +0100 (Fri, 09 Sep 2005)
New Revision: 1382
Log:
Fix mcrxr.
Modified:
trunk/priv/guest-ppc32/toIR.c
Modified: trunk/priv/guest-ppc32/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-ppc32/toIR.c 2005-09-09 16:38:19 UTC (rev 1381)
+++ trunk/priv/guest-ppc32/toIR.c 2005-09-09 19:45:02 UTC (rev 1382)
@@ -3418,45 +3418,55 @@
=20
switch (opc2) {
/* X-Form */
- case 0x200: // mcrxr (Move to Condition Register from XER, PPC32 p466=
)
+ case 0x200: { // mcrxr (Move to Condition Register from XER, PPC32 p4=
66)
+ IRTemp xer_0to3 =3D newTemp(Ity_I8);
if (b21to22 !=3D 0 || b11to20 !=3D 0) {
vex_printf("dis_proc_ctl(PPC32)(mcrxr,b21to22|b11to20)\n");
return False;
}
DIP("mcrxr crf%d\n", crfD);
- =20
- // CR[7-crfD] =3D XER[28-31]
- putCR321( crfD, unop( Iop_32to8,=20
- binop(
- Iop_Or32,
- binop(
- Iop_Or32,
- binop( Iop_Shl32,=20
- binop( Iop_And32,=20
- unop( Iop_8Uto32,=20
- IRExpr_Get( OFFB_XER_SO, Ity_I8=
)),=20
- mkU32(1)),=20
- mkU8(31)),
- binop( Iop_Shl32,=20
- binop( Iop_And32,=20
- unop( Iop_8Uto32,=20
- IRExpr_Get( OFFB_XER_OV, Ity_I8=
)),=20
- mkU32(1)),=20
- mkU8(30))
- ),
- binop( Iop_Shl32,=20
- binop( Iop_And32,=20
- unop( Iop_8Uto32,=20
- IRExpr_Get( OFFB_XER_CA, Ity_I8 ))=
,=20
- mkU32(1)),=20
- mkU8(29))
- ) ) );
=20
- // Clear XER[28 - 31]
+ /* Compute XER[0-3] (the top 4 bits of XER) into the bottom
+ 4 bits of xer_0to3. */
+ assign(=20
+ xer_0to3,
+ unop(Iop_32to8,
+ binop(
+ Iop_Or32,
+ binop(
+ Iop_Or32,
+ binop( Iop_Shl32,=20
+ binop( Iop_And32,=20
+ unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_SO, Ity_I8 =
)),=20
+ mkU32(1)),=20
+ mkU8(31 -28)),
+ binop( Iop_Shl32,=20
+ binop( Iop_And32,=20
+ unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_OV, Ity_I8 =
)),=20
+ mkU32(1)),=20
+ mkU8(30 -28))
+ ),
+ binop( Iop_Shl32,=20
+ binop( Iop_And32,=20
+ unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_CA, Ity_I8 )),=
=20
+ mkU32(1)),=20
+ mkU8(29 -28))
+ )
+ )
+ );
+
+ putCR321( crfD, binop(Iop_And8, mkexpr(xer_0to3), mkU8(7<<1)) );
+ putCR0 ( crfD, binop(Iop_And8, mkexpr(xer_0to3), mkU8(1)) );
+
+ // Clear XER[0-3]
stmt( IRStmt_Put( OFFB_XER_SO, mkU8(0) ) );
stmt( IRStmt_Put( OFFB_XER_OV, mkU8(0) ) );
stmt( IRStmt_Put( OFFB_XER_CA, mkU8(0) ) );
break;
+ }
=20
case 0x013: // mfcr (Move from Condition Register, PPC32 p467)
if (b11to20 !=3D 0) {
|