41 lines
1.6 KiB
Diff
41 lines
1.6 KiB
Diff
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
Date: Mon, 12 Oct 2015 11:50:27 +0200
|
||
|
Subject: [PATCH] target-i386: fix pcmpxstrx equal-ordered (strstr) mode
|
||
|
|
||
|
In this mode, referring an invalid element of the source forces the
|
||
|
result to false (table 4-7, last column) but referring an invalid
|
||
|
element of the destination forces the result to true, so the outer
|
||
|
loop should still be run even if some elements of the destination
|
||
|
will be invalid. They will be avoided in the inner loop, which
|
||
|
correctly bounds "i" to validd, but they will still contribute to a
|
||
|
positive outcome of the search.
|
||
|
|
||
|
This fixes tst_strstr in glibc 2.17.
|
||
|
|
||
|
Reported-by: Florian Weimer <fweimer@redhat.com>
|
||
|
Cc: Richard Henderson <rth@twiddle.net>
|
||
|
Cc: Eduardo Habkost <ehabkost@redhat.com>
|
||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
(cherry picked from commit 54c54f8b56047d3c2420e1ae06a6a8890c220ac4)
|
||
|
---
|
||
|
target-i386/ops_sse.h | 4 ++--
|
||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h
|
||
|
index 0765073..34eb141 100644
|
||
|
--- a/target-i386/ops_sse.h
|
||
|
+++ b/target-i386/ops_sse.h
|
||
|
@@ -2037,10 +2037,10 @@ static inline unsigned pcmpxstrx(CPUX86State *env, Reg *d, Reg *s,
|
||
|
}
|
||
|
break;
|
||
|
case 3:
|
||
|
- for (j = valids - validd; j >= 0; j--) {
|
||
|
+ for (j = valids; j >= 0; j--) {
|
||
|
res <<= 1;
|
||
|
v = 1;
|
||
|
- for (i = MIN(upper - j, validd); i >= 0; i--) {
|
||
|
+ for (i = MIN(valids - j, validd); i >= 0; i--) {
|
||
|
v &= (pcmp_val(s, ctrl, i + j) == pcmp_val(d, ctrl, i));
|
||
|
}
|
||
|
res |= v;
|