f096bf
commit 6f472ff11be7fa4a1114b2e3d321609717325311
f096bf
Author: tom <tom@8f6e269a-dfd6-0310-a8e1-e2731360e62c>
f096bf
Date:   Wed Feb 3 10:14:18 2016 +0000
f096bf
f096bf
    Handle missing FCOM case on amd64.
f096bf
    
f096bf
    Patch from Mark Harris on BZ#212352.
f096bf
    
f096bf
    
f096bf
    git-svn-id: svn://svn.valgrind.org/vex/trunk@3207 8f6e269a-dfd6-0310-a8e1-e2731360e62c
f096bf
f096bf
diff --git a/VEX/priv/guest_amd64_toIR.c b/VEX/priv/guest_amd64_toIR.c
f096bf
index af4817f..936d16f 100644
f096bf
--- a/VEX/priv/guest_amd64_toIR.c
f096bf
+++ b/VEX/priv/guest_amd64_toIR.c
f096bf
@@ -6401,19 +6401,20 @@ ULong dis_FPU ( /*OUT*/Bool* decode_ok,
f096bf
                fp_do_op_mem_ST_0 ( addr, "mul", dis_buf, Iop_MulF64, True );
f096bf
                break;
f096bf
 
f096bf
-//..             case 2: /* FCOM double-real */
f096bf
-//..                DIP("fcoml %s\n", dis_buf);
f096bf
-//..                /* This forces C1 to zero, which isn't right. */
f096bf
-//..                put_C3210( 
f096bf
-//..                    binop( Iop_And32,
f096bf
-//..                           binop(Iop_Shl32, 
f096bf
-//..                                 binop(Iop_CmpF64, 
f096bf
-//..                                       get_ST(0),
f096bf
-//..                                       loadLE(Ity_F64,mkexpr(addr))),
f096bf
-//..                                 mkU8(8)),
f096bf
-//..                           mkU32(0x4500)
f096bf
-//..                    ));
f096bf
-//..                break;  
f096bf
+            case 2: /* FCOM double-real */
f096bf
+               DIP("fcoml %s\n", dis_buf);
f096bf
+               /* This forces C1 to zero, which isn't right. */
f096bf
+               put_C3210(
f096bf
+                   unop(Iop_32Uto64,
f096bf
+                   binop( Iop_And32,
f096bf
+                          binop(Iop_Shl32,
f096bf
+                                binop(Iop_CmpF64,
f096bf
+                                      get_ST(0),
f096bf
+                                      loadLE(Ity_F64,mkexpr(addr))),
f096bf
+                                mkU8(8)),
f096bf
+                          mkU32(0x4500)
f096bf
+                   )));
f096bf
+               break;
f096bf
 
f096bf
             case 3: /* FCOMP double-real */
f096bf
                DIP("fcompl %s\n", dis_buf);