]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
More av insns: vmaddfp, vnmsubfp
authorCerion Armour-Brown <cerion@valgrind.org>
Mon, 14 Nov 2005 02:37:44 +0000 (02:37 +0000)
committerCerion Armour-Brown <cerion@valgrind.org>
Mon, 14 Nov 2005 02:37:44 +0000 (02:37 +0000)
Rough 'n ready IR used - results will be rounded along the way, not just at the end of the calculations, giving some error.

git-svn-id: svn://svn.valgrind.org/vex/trunk@1457

VEX/priv/guest-ppc32/toIR.c

index cc3e7846cdc947f0d0ef4c60ad9f45d804f068f8..70fbab0eb159acb3317a1354137d88fa82fcb96c 100644 (file)
@@ -6806,13 +6806,21 @@ static Bool dis_av_fp_arith ( UInt theInstr )
    switch (opc2) {
    case 0x2E: // vmaddfp (Multiply Add FP, AV p177)
       DIP("vmaddfp v%d,v%d,v%d,v%d\n", vD_addr, vA_addr, vC_addr, vB_addr);
-      DIP(" => not implemented\n");
-      return False;
+      putVReg( vD_addr, binop(Iop_Add32Fx4, mkexpr(vB),
+                              binop(Iop_Mul32Fx4, mkexpr(vA), mkexpr(vC))) );
+      return True;
 
-   case 0x2F: // vnmsubfp (Negative Multiply-Subtract FP, AV p215)
+   case 0x2F: { // vnmsubfp (Negative Multiply-Subtract FP, AV p215)
+      IRTemp zeros = newTemp(Ity_V128);
       DIP("vnmsubfp v%d,v%d,v%d,v%d\n", vD_addr, vA_addr, vC_addr, vB_addr);
-      DIP(" => not implemented\n");
-      return False;
+      assign( zeros, unop(Iop_Dup32x4, mkU32(0)) );
+      putVReg( vD_addr,
+               binop(Iop_Sub32Fx4, mkexpr(zeros),
+                     binop(Iop_Sub32Fx4,
+                           binop(Iop_Mul32Fx4, mkexpr(vA), mkexpr(vC)),
+                           mkexpr(vB))) );
+      return True;
+   }
 
    default:
      break; // Fall through...