From: Josef Weidendorfer Date: Wed, 25 Jul 2012 09:36:54 +0000 (+0000) Subject: Fix bug 303963. X-Git-Tag: svn/VALGRIND_3_8_1^2~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af977983c390bd0de6fa9e9699a4e9c73b151ef7;p=thirdparty%2Fvalgrind.git Fix bug 303963. Emulation of PCMPxSTRx mode 0x0C was wrong for searching an empty needle in an empty haystack. git-svn-id: svn://svn.valgrind.org/vex/trunk@2447 --- diff --git a/VEX/priv/guest_generic_x87.c b/VEX/priv/guest_generic_x87.c index a10f86990e..ae627f64f0 100644 --- a/VEX/priv/guest_generic_x87.c +++ b/VEX/priv/guest_generic_x87.c @@ -895,9 +895,6 @@ Bool compute_PCMPxSTRx ( /*OUT*/V128* resV, UInt validL = ~(zmaskL | -zmaskL); // not(left(zmaskL)) UInt validR = ~(zmaskR | -zmaskR); // not(left(zmaskR)) for (hi = 0; hi < 16; hi++) { - if ((validL & (1 << hi)) == 0) - // run off the end of the haystack - break; UInt m = 1; for (ni = 0; ni < 16; ni++) { if ((validR & (1 << ni)) == 0) break; @@ -906,6 +903,9 @@ Bool compute_PCMPxSTRx ( /*OUT*/V128* resV, if (argL[i] != argR[ni]) { m = 0; break; } } boolRes |= (m << hi); + if ((validL & (1 << hi)) == 0) + // run off the end of the haystack + break; } // boolRes is "pre-invalidated" @@ -1105,9 +1105,6 @@ Bool compute_PCMPxSTRx_wide ( /*OUT*/V128* resV, UInt validL = ~(zmaskL | -zmaskL); // not(left(zmaskL)) UInt validR = ~(zmaskR | -zmaskR); // not(left(zmaskR)) for (hi = 0; hi < 8; hi++) { - if ((validL & (1 << hi)) == 0) - // run off the end of the haystack - break; UInt m = 1; for (ni = 0; ni < 8; ni++) { if ((validR & (1 << ni)) == 0) break; @@ -1116,6 +1113,9 @@ Bool compute_PCMPxSTRx_wide ( /*OUT*/V128* resV, if (argL[i] != argR[ni]) { m = 0; break; } } boolRes |= (m << hi); + if ((validL & (1 << hi)) == 0) + // run off the end of the haystack + break; } // boolRes is "pre-invalidated"