]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Merge r1521 (fix amd64 SSE front end causing too much memory to be
authorJulian Seward <jseward@acm.org>
Tue, 14 Mar 2006 19:14:59 +0000 (19:14 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 14 Mar 2006 19:14:59 +0000 (19:14 +0000)
read for some SSE comparisons).

git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_1_BRANCH@1596

VEX/priv/guest-amd64/toIR.c

index 2de74470c08f821feebdb96c4a37b287a09af7ee..e7ec6f5fb926dd466b12fec60e36979b21bc012a 100644 (file)
@@ -7678,7 +7678,7 @@ static void findSSECmpOp ( Bool* needNot, IROp* op,
    vpanic("findSSECmpOp(amd64,guest)");
 }
 
-/* Handles SSE 32F comparisons. */
+/* Handles SSE 32F/64F comparisons. */
 
 static ULong dis_SSEcmp_E_to_G ( Prefix pfx, Long delta, 
                                  HChar* opname, Bool all_lanes, Int sz )
@@ -7706,8 +7706,15 @@ static ULong dis_SSEcmp_E_to_G ( Prefix pfx, Long delta,
       addr = disAMode ( &alen, pfx, delta, dis_buf, 1 );
       imm8 = getUChar(delta+alen);
       findSSECmpOp(&needNot, &op, imm8, all_lanes, sz);
-      assign( plain, binop(op, getXMMReg(gregOfRexRM(pfx,rm)), 
-                               loadLE(Ity_V128, mkexpr(addr))) );
+      assign( plain, 
+              binop(
+                 op,
+                 getXMMReg(gregOfRexRM(pfx,rm)), 
+                   all_lanes  ? loadLE(Ity_V128, mkexpr(addr))
+                 : sz == 8    ? unop( Iop_64UtoV128, loadLE(Ity_I64, mkexpr(addr)))
+                 : /*sz==4*/    unop( Iop_32UtoV128, loadLE(Ity_I32, mkexpr(addr)))
+             ) 
+      );
       delta += alen+1;
       DIP("%s $%d,%s,%s\n", opname,
                             (Int)imm8,