From 0030f31e89c25ab16f7e51d63fdfd2886360060e Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Wed, 5 Oct 2005 17:58:32 +0000 Subject: [PATCH] Handle FUCOM %st(0),%st(?). git-svn-id: svn://svn.valgrind.org/vex/trunk@1415 --- VEX/priv/guest-amd64/toIR.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/VEX/priv/guest-amd64/toIR.c b/VEX/priv/guest-amd64/toIR.c index 30f79d42f3..ca735f1780 100644 --- a/VEX/priv/guest-amd64/toIR.c +++ b/VEX/priv/guest-amd64/toIR.c @@ -5404,19 +5404,20 @@ ULong dis_FPU ( /*OUT*/Bool* decode_ok, fp_pop(); break; -//.. case 0xE0 ... 0xE7: /* FUCOM %st(0),%st(?) */ -//.. r_dst = (UInt)modrm - 0xE0; -//.. DIP("fucom %%st(0),%%st(%d)\n", r_dst); -//.. /* This forces C1 to zero, which isn't right. */ -//.. put_C3210( -//.. binop( Iop_And32, -//.. binop(Iop_Shl32, -//.. binop(Iop_CmpF64, get_ST(0), get_ST(r_dst)), -//.. mkU8(8)), -//.. mkU32(0x4500) -//.. )); -//.. break; -//.. + case 0xE0 ... 0xE7: /* FUCOM %st(0),%st(?) */ + r_dst = (UInt)modrm - 0xE0; + DIP("fucom %%st(0),%%st(%d)\n", r_dst); + /* This forces C1 to zero, which isn't right. */ + put_C3210( + unop(Iop_32Uto64, + binop( Iop_And32, + binop(Iop_Shl32, + binop(Iop_CmpF64, get_ST(0), get_ST(r_dst)), + mkU8(8)), + mkU32(0x4500) + ))); + break; + //.. case 0xE8 ... 0xEF: /* FUCOMP %st(0),%st(?) */ //.. r_dst = (UInt)modrm - 0xE8; //.. DIP("fucomp %%st(0),%%st(%d)\n", r_dst); -- 2.47.3