|
From: <sv...@va...> - 2011-07-19 07:41:56
|
Author: sewardj
Date: 2011-07-19 08:37:03 +0100 (Tue, 19 Jul 2011)
New Revision: 2176
Log:
Fix NEON VMUL by float scalar. Bug 277663.
(Mans Rullgard, ma...@ma...)
Modified:
trunk/priv/guest_arm_toIR.c
Modified: trunk/priv/guest_arm_toIR.c
===================================================================
--- trunk/priv/guest_arm_toIR.c 2011-07-17 14:16:41 UTC (rev 2175)
+++ trunk/priv/guest_arm_toIR.c 2011-07-19 07:37:03 UTC (rev 2176)
@@ -5527,25 +5527,40 @@
}
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;
}
|