From 7925e4424ff0f6a2f2b778ab3f71e081d0b4effd Mon Sep 17 00:00:00 2001 From: Cerion Armour-Brown Date: Mon, 14 Nov 2005 02:37:44 +0000 Subject: [PATCH] More av insns: vmaddfp, vnmsubfp 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 | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/VEX/priv/guest-ppc32/toIR.c b/VEX/priv/guest-ppc32/toIR.c index cc3e7846cd..70fbab0eb1 100644 --- a/VEX/priv/guest-ppc32/toIR.c +++ b/VEX/priv/guest-ppc32/toIR.c @@ -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... -- 2.47.3