]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix NEON VMUL by float scalar. Bug 277663.
authorJulian Seward <jseward@acm.org>
Tue, 19 Jul 2011 07:37:03 +0000 (07:37 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 19 Jul 2011 07:37:03 +0000 (07:37 +0000)
(Mans Rullgard, mans@mansr.com)

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

VEX/priv/guest_arm_toIR.c

index d9a3797bf262782de9dd664d40d1f271ae6edd9d..90acbda8be77a15277e2a6cf6e929ad7cebbf0ad 100644 (file)
@@ -5527,25 +5527,40 @@ Bool dis_neon_data_2reg_and_scalar ( UInt theInstr, IRTemp condT )
          }
          assign(arg_m, unop(dup, binop(get, getDRegI64(mreg), mkU8(index))));
       }
-      switch (size) {
-         case 1:
-            op = Q ? Iop_Mul16x8 : Iop_Mul16x4;
-            break;
-         case 2:
-            op = Q ? Iop_Mul32x4 : Iop_Mul32x2;
-            break;
-         case 0:
-         case 3:
-            return False;
-         default:
-            vassert(0);
+      if (INSN(8,8)) {
+         switch (size) {
+            case 2:
+               op = Q ? Iop_Mul32Fx4 : Iop_Mul32Fx2;
+               break;
+            case 0:
+            case 1:
+            case 3:
+               return False;
+            default:
+               vassert(0);
+         }
+      } else {
+         switch (size) {
+            case 1:
+               op = Q ? Iop_Mul16x8 : Iop_Mul16x4;
+               break;
+            case 2:
+               op = Q ? Iop_Mul32x4 : Iop_Mul32x2;
+               break;
+            case 0:
+            case 3:
+               return False;
+            default:
+               vassert(0);
+         }
       }
       assign(res, binop(op, mkexpr(arg_n), mkexpr(arg_m)));
       if (Q)
          putQReg(dreg, mkexpr(res), condT);
       else
          putDRegI64(dreg, mkexpr(res), condT);
-      DIP("vmul.i%u %c%u, %c%u, d%u[%u]\n", 8 << size, Q ? 'q' : 'd', dreg,
+      DIP("vmul.%c%u %c%u, %c%u, d%u[%u]\n", INSN(8,8) ? 'f' : 'i',
+          8 << size, Q ? 'q' : 'd', dreg,
           Q ? 'q' : 'd', nreg, mreg, index);
       return True;
    }