]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement fnstsw.
authorJulian Seward <jseward@acm.org>
Tue, 7 Mar 2006 00:22:02 +0000 (00:22 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 7 Mar 2006 00:22:02 +0000 (00:22 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@1591

VEX/priv/guest-amd64/toIR.c

index 55f6417915d8bed167f3cdfff3c38bd4e3faf844..534592d7cb98392999da8a8b40e2290103112b76 100644 (file)
@@ -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");