From af977983c390bd0de6fa9e9699a4e9c73b151ef7 Mon Sep 17 00:00:00 2001 From: Josef Weidendorfer Date: Wed, 25 Jul 2012 09:36:54 +0000 Subject: [PATCH] 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 --- VEX/priv/guest_generic_x87.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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" -- 2.47.2