Fix one exit path in x86-64 SSE4.2 str{,n}casecmp.

This commit is contained in:
H.J. Lu 2010-11-10 03:05:37 -05:00 committed by Ulrich Drepper
parent 69da074d7a
commit 8ca52c6e3b
4 changed files with 53 additions and 6 deletions

View file

@ -1,3 +1,13 @@
2010-11-09 H.J. Lu <hongjiu.lu@intel.com>
[BZ #12205]
* string/test-strncasecmp.c (check_result): New function.
(do_one_test): Use it.
(check1): New function.
(test_main): Use it.
* sysdeps/i386/i686/multiarch/strcmp.S (nibble_ashr_use_sse4_2_exit):
Support strcasecmp and strncasecmp.
2010-11-08 Ulrich Drepper <drepper@gmail.com>
[BZ #12194]

4
NEWS
View file

@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2010-11-8
GNU C Library NEWS -- history of user-visible changes. 2010-11-10
Copyright (C) 1992-2009, 2010 Free Software Foundation, Inc.
See the end for copying conditions.
@ -11,7 +11,7 @@ Version 2.13
3268, 7066, 10851, 11611, 11640, 11701, 11840, 11856, 11883, 11903, 11904,
11968, 11979, 12005, 12037, 12067, 12077, 12078, 12092, 12093, 12107, 12108,
12113, 12140, 12159, 12167, 12191, 12194
12113, 12140, 12159, 12167, 12191, 12194, 12205
* New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark

View file

@ -70,9 +70,9 @@ stupid_strncasecmp (const char *s1, const char *s2, size_t max)
return ret;
}
static void
do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n,
int exp_result)
static int
check_result (impl_t *impl, const char *s1, const char *s2, size_t n,
int exp_result)
{
int result = CALL (impl, s1, s2, n);
if ((exp_result == 0 && result != 0)
@ -82,9 +82,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,
result, exp_result);
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)
{
hp_timing_t start __attribute ((unused));
@ -242,6 +252,25 @@ do_random_tests (void)
}
}
static void
check1 (void)
{
static char cp [4096+16] __attribute__ ((aligned(4096)));
static char gotrel[4096] __attribute__ ((aligned(4096)));
char *s1 = cp + 0xffa;
char *s2 = gotrel + 0xcbe;
int exp_result;
size_t n = 6;
strcpy (s1, "gottpoff");
strcpy (s2, "GOTPLT");
exp_result = simple_strncasecmp (s1, s2, n);
FOR_EACH_IMPL (impl, 0)
check_result (impl, s1, s2, n, exp_result);
}
int
test_main (void)
{
@ -249,6 +278,8 @@ test_main (void)
test_init ();
check1 ();
printf ("%23s", "");
FOR_EACH_IMPL (impl, 0)
printf ("\t%s", impl->name);

View file

@ -1809,7 +1809,13 @@ LABEL(nibble_ashr_15_use_sse4_2):
ja LABEL(loop_ashr_15_use_sse4_2)
LABEL(nibble_ashr_use_sse4_2_exit):
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
pcmpistri $0x1a,(%rsi,%rdx), %xmm0
# else
movdqa (%rsi,%rdx), %xmm1
TOLOWER (%xmm0, %xmm1)
pcmpistri $0x1a, %xmm1, %xmm0
# endif
.p2align 4
LABEL(use_sse4_2_exit):
jnc LABEL(strcmp_exitz_sse4_2)