|
From: <sv...@va...> - 2005-09-09 09:35:35
|
Author: sewardj
Date: 2005-09-09 10:35:29 +0100 (Fri, 09 Sep 2005)
New Revision: 1376
Log:
Implement stswi/stswx.
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 08:33:03 UTC (rev 1375)
+++ trunk/priv/guest-ppc32/toIR.c 2005-09-09 09:35:29 UTC (rev 1376)
@@ -2547,6 +2547,7 @@
IRExpr* e_nbytes =3D mkexpr(tNBytes);
IRExpr* e_EA =3D mkexpr(EA);
=20
+ vassert(rD >=3D 0 && rD < 32);
rD--; if (rD < 0) rD =3D 31;
=20
for (i =3D 0; i < maxBytes; i++) {
@@ -2577,7 +2578,42 @@
}
}
=20
+static=20
+void generate_stsw_sequence ( IRTemp tNBytes, // # bytes, :: Ity_I32
+ IRTemp EA, // EA
+ Int rS, // first src register
+ Int maxBytes, // 32 or 128
+ Addr32 NIA ) // where next?
+{
+ Int i, shift =3D 24;
+ IRExpr* e_nbytes =3D mkexpr(tNBytes);
+ IRExpr* e_EA =3D mkexpr(EA);
=20
+ vassert(rS >=3D 0 && rS < 32);
+ rS--; if (rS < 0) rS =3D 31;
+
+ for (i =3D 0; i < maxBytes; i++) {
+ /* if (nBytes < (i+1)) goto NIA; */
+ stmt( IRStmt_Exit( binop(Iop_CmpLT32U, e_nbytes, mkU32(i+1)),
+ Ijk_Boring,=20
+ IRConst_U32(NIA)) );
+ /* check for crossing into a new src register. */
+ if ((i % 4) =3D=3D 0) {
+ rS++; if (rS =3D=3D 32) rS =3D 0;
+ shift =3D 24;
+ }
+ /* *(EA+i) =3D 32to8(rS >> shift) */
+ vassert(shift =3D=3D 0 || shift =3D=3D 8 || shift =3D=3D 16 || shi=
ft =3D=3D 24);
+ storeBE(
+ binop(Iop_Add32, e_EA, mkU32(i)),
+ unop(Iop_32to8,
+ binop(Iop_Shr32, getIReg(rS), mkU8(shift)))
+ );
+ shift -=3D 8;
+ }
+}
+
+
static Bool dis_int_ldst_str ( UInt theInstr, /*OUT*/Bool* stopHere )
{
/* X-Form */
@@ -2620,7 +2656,6 @@
/* Rd =3D Mem[EA]; (Rd+1)%32 =3D Mem[EA+4] */
putIReg( Rd_addr, =20
loadBE(Ity_I32, mkexpr(t_EA)) );
-
putIReg( (Rd_addr+1) % 32,=20
loadBE(Ity_I32, binop(Iop_Add32, mkexpr(t_EA), mkU32(4=
))) );
} else {
@@ -2651,92 +2686,37 @@
*stopHere =3D True;
return True;
=20
-//zz case 0x2D5: // stswi (Store String Word Immediate, PPC32 p528)
-//zz=20
-//zz if (NumBytes =3D=3D 8) {
-//zz /* Special case hack */
-//zz /* Mem[EA] =3D Rd; Mem[EA+4] =3D (Rd+1)%32 */
-//zz DIP("stswi r%d,r%d,%d\n", Rs_addr, Ra_addr, NumBytes);
-//zz storeBE( mkexpr(b_EA),=20
-//zz getIReg(Rd_addr) );
-//zz storeBE( binop(Iop_Add32, mkexpr(b_EA), mkU32(4)),=20
-//zz getIReg((Rd_addr+1) % 32) );
-//zz return True;
-//zz }
-//zz=20
-//zz /* else too difficult */
-//zz return False;
-//zz=20
-//zz vassert(0);
-//zz=20
-//zz DIP("stswi r%d,r%d,%d\n", Rs_addr, Ra_addr, NumBytes);
-//zz if (Ra_addr =3D=3D 0) {
-//zz assign( EA, mkU32(0) );
-//zz } else {
-//zz assign( EA, mkexpr(b_EA) );
-//zz }
-//zz =20
-//zz n_byte =3D NumBytes;
-//zz if (n_byte =3D=3D 0) { n_byte =3D 32; }
-//zz reg_idx =3D Rs_addr - 1;
-//zz bit_idx =3D 0;
-//zz =20
-//zz for (; n_byte>0; n_byte--) {
-//zz if (bit_idx =3D=3D 0) {
-//zz reg_idx++;
-//zz if (reg_idx=3D=3D32) reg_idx =3D 0;
-//zz }
-//zz irx_byte =3D unop(Iop_32to8,
-//zz binop(Iop_Shr32,
-//zz getIReg(reg_idx),=20
-//zz mkU8(toUChar(24 - bit_idx))));
-//zz storeBE( binop(Iop_Add32, mkexpr(EA), mkU32(EA_offset)),
-//zz irx_byte );
-//zz =20
-//zz bit_idx +=3D 8;
-//zz if (bit_idx =3D=3D 32) { bit_idx =3D 0; }
-//zz EA_offset++;
-//zz }
-//zz break;
-//zz=20
-//zz case 0x295: // stswx (Store String Word Indexed, PPC32 p529)
-//zz vassert(0);
-//zz=20
-//zz DIP("stswx r%d,r%d,r%d\n", Rs_addr, Ra_addr, Rb_addr);
-//zz return False;
-//zz #if 0
-//zz // CAB: Might something like this work ?
-//zz // won't produce very nice code (ir_ctr will get _rather_ long...),=
but hey.
-//zz // or perhaps arrays of IRTemp...
-//zz assign( NumBytes, AND(get(xer_bc), 0x1F) );
-//zz IRExpr* irx_ea;
-//zz IRExpr* irx_orig_byte;
-//zz IRExpr* irx_tostore;
-//zz IRExpr* ir_ctr =3D mkU8(0);
-//zz Uint EA_offset =3D 0;
-//zz UInt start =3D Rs_addr;
-//zz UInt reg_idx;
-//zz UInt i;
-//zz for (i=3D0; i<128; i++) {
-//zz bit_idx =3D (i % 4) * 8;
-//zz reg_idx =3D (i / 4) + start;
-//zz reg_idx =3D reg_idx % 32;
-//zz word =3D getIReg(reg_idx);
-//zz byte =3D get_byte(word, bit_idx);
-//zz =20
-//zz irx_ea =3D (EA + EA_offset);
-//zz irx_orig_byte =3D loadBE(Ity_I8, irx_ea);
-//zz irx_tostore =3D IRExpr_Mux0X( (ir_ctr <=3D NumBytes),
-//zz irx_orig_byte,
-//zz mkexpr(byte0) );
-//zz storeBE( irx_ea, irx_tostore );
-//zz =20
-//zz ir_ctr =3D binop(Iop_And8, ir_ctr, mkU8(1));
-//zz EA_offset++;
-//zz }
-//zz break;
-//zz #endif
+ case 0x2D5: // stswi (Store String Word Immediate, PPC32 p528)
+ DIP("stswi r%d,r%d,%d\n", Rs_addr, Ra_addr, NumBytes);
+ assign( t_EA, ea_rA_or_zero(Ra_addr) );
+ if (NumBytes =3D=3D 8) {
+ /* Special case hack */
+ /* Mem[EA] =3D Rd; Mem[EA+4] =3D (Rd+1)%32 */
+ storeBE( mkexpr(t_EA),=20
+ getIReg(Rd_addr) );
+ storeBE( binop(Iop_Add32, mkexpr(t_EA), mkU32(4)),=20
+ getIReg((Rd_addr+1) % 32) );
+ } else {
+ t_nbytes =3D newTemp(Ity_I32);
+ assign( t_nbytes, mkU32(NumBytes=3D=3D0 ? 32 : NumBytes) );
+ generate_stsw_sequence( t_nbytes, t_EA, Rd_addr,=20
+ 32, guest_CIA_curr_instr+4 );
+ *stopHere =3D True;
+ }
+ return True;
=20
+
+ case 0x295: // stswx (Store String Word Indexed, PPC32 p529)
+ DIP("stswx r%d,r%d,r%d\n", Rs_addr, Ra_addr, Rb_addr);
+ t_nbytes =3D newTemp(Ity_I32);
+ assign( t_EA, ea_standard(Ra_addr,Rb_addr) );
+ assign( t_nbytes, unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_BC, Ity_I8 )));
+ generate_stsw_sequence( t_nbytes, t_EA, Rs_addr,=20
+ 128, guest_CIA_curr_instr+4 );
+ *stopHere =3D True;
+ return True;
+
default:
vex_printf("dis_int_ldst_str(PPC32)(opc2)\n");
return False;
|