|
From: <sv...@va...> - 2005-12-14 22:01:07
|
Author: cerion
Date: 2005-12-14 22:00:53 +0000 (Wed, 14 Dec 2005)
New Revision: 1492
Log:
Enable fsqrt
Document store fp single-precision problem
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-12-14 10:22:25 UTC (rev 1491)
+++ trunk/priv/guest-ppc32/toIR.c 2005-12-14 22:00:53 UTC (rev 1492)
@@ -5584,6 +5584,10 @@
case 0x34: // stfs (Store Float Single, PPC32 p518)
DIP("stfs fr%u,%d(r%u)\n", frS_addr, simm16, rA_addr);
assign( EA, ea_rAor0_simm(rA_addr, simm16) );
+ /* TODO
+ This implementation ends up rounding twice, losing accuracy.
+ - first via F64toF32, and then by the backend fp store (stfs)
+ */
storeBE( mkexpr(EA),
binop(Iop_F64toF32, get_roundingmode(), mkexpr(frS)) );
break;
@@ -5595,6 +5599,7 @@
}
DIP("stfsu fr%u,%d(r%u)\n", frS_addr, simm16, rA_addr);
assign( EA, ea_rA_simm(rA_addr, simm16) );
+ /* This implementation loses accuracy - see note for stfs */
storeBE( mkexpr(EA),
binop(Iop_F64toF32, get_roundingmode(), mkexpr(frS)) );
putIReg( rA_addr, mkexpr(EA) );
@@ -5627,6 +5632,7 @@
case 0x297: // stfsx (Store Float Single Indexed, PPC32 p521)
DIP("stfsx fr%u,r%u,r%u\n", frS_addr, rA_addr, rB_addr);
assign( EA, ea_rAor0_idxd(rA_addr, rB_addr) );
+ /* This implementation loses accuracy - see note for stfs */
storeBE( mkexpr(EA),
binop(Iop_F64toF32, get_roundingmode(), mkexpr(frS)) )=
;
break;
@@ -5638,6 +5644,7 @@
}
DIP("stfsux fr%u,r%u,r%u\n", frS_addr, rA_addr, rB_addr);
assign( EA, ea_rA_idxd(rA_addr, rB_addr) );
+ /* This implementation loses accuracy - see note for stfs */
storeBE( mkexpr(EA),
binop(Iop_F64toF32, get_roundingmode(), mkexpr(frS)) )=
;
putIReg( rA_addr, mkexpr(EA) );
@@ -5810,15 +5817,15 @@
assign( frD, binop( Iop_AddF64, mkexpr(frA), mkexpr(frB) ) );
break;
=20
-//zz case 0x16: // fsqrt (Floating SqRt (Double-Precision), PPC32 =
p427)
-//zz if (frA_addr !=3D 0 || frC_addr !=3D 0) {
-//zz vex_printf("dis_fp_arith(PPC32)(instr,fsqrt)\n");
-//zz return False;
-//zz }
-//zz DIP("fsqrt%s fr%u,fr%u\n", flag_rC ? "." : "",
-//zz frD_addr, frB_addr);
-//zz assign( frD, unop( Iop_SqrtF64, mkexpr(frB) ) );
-//zz break;
+ case 0x16: // fsqrt (Floating SqRt (Double-Precision), PPC32 p427)
+ if (frA_addr !=3D 0 || frC_addr !=3D 0) {
+ vex_printf("dis_fp_arith(PPC32)(instr,fsqrt)\n");
+ return False;
+ }
+ DIP("fsqrt%s fr%u,fr%u\n", flag_rC ? "." : "",
+ frD_addr, frB_addr);
+ assign( frD, unop( Iop_SqrtF64, mkexpr(frB) ) );
+ break;
=20
case 0x17: { // fsel (Floating Select, PPC32 p426)
IRTemp cc =3D newTemp(Ity_I32);
|