From: Julian Seward Date: Tue, 14 Mar 2006 19:14:59 +0000 (+0000) Subject: Merge r1521 (fix amd64 SSE front end causing too much memory to be X-Git-Tag: svn/VALGRIND_3_1_1^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0c13b3136c075963f6d2d16aefcee413699b023;p=thirdparty%2Fvalgrind.git Merge r1521 (fix amd64 SSE front end causing too much memory to be read for some SSE comparisons). git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_1_BRANCH@1596 --- diff --git a/VEX/priv/guest-amd64/toIR.c b/VEX/priv/guest-amd64/toIR.c index 2de74470c0..e7ec6f5fb9 100644 --- a/VEX/priv/guest-amd64/toIR.c +++ b/VEX/priv/guest-amd64/toIR.c @@ -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,