]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Merge r1591 (Implement fnstsw).
authorJulian Seward <jseward@acm.org>
Tue, 7 Mar 2006 00:24:59 +0000 (00:24 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 7 Mar 2006 00:24:59 +0000 (00:24 +0000)
git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_1_BRANCH@1592

VEX/priv/guest-amd64/toIR.c

index ad2aa0486eb4f88d72858b6e56c8b214072e1cec..efa9747370f6880bf8646eae8b6e238c3ad43967 100644 (file)
@@ -4172,6 +4172,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
@@ -5423,6 +5439,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");