Fix bugs in x86-32 strcmp-sse4.S and strcmp-ssse3.S

This commit is contained in:
H.J. Lu 2010-04-15 07:49:30 -07:00 committed by Ulrich Drepper
parent 94a27fabeb
commit 6cc2b8a6df
3 changed files with 43 additions and 11 deletions

View File

@ -1,5 +1,5 @@
/* Test and measure strncmp functions. /* Test and measure strncmp functions.
Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc. Copyright (C) 1999, 2002, 2003, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999. Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@ -51,8 +51,8 @@ stupid_strncmp (const char *s1, const char *s2, size_t n)
return ret; return ret;
} }
static void static int
do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n, check_result (impl_t *impl, const char *s1, const char *s2, size_t n,
int exp_result) int exp_result)
{ {
int result = CALL (impl, s1, s2, n); int result = CALL (impl, s1, s2, n);
@ -63,9 +63,19 @@ do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n,
error (0, 0, "Wrong result in function %s %d %d", impl->name, error (0, 0, "Wrong result in function %s %d %d", impl->name,
result, exp_result); result, exp_result);
ret = 1; ret = 1;
return; return -1;
} }
return 0;
}
static void
do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n,
int exp_result)
{
if (check_result (impl, s1, s2, n, exp_result) < 0)
return;
if (HP_TIMING_AVAIL) if (HP_TIMING_AVAIL)
{ {
hp_timing_t start __attribute ((unused)); hp_timing_t start __attribute ((unused));
@ -283,6 +293,25 @@ do_random_tests (void)
} }
} }
static void
check1 (void)
{
char *s1 = (char *)(buf1 + 0xb2c);
char *s2 = (char *)(buf1 + 0xfd8);
size_t i;
int exp_result;
strcpy(s1, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrs");
strcpy(s2, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkLMNOPQRSTUV");
for (i = 0; i < 80; i++)
{
exp_result = simple_strncmp (s1, s2, i);
FOR_EACH_IMPL (impl, 0)
check_result (impl, s1, s2, i, exp_result);
}
}
int int
test_main (void) test_main (void)
{ {
@ -290,6 +319,8 @@ test_main (void)
test_init (); test_init ();
check1 ();
printf ("%23s", ""); printf ("%23s", "");
FOR_EACH_IMPL (impl, 0) FOR_EACH_IMPL (impl, 0)
printf ("\t%s", impl->name); printf ("\t%s", impl->name);

View File

@ -223,8 +223,8 @@ L(crosspage):
inc %edx inc %edx
cmp $15, %edx cmp $15, %edx
jle L(crosspage) jle L(crosspage)
add $16, %edi add %edx, %edi
add $16, %esi add %edx, %esi
jmp L(check_offset) jmp L(check_offset)
.p2align 4 .p2align 4

View File

@ -1484,17 +1484,18 @@ L(gobble_ashr_12):
sub $0xffff, %esi sub $0xffff, %esi
jnz L(exit) jnz L(exit)
#ifdef USE_AS_STRNCMP
cmp $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
add $16, %ecx add $16, %ecx
movdqa %xmm4, %xmm3 movdqa %xmm4, %xmm3
add $16, %edi add $16, %edi
jg L(nibble_ashr_12) jg L(nibble_ashr_12)
#ifdef USE_AS_STRNCMP
cmp $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
movdqa (%eax, %ecx), %xmm1 movdqa (%eax, %ecx), %xmm1
movdqa (%edx, %ecx), %xmm2 movdqa (%edx, %ecx), %xmm2
movdqa %xmm2, %xmm4 movdqa %xmm2, %xmm4