1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

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> 2010-11-08 Ulrich Drepper <drepper@gmail.com>
[BZ #12194] [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. Copyright (C) 1992-2009, 2010 Free Software Foundation, Inc.
See the end for copying conditions. See the end for copying conditions.
@ -11,7 +11,7 @@ Version 2.13
3268, 7066, 10851, 11611, 11640, 11701, 11840, 11856, 11883, 11903, 11904, 3268, 7066, 10851, 11611, 11640, 11701, 11840, 11856, 11883, 11903, 11904,
11968, 11979, 12005, 12037, 12067, 12077, 12078, 12092, 12093, 12107, 12108, 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 * 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; 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);
if ((exp_result == 0 && result != 0) 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, 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));
@ -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 int
test_main (void) test_main (void)
{ {
@ -249,6 +278,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

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