|
From: <sv...@va...> - 2012-07-25 09:37:06
|
weidendo 2012-07-25 10:36:54 +0100 (Wed, 25 Jul 2012)
New Revision: 2447
Log:
Fix bug 303963.
Emulation of PCMPxSTRx mode 0x0C was wrong
for searching an empty needle in an empty haystack.
Modified files:
trunk/priv/guest_generic_x87.c
Modified: trunk/priv/guest_generic_x87.c (+6 -6)
===================================================================
--- trunk/priv/guest_generic_x87.c 2012-07-25 01:52:21 +01:00 (rev 2446)
+++ trunk/priv/guest_generic_x87.c 2012-07-25 10:36:54 +01:00 (rev 2447)
@@ -895,9 +895,6 @@
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 @@
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 @@
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 @@
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"
|