|
From: <sv...@va...> - 2005-07-29 11:28:42
|
Author: sewardj
Date: 2005-07-29 12:28:38 +0100 (Fri, 29 Jul 2005)
New Revision: 1304
Log:
Implement ficom{p,}{w,l}. This should fix #103594.
Modified:
trunk/priv/guest-x86/toIR.c
Modified: trunk/priv/guest-x86/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-x86/toIR.c 2005-07-27 00:22:37 UTC (rev 1303)
+++ trunk/priv/guest-x86/toIR.c 2005-07-29 11:28:38 UTC (rev 1304)
@@ -3929,6 +3929,37 @@
fop =3D Iop_MulF64;
goto do_fop_m32;
=20
+ case 2: /* FICOM m32int */
+ DIP("ficoml %s\n", dis_buf);
+ /* This forces C1 to zero, which isn't right. */
+ put_C3210(=20
+ binop( Iop_And32,
+ binop(Iop_Shl32,=20
+ binop(Iop_CmpF64,=20
+ get_ST(0),
+ unop(Iop_I32toF64,=20
+ loadLE(Ity_I32,mkexpr(addr)))=
),
+ mkU8(8)),
+ mkU32(0x4500)
+ ));
+ break;
+
+ case 3: /* FICOMP m32int */
+ DIP("ficompl %s\n", dis_buf);
+ /* This forces C1 to zero, which isn't right. */
+ put_C3210(=20
+ binop( Iop_And32,
+ binop(Iop_Shl32,=20
+ binop(Iop_CmpF64,=20
+ get_ST(0),
+ unop(Iop_I32toF64,=20
+ loadLE(Ity_I32,mkexpr(addr)))=
),
+ mkU8(8)),
+ mkU32(0x4500)
+ ));
+ fp_pop();
+ break;
+
case 4: /* FISUB m32int */ /* ST(0) -=3D m32int */
DIP("fisubl %s\n", dis_buf);
fop =3D Iop_SubF64;
@@ -4569,6 +4600,39 @@
fop =3D Iop_MulF64;
goto do_fop_m16;
=20
+ case 2: /* FICOM m16int */
+ DIP("ficomw %s\n", dis_buf);
+ /* This forces C1 to zero, which isn't right. */
+ put_C3210(=20
+ binop( Iop_And32,
+ binop(Iop_Shl32,=20
+ binop(Iop_CmpF64,=20
+ get_ST(0),
+ unop(Iop_I32toF64,=20
+ unop(Iop_16Sto32,
+ loadLE(Ity_I16,mkexpr(addr)))=
)),
+ mkU8(8)),
+ mkU32(0x4500)
+ ));
+ break;
+
+ case 3: /* FICOMP m16int */
+ DIP("ficompw %s\n", dis_buf);
+ /* This forces C1 to zero, which isn't right. */
+ put_C3210(=20
+ binop( Iop_And32,
+ binop(Iop_Shl32,=20
+ binop(Iop_CmpF64,=20
+ get_ST(0),
+ unop(Iop_I32toF64,=20
+ unop(Iop_16Sto32,
+ loadLE(Ity_I16,mkexpr(addr)))=
)),
+ mkU8(8)),
+ mkU32(0x4500)
+ ));
+ fp_pop();
+ break;
+
case 4: /* FISUB m16int */ /* ST(0) -=3D m16int */
DIP("fisubw %s\n", dis_buf);
fop =3D Iop_SubF64;
|