Commit 54c54f8b authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

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: default avatarFlorian Weimer <fweimer@redhat.com>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent aa5ccadc
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;