]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Do fre/fres in a way which makes minimal demands on the backend.
authorJulian Seward <jseward@acm.org>
Tue, 31 Jan 2006 16:32:25 +0000 (16:32 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 31 Jan 2006 16:32:25 +0000 (16:32 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@1561

VEX/priv/guest-ppc/toIR.c

index 0014ffbb01f7d9585eb16258fe60ac998edafbe8..2bb94773441d9647bfd2c3f84f124a0a03dcb754 100644 (file)
@@ -5723,7 +5723,11 @@ static Bool dis_fp_arith ( UInt theInstr )
          }
          DIP("fres%s fr%u,fr%u\n", flag_rC ? ".":"",
              frD_addr, frB_addr);
-         assign( frD, unop(Iop_Est8FRecip, mkexpr(frB)) );
+         //assign( frD, unop(Iop_Est8FRecip, mkexpr(frB)) );
+         { IRExpr* ieee_one
+              = IRExpr_Const(IRConst_F64i(0x3ff0000000000000ULL));
+           assign( frD, roundToSgl(binop(Iop_DivF64, ieee_one, mkexpr(frB))) );
+         }
          break;
 
       case 0x19: // fmuls (Floating Multiply Single, PPC32 p414)
@@ -5833,7 +5837,11 @@ static Bool dis_fp_arith ( UInt theInstr )
          }
          DIP("fre%s fr%u,fr%u\n", flag_rC ? ".":"",
              frD_addr, frB_addr);
-         assign( frD, unop(Iop_Est8FRecip, mkexpr(frB)) );
+         //assign( frD, unop(Iop_Est8FRecip, mkexpr(frB)) );
+         { IRExpr* ieee_one
+              = IRExpr_Const(IRConst_F64i(0x3ff0000000000000ULL));
+           assign( frD, binop(Iop_DivF64, ieee_one, mkexpr(frB)) );
+         }
          break;
 
       case 0x19: // fmul (Floating Mult (Double Precision), PPC32 p413)