From: Julian Seward Date: Fri, 29 Jul 2005 21:58:51 +0000 (+0000) Subject: Reinstate some FP instructions. With --tool=none we now have a X-Git-Tag: svn/VALGRIND_3_0_1^2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5cf0b047b7dc054e4be3a0c5f3933c41ac6aab1e;p=thirdparty%2Fvalgrind.git Reinstate some FP instructions. With --tool=none we now have a successful run through gsl-1.6, which is great. git-svn-id: svn://svn.valgrind.org/vex/trunk@1306 --- diff --git a/VEX/priv/guest-ppc32/toIR.c b/VEX/priv/guest-ppc32/toIR.c index ef5c1618a1..3d9aa0b6d9 100644 --- a/VEX/priv/guest-ppc32/toIR.c +++ b/VEX/priv/guest-ppc32/toIR.c @@ -1398,32 +1398,32 @@ static IRExpr* /* :: Ity_I32 */ getSPR ( PPC32SPR reg ) } } -//zz -//zz /* Write least-significant nibble of src to reg[field_idx] */ -//zz static void putReg_field ( PPC32SPR reg, IRExpr* src, UInt field_idx ) -//zz { -//zz vassert( typeOfIRExpr(irbb->tyenv,src ) == Ity_I32 ); -//zz vassert( field_idx < 8 ); -//zz vassert( reg < PPC32_SPR_MAX ); -//zz -//zz if (field_idx != 0) { -//zz src = binop(Iop_Shl32, src, mkU8(toUChar(field_idx * 4))); -//zz } -//zz putReg_masked( reg, src, (0xF << (field_idx*4)) ); -//zz } -//zz -//zz /* Write least-significant bit of src to reg[bit_idx] */ -//zz static void putReg_bit ( PPC32SPR reg, IRExpr* src, UInt bit_idx ) -//zz { -//zz vassert( typeOfIRExpr(irbb->tyenv,src ) == Ity_I32 ); -//zz vassert( bit_idx < 32 ); -//zz vassert( reg < PPC32_SPR_MAX ); -//zz -//zz if (bit_idx != 0) { -//zz src = binop(Iop_Shl32, src, mkU8(toUChar(bit_idx))); -//zz } -//zz putReg_masked( reg, src, (1<tyenv,src ) == Ity_I32 ); + vassert( field_idx < 8 ); + vassert( reg < PPC32_SPR_MAX ); + + if (field_idx != 0) { + src = binop(Iop_Shl32, src, mkU8(toUChar(field_idx * 4))); + } + putReg_masked( reg, src, (0xF << (field_idx*4)) ); +} + +/* Write least-significant bit of src to reg[bit_idx] */ +static void putReg_bit ( PPC32SPR reg, IRExpr* src, UInt bit_idx ) +{ + vassert( typeOfIRExpr(irbb->tyenv,src ) == Ity_I32 ); + vassert( bit_idx < 32 ); + vassert( reg < PPC32_SPR_MAX ); + + if (bit_idx != 0) { + src = binop(Iop_Shl32, src, mkU8(toUChar(bit_idx))); + } + putReg_masked( reg, src, (1<> 21) & 0x1F); /* theInstr[21:25] */ -//zz UInt b11to20 = (theInstr >> 11) & 0x3FF; /* theInstr[11:20] */ -//zz -//zz if (b11to20 != 0) { -//zz vex_printf("dis_fp_scr(PPC32)(instr,mtfsb0)\n"); -//zz return False; -//zz } -//zz DIP("mtfsb0%s crb%d\n", flag_Rc ? "." : "", crbD); -//zz putReg_bit( PPC32_SPR_FPSCR, mkU32(0), 31-crbD ); -//zz break; -//zz } -//zz -//zz case 0x086: { // mtfsfi (Move to FPSCR Field Immediate, PPC32 p481) -//zz UChar crfD = toUChar((theInstr >> 23) & 0x7); /* theInstr[23:25] */ -//zz UChar b16to22 = toUChar((theInstr >> 16) & 0x7F); /* theInstr[16:22] */ -//zz UChar IMM = toUChar((theInstr >> 12) & 0xF); /* theInstr[11:15] */ -//zz UChar b11 = toUChar((theInstr >> 11) & 0x1); /* theInstr[11] */ -//zz -//zz if (b16to22 != 0 || b11 != 0) { -//zz vex_printf("dis_fp_scr(PPC32)(instr,mtfsfi)\n"); -//zz return False; -//zz } -//zz DIP("mtfsfi%s crf%d,%d\n", flag_Rc ? "." : "", crfD, IMM); -//zz putReg_field( PPC32_SPR_FPSCR, mkU32(IMM), 7-crfD ); -//zz break; -//zz } + + case 0x046: { // mtfsb0 (Move to FPSCR Bit 0, PPC32 p478) + // Bit crbD of the FPSCR is cleared. + UChar crbD = toUChar((theInstr >> 21) & 0x1F); /* theInstr[21:25] */ + UInt b11to20 = (theInstr >> 11) & 0x3FF; /* theInstr[11:20] */ + + if (b11to20 != 0) { + vex_printf("dis_fp_scr(PPC32)(instr,mtfsb0)\n"); + return False; + } + DIP("mtfsb0%s crb%d\n", flag_Rc ? "." : "", crbD); + putReg_bit( PPC32_SPR_FPSCR, mkU32(0), 31-crbD ); + break; + } + + case 0x086: { // mtfsfi (Move to FPSCR Field Immediate, PPC32 p481) + UChar crfD = toUChar((theInstr >> 23) & 0x7); /* theInstr[23:25] */ + UChar b16to22 = toUChar((theInstr >> 16) & 0x7F); /* theInstr[16:22] */ + UChar IMM = toUChar((theInstr >> 12) & 0xF); /* theInstr[11:15] */ + UChar b11 = toUChar((theInstr >> 11) & 0x1); /* theInstr[11] */ + + if (b16to22 != 0 || b11 != 0) { + vex_printf("dis_fp_scr(PPC32)(instr,mtfsfi)\n"); + return False; + } + DIP("mtfsfi%s crf%d,%d\n", flag_Rc ? "." : "", crfD, IMM); + putReg_field( PPC32_SPR_FPSCR, mkU32(IMM), 7-crfD ); + break; + } case 0x247: { // mffs (Move from FPSCR, PPC32 p468) UChar frD_addr = toUChar((theInstr >> 21) & 0x1F); /* theInstr[21:25] */ @@ -6625,7 +6625,6 @@ DisResult disInstr_PPC32_WRK ( irbb->jumpkind = Ijk_NoDecode; dres.whatNext = Dis_StopHere; dres.len = 0; -vassert(0); return dres; } /* switch (opc) for the main (primary) opcode switch. */