x86-64: memcmp-avx2-movbe.S needs saturating subtraction [BZ #21662]
Commit Message
This code:
L(between_2_3):
/* Load as big endian with overlapping loads and bswap to avoid
branches. */
movzwl -2(%rdi, %rdx), %eax
movzwl -2(%rsi, %rdx), %ecx
shll $16, %eax
shll $16, %ecx
movzwl (%rdi), %edi
movzwl (%rsi), %esi
orl %edi, %eax
orl %esi, %ecx
bswap %eax
bswap %ecx
subl %ecx, %eax
ret
needs a saturating subtract because the full register is used.
The test case change adds coverage for these kinds of bugs.
2017-06-23 Florian Weimer <fweimer@redhat.com>
[BZ #21662]
* sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S (between_2_3):
Peform saturating subtraction.
* string/test-memcmp.c (check1): Check with different lengths.
@@ -441,11 +441,12 @@ check1 (void)
n = 116;
for (size_t i = 0; i < n; i++)
- {
- exp_result = SIMPLE_MEMCMP (s1 + i, s2 + i, n - i);
- FOR_EACH_IMPL (impl, 0)
- check_result (impl, s1 + i, s2 + i, n - i, exp_result);
- }
+ for (size_t len = 0; len <= n - i; ++len)
+ {
+ exp_result = SIMPLE_MEMCMP (s1 + i, s2 + i, len);
+ FOR_EACH_IMPL (impl, 0)
+ check_result (impl, s1 + i, s2 + i, len, exp_result);
+ }
}
/* This test checks that memcmp doesn't overrun buffers. */
@@ -150,6 +150,9 @@ L(between_2_3):
bswap %eax
bswap %ecx
subl %ecx, %eax
+ je L(exit)
+ sbbl %eax, %eax
+ orl $1, %eax
ret
.p2align 4