|
From: <sv...@va...> - 2005-11-14 02:37:53
|
Author: cerion
Date: 2005-11-14 02:37:44 +0000 (Mon, 14 Nov 2005)
New Revision: 1457
Log:
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.
Modified:
trunk/priv/guest-ppc32/toIR.c
Modified: trunk/priv/guest-ppc32/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/toIR.c 2005-11-14 00:44:47 UTC (rev 1456)
+++ trunk/priv/guest-ppc32/toIR.c 2005-11-14 02:37:44 UTC (rev 1457)
@@ -6806,13 +6806,21 @@
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_add=
r);
- DIP(" =3D> not implemented\n");
- return False;
+ putVReg( vD_addr, binop(Iop_Add32Fx4, mkexpr(vB),
+ binop(Iop_Mul32Fx4, mkexpr(vA), mkexpr(vC)=
)) );
+ return True;
=20
- case 0x2F: // vnmsubfp (Negative Multiply-Subtract FP, AV p215)
+ case 0x2F: { // vnmsubfp (Negative Multiply-Subtract FP, AV p215)
+ IRTemp zeros =3D newTemp(Ity_V128);
DIP("vnmsubfp v%d,v%d,v%d,v%d\n", vD_addr, vA_addr, vC_addr, vB_ad=
dr);
- DIP(" =3D> 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;
+ }
=20
default:
break; // Fall through...
|