|
From: <sv...@va...> - 2005-07-08 21:55:55
|
Author: sewardj
Date: 2005-07-08 22:55:22 +0100 (Fri, 08 Jul 2005)
New Revision: 1270
Log:
Implement 8-byte-transfer cases for lwsi and stswi.
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-07-08 13:34:47 UTC (rev 1269)
+++ trunk/priv/guest-ppc32/toIR.c 2005-07-08 21:55:22 UTC (rev 1270)
@@ -2124,6 +2124,21 @@
=20
switch (opc2) {
case 0x255: // lswi (Load String Word Immediate, PPC32 p455)
+
+ if (NumBytes =3D=3D 8) {
+ /* Special case hack */
+ /* Rd =3D Mem[EA]; (Rd+1)%32 =3D Mem[EA+4] */
+ DIP("lswi r%d,r%d,%d\n", Rd_addr, Ra_addr, NumBytes);
+ putIReg( Rd_addr, =20
+ loadBE(Ity_I32, mkexpr(b_EA)) );
+
+ putIReg( (Rd_addr+1) % 32,=20
+ loadBE(Ity_I32, binop(Iop_Add32, mkexpr(b_EA), mkU32(4=
))) );
+ return True;
+ }
+
+ /* else too difficult */
+ return False;
vassert(0);
=20
n_regs =3D (NumBytes / 4) + (NumBytes%4 =3D=3D 0 ? 0:1); // ceil(n=
b/4)
@@ -2166,7 +2181,8 @@
if (bit_idx =3D=3D 32) { bit_idx =3D 0; }
EA_offset++;
}
- =20
+ break; =20
+
case 0x215: // lswx (Load String Word Indexed, PPC32 p456)
vassert(0);
=20
@@ -2174,6 +2190,21 @@
return False;
=20
case 0x2D5: // stswi (Store String Word Immediate, PPC32 p528)
+
+ if (NumBytes =3D=3D 8) {
+ /* Special case hack */
+ /* Mem[EA] =3D Rd; Mem[EA+4] =3D (Rd+1)%32 */
+ DIP("stswi r%d,r%d,%d\n", Rs_addr, Ra_addr, NumBytes);
+ storeBE( mkexpr(b_EA),=20
+ getIReg(Rd_addr) );
+ storeBE( binop(Iop_Add32, mkexpr(b_EA), mkU32(4)),=20
+ getIReg((Rd_addr+1) % 32) );
+ return True;
+ }
+
+ /* else too difficult */
+ return False;
+
vassert(0);
=20
DIP("stswi r%d,r%d,%d\n", Rs_addr, Ra_addr, NumBytes);
|