|
From: <sv...@va...> - 2005-09-08 17:53:09
|
Author: sewardj
Date: 2005-09-08 18:53:03 +0100 (Thu, 08 Sep 2005)
New Revision: 1373
Log:
Reinstate stwbrx.
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-08 17:33:27 UTC (rev 1372)
+++ trunk/priv/guest-ppc32/toIR.c 2005-09-08 17:53:03 UTC (rev 1373)
@@ -3317,6 +3317,23 @@
/*
Integer Load/Store Reverse Instructions
*/
+static IRExpr* /* :: Ity_I32 */ gen_byterev32 ( IRTemp t )
+{
+ vassert(typeOfIRTemp(irbb->tyenv, t) =3D=3D Ity_I32);
+ return
+ binop(Iop_Or32,
+ binop(Iop_Shl32, mkexpr(t), mkU8(24)),
+ binop(Iop_Or32,
+ binop(Iop_And32, binop(Iop_Shl32, mkexpr(t), mkU8(8)),=20
+ mkU32(0x00FF0000)),
+ binop(Iop_Or32,
+ binop(Iop_And32, binop(Iop_Shr32, mkexpr(t), mkU8(8)),
+ mkU32(0x0000FF00)),
+ binop(Iop_And32, binop(Iop_Shr32, mkexpr(t), mkU8(24)),
+ mkU32(0x000000FF) )
+ )));
+}
+
static Bool dis_int_ldst_rev ( UInt theInstr )
{
/* X-Form */
@@ -3364,24 +3381,12 @@
//zz putIReg( Rd_addr, mkexpr(Rd));
//zz break;
=20
- case 0x216: // lwbrx (Load Word Byte-Reverse Indexed, PPC32 p459)
- DIP("lwbrx r%d,r%d,r%d\n", Rd_addr, Ra_addr, Rb_addr);
- assign( w1, loadBE(Ity_I32, mkexpr(EA)) );
- assign( w2,
- binop(Iop_Or32,
- binop(Iop_Shl32, mkexpr(w1), mkU8(24)),
- binop(Iop_Or32,
- binop(Iop_And32, binop(Iop_Shl32, mkexpr(w1), mkU8(8)),=20
- mkU32(0x00FF0000)),
- binop(Iop_Or32,
- binop(Iop_And32, binop(Iop_Shr32, mkexpr(w1), mkU8(8)),
- mkU32(0x0000FF00)),
- binop(Iop_And32, binop(Iop_Shr32, mkexpr(w1), mkU8(24)),
- mkU32(0x000000FF) )
- )))
- );
- putIReg( Rd_addr, mkexpr(w2));
- break;
+ case 0x216: // lwbrx (Load Word Byte-Reverse Indexed, PPC32 p459)
+ DIP("lwbrx r%d,r%d,r%d\n", Rd_addr, Ra_addr, Rb_addr);
+ assign( w1, loadBE(Ity_I32, mkexpr(EA)) );
+ assign( w2, gen_byterev32(w1) );
+ putIReg( Rd_addr, mkexpr(w2));
+ break;
=20
//zz case 0x396: // sthbrx (Store Half Word Byte-Reverse Indexed, PPC=
32 p523)
//zz vassert(0);
@@ -3398,31 +3403,16 @@
//zz binop(Iop_Shr32, mkexpr(byte1), mkU8(8))))=
);
//zz storeBE( mkexpr(EA), getIReg(tmp16) );
//zz break;
-//zz =20
-//zz case 0x296: // stwbrx (Store Word Byte-Reverse Indexed, PPC32 p5=
31)
-//zz vassert(0);
-//zz=20
-//zz DIP("stwbrx r%d,r%d,r%d\n", Rs_addr, Ra_addr, Rb_addr);
-//zz assign( Rs, getIReg(Rs_addr) );
-//zz assign( byte0, binop(Iop_And32, mkexpr(Rs), mkU32(0x000000FF)=
) );
-//zz assign( byte1, binop(Iop_And32, mkexpr(Rs), mkU32(0x0000FF00)=
) );
-//zz assign( byte2, binop(Iop_And32, mkexpr(Rs), mkU32(0x00FF0000)=
) );
-//zz assign( byte3, binop(Iop_And32, mkexpr(Rs), mkU32(0xFF000000)=
) );
-//zz =20
-//zz assign( tmp32,
-//zz binop(Iop_Or32,
-//zz binop(Iop_Or32,
-//zz binop(Iop_Shl32, mkexpr(byte0), mkU8(24))=
,
-//zz binop(Iop_Shl32, mkexpr(byte1), mkU8(8)))=
,
-//zz binop(Iop_Or32,
-//zz binop(Iop_Shr32, mkexpr(byte2), mkU8(8)),
-//zz binop(Iop_Shr32, mkexpr(byte3), mkU8(24))=
)) );
-//zz storeBE( mkexpr(EA), mkexpr(tmp32) );
-//zz break;
=20
- default:
- vex_printf("dis_int_ldst_rev(PPC32)(opc2)\n");
- return False;
+ case 0x296: // stwbrx (Store Word Byte-Reverse Indexed, PPC32 p531=
)
+ DIP("stwbrx r%d,r%d,r%d\n", Rd_addr, Ra_addr, Rb_addr);
+ assign( w1, getIReg(Rd_addr) );
+ storeBE( mkexpr(EA), gen_byterev32(w1) );
+ break;
+ =20
+ default:
+ vex_printf("dis_int_ldst_rev(PPC32)(opc2)\n");
+ return False;
}
return True;
}
|