|
From: <sv...@va...> - 2006-01-02 13:36:16
|
Author: cerion
Date: 2006-01-02 13:35:51 +0000 (Mon, 02 Jan 2006)
New Revision: 1525
Log:
ppc64 fixes:
- branch: compare full 64bits of CTR reg to zero.
- stwcx.: store only lo32 bits of r_src to EA in 64bit mode.
Modified:
trunk/priv/guest-ppc/toIR.c
Modified: trunk/priv/guest-ppc/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-ppc/toIR.c 2006-01-02 12:28:17 UTC (rev 1524)
+++ trunk/priv/guest-ppc/toIR.c 2006-01-02 13:35:51 UTC (rev 1525)
@@ -4049,18 +4049,20 @@
{
IRType ty =3D mode64 ? Ity_I64 : Ity_I32;
IRTemp ok =3D newTemp(Ity_I32);
- IRExpr* ctr_lo32;
=20
if ((BO >> 2) & 1) { // independent of ctr
assign( ok, mkU32(0xFFFFFFFF) );
} else {
- ctr_lo32 =3D mkSzNarrow32(ty, getGST( PPC_GST_CTR ));
if ((BO >> 1) & 1) { // ctr =3D=3D 0 ?
assign( ok, unop( Iop_1Sto32,
- binop( Iop_CmpEQ32, ctr_lo32, mkU32(0))) );
+ binop( mkSzOp(ty, Iop_CmpEQ8),
+ getGST( PPC_GST_CTR ),
+ mkSzImm(ty,0))) );
} else { // ctr !=3D 0 ?
assign( ok, unop( Iop_1Sto32,
- binop( Iop_CmpNE32, ctr_lo32, mkU32(0))) );
+ binop( mkSzOp(ty, Iop_CmpNE8),
+ getGST( PPC_GST_CTR ),
+ mkSzImm(ty,0))) );
}
}
return mkexpr(ok);
@@ -4503,8 +4505,8 @@
If resaddr !=3D lwarx_resaddr, CR0[EQ] is undefined, and
whether rS is stored is dependent on that value. */
=20
- /* Success? Do the store */
- storeBE( mkexpr(EA), mkexpr(rS) );
+ /* Success? Do the (32bit) store */
+ storeBE( mkexpr(EA), mkSzNarrow32(ty, mkexpr(rS)) );
=20
// Set CR0[LT GT EQ S0] =3D 0b001 || XER[SO]
putCR321(0, mkU8(1<<1));
@@ -4532,7 +4534,7 @@
=20
sync =3D sync 0
lwsync =3D sync 1
- */
+ */
if ((b11to25 !=3D 0/*sync*/ && b11to25 !=3D 1024/*lwsync*/) || =
b0 !=3D 0) {
vex_printf("dis_memsync(ppc)(sync/lwsync,b11to25|b0)\n");
return False;
|