From 59a7574deb71989fa25283308bc0723f148acac1 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Tue, 19 Jul 2011 07:37:03 +0000 Subject: [PATCH] Fix NEON VMUL by float scalar. Bug 277663. (Mans Rullgard, mans@mansr.com) git-svn-id: svn://svn.valgrind.org/vex/trunk@2176 --- VEX/priv/guest_arm_toIR.c | 41 ++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/VEX/priv/guest_arm_toIR.c b/VEX/priv/guest_arm_toIR.c index d9a3797bf2..90acbda8be 100644 --- a/VEX/priv/guest_arm_toIR.c +++ b/VEX/priv/guest_arm_toIR.c @@ -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; } -- 2.47.2