From: Julian Seward Date: Tue, 7 Mar 2006 00:22:02 +0000 (+0000) Subject: Implement fnstsw. X-Git-Tag: svn/VALGRIND_3_2_3^2~81 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=618cb7cf923a295346997030f4ad069d13215249;p=thirdparty%2Fvalgrind.git Implement fnstsw. git-svn-id: svn://svn.valgrind.org/vex/trunk@1591 --- diff --git a/VEX/priv/guest-amd64/toIR.c b/VEX/priv/guest-amd64/toIR.c index 55f6417915..534592d7cb 100644 --- a/VEX/priv/guest-amd64/toIR.c +++ b/VEX/priv/guest-amd64/toIR.c @@ -4206,6 +4206,22 @@ static void clear_C2 ( void ) put_C3210( binop(Iop_And64, get_C3210(), mkU64(~AMD64G_FC_MASK_C2)) ); } +/* Invent a plausible-looking FPU status word value: + ((ftop & 7) << 11) | (c3210 & 0x4700) + */ +static IRExpr* get_FPU_sw ( void ) +{ + return + unop(Iop_32to16, + binop(Iop_Or32, + binop(Iop_Shl32, + binop(Iop_And32, get_ftop(), mkU32(7)), + mkU8(11)), + binop(Iop_And32, unop(Iop_64to32, get_C3210()), + mkU32(0x4700)) + )); +} + /* ------------------------------------------------------- */ /* Given all that stack-mangling junk, we can now go ahead @@ -5502,6 +5518,14 @@ ULong dis_FPU ( /*OUT*/Bool* decode_ok, //.. break; //.. } + case 7: { /* FNSTSW m16 */ + IRExpr* sw = get_FPU_sw(); + vassert(typeOfIRExpr(irbb->tyenv, sw) == Ity_I16); + storeLE( mkexpr(addr), sw ); + DIP("fnstsw %s\n", dis_buf); + break; + } + default: vex_printf("unhandled opc_aux = 0x%2x\n", gregLO3ofRM(modrm)); vex_printf("first_opcode == 0xDD\n");