[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commits] r15818 - in /fsf/trunk/libc: ./ malloc/ sysdeps/i386/i686/multiarch/ time/



Author: eglibc
Date: Tue Nov 15 00:02:11 2011
New Revision: 15818

Log:
Import glibc-mainline for 2011-11-15

Added:
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/locale-defines.sym
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase-c.c
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-c.c
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l.S
Modified:
    fsf/trunk/libc/ChangeLog
    fsf/trunk/libc/NEWS
    fsf/trunk/libc/malloc/arena.c
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/Makefile
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S
    fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp.S
    fsf/trunk/libc/time/tzfile.c

Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Tue Nov 15 00:02:11 2011
@@ -1,3 +1,48 @@
+2011-11-14  Ulrich Drepper  <drepper@xxxxxxxxx>
+
+	* time/tzfile.c (__tzfile_read): Use "e" in fopen call.
+
+2011-11-14  Andreas Schwab  <schwab@xxxxxxxxxx>
+
+	* malloc/arena.c (arena_get2): Don't call reused_arena when
+	_int_new_arena failed.
+
+2011-11-14  Ulrich Drepper  <drepper@xxxxxxxxx>
+
+	* sysdeps/i386/i686/multiarch/Makefile [subdir=string]
+	(sysdep_routines): Add strcasecmp_l-sse4 and strncase_l-sse4.
+	* sysdeps/i386/i686/multiarch/strcasecmp.S: Re-enable SSE4.2 code.
+	* sysdeps/i386/i686/multiarch/strcmp.S: Likewise.
+	* sysdeps/i386/i686/multiarch/strncase.S: Likewise.
+	* sysdeps/i386/i686/multiarch/strcmp-sse4.S: Change to allow reuse
+	to compile strcasecmp and strncasecmp.
+	* sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S: New file.
+	* sysdeps/i386/i686/multiarch/strncase_l-sse4.S: New file.
+
+	* sysdeps/i386/i686/multiarch/strcmp-ssse3.S: Use L macro consistently.
+
+2011-11-13  Ulrich Drepper  <drepper@xxxxxxxxx>
+
+	* sysdeps/i386/i686/multiarch/Makefile [subdir=string]: Add
+	locale-defines.sym to gen-as-const-headers.
+	(sysdep_routines): Add strcasecmp_l-c, strcasecmp-c,
+	strcasecmp_l-ssse3, strncase_l-c, strncase-c, and strncase_l-ssse3.
+	* sysdeps/i386/i686/multiarch/strcmp-ssse3.S: Change to allow reuse
+	to compile strcasecmp and strncasecmp.
+	* sysdeps/i386/i686/multiarch/strcmp.S: Allow to use for
+	strcasecmp_l and strncasecmp_l.
+	* sysdeps/i386/i686/multiarch/locale-defines.sym: New file.
+	* sysdeps/i386/i686/multiarch/strcasecmp-c.c: New file.
+	* sysdeps/i386/i686/multiarch/strcasecmp.S: New file.
+	* sysdeps/i386/i686/multiarch/strcasecmp_l-c.c: New file.
+	* sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S: New file.
+	* sysdeps/i386/i686/multiarch/strcasecmp_l.S: New file.
+	* sysdeps/i386/i686/multiarch/strncase-c.c: New file.
+	* sysdeps/i386/i686/multiarch/strncase.S: New file.
+	* sysdeps/i386/i686/multiarch/strncase_l-c.c: New file.
+	* sysdeps/i386/i686/multiarch/strncase_l-ssse3.S: New file.
+	* sysdeps/i386/i686/multiarch/strncase_l.S: New file.
+
 2011-11-12  Ulrich Drepper  <drepper@xxxxxxxxx>
 
 	* sysdeps/unix/clock_gettime.c (clock_gettime): No need to assign

Modified: fsf/trunk/libc/NEWS
==============================================================================
--- fsf/trunk/libc/NEWS (original)
+++ fsf/trunk/libc/NEWS Tue Nov 15 00:02:11 2011
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2011-11-4
+GNU C Library NEWS -- history of user-visible changes.  2011-11-14
 Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -56,6 +56,9 @@
   Implemented by Ulrich Drepper.
 
 * New Linux interfaces: process_vm_readv, process_vm_writev
+
+* Optimized strcasecmp and strncasecmp for SSSE3 and SSE4.2 on x86-32.
+  Implemented by Ulrich Drepper.
 
 Version 2.14
 

Modified: fsf/trunk/libc/malloc/arena.c
==============================================================================
--- fsf/trunk/libc/malloc/arena.c (original)
+++ fsf/trunk/libc/malloc/arena.c Tue Nov 15 00:02:11 2011
@@ -844,14 +844,14 @@
       size_t n = narenas;
       if (__builtin_expect (n <= mp_.arena_test || n < narenas_limit, 0))
 	{
-	  if (catomic_compare_and_exchange_bool_acq(&narenas, n + 1, n))
+	  if (catomic_compare_and_exchange_bool_acq (&narenas, n + 1, n))
 	    goto repeat;
 	  a = _int_new_arena (size);
-	  if (__builtin_expect (a != NULL, 1))
-	    return a;
-	  catomic_decrement(&narenas);
+	  if (__builtin_expect (a == NULL, 0))
+	    catomic_decrement (&narenas);
 	}
-      a = reused_arena ();
+      else
+	a = reused_arena ();
     }
 #else
   if(!a_tsd)

Modified: fsf/trunk/libc/sysdeps/i386/i686/multiarch/Makefile
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/Makefile (original)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/Makefile Tue Nov 15 00:02:11 2011
@@ -4,6 +4,7 @@
 endif
 
 ifeq ($(subdir),string)
+gen-as-const-headers += locale-defines.sym
 sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \
 		   memmove-ssse3 memcpy-ssse3-rep mempcpy-ssse3-rep \
 		   memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \
@@ -18,7 +19,10 @@
 		   memchr-sse2 memchr-sse2-bsf \
 		   memrchr-sse2 memrchr-sse2-bsf memrchr-c \
 		   rawmemchr-sse2 rawmemchr-sse2-bsf \
-		   strnlen-sse2 strnlen-c
+		   strnlen-sse2 strnlen-c \
+		   strcasecmp_l-c strcasecmp-c strcasecmp_l-ssse3 \
+		   strncase_l-c strncase-c strncase_l-ssse3 \
+		   strcasecmp_l-sse4 strncase_l-sse4
 ifeq (yes,$(config-cflags-sse4))
 sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c
 CFLAGS-varshift.c += -msse4

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/locale-defines.sym
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/locale-defines.sym (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/locale-defines.sym Tue Nov 15 00:02:11 2011
@@ -1,0 +1,11 @@
+#include <locale/localeinfo.h>
+#include <langinfo.h>
+#include <stddef.h>
+
+--
+
+LOCALE_T___LOCALES		offsetof (struct __locale_struct, __locales)
+LC_CTYPE
+_NL_CTYPE_NONASCII_CASE
+LOCALE_DATA_VALUES		offsetof (struct __locale_data, values)
+SIZEOF_VALUES			sizeof (((struct __locale_data *) 0)->values[0])

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c Tue Nov 15 00:02:11 2011
@@ -1,0 +1,12 @@
+#include <string.h>
+
+extern __typeof (strcasecmp) __strcasecmp_nonascii;
+
+#define __strcasecmp __strcasecmp_nonascii
+#include <string/strcasecmp.c>
+
+strong_alias (__strcasecmp_nonascii, __strcasecmp_ia32)
+
+/* The needs of strcasecmp in libc are minimal, no need to go through
+   the IFUNC.  */
+strong_alias (__strcasecmp_nonascii, __GI___strcasecmp)

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,68 @@
+/* Entry point for multi-version x86 strcasecmp.
+   Copyright (C) 2011 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sysdep.h>
+#include <init-arch.h>
+
+#ifdef SHARED
+	.text
+ENTRY(__strcasecmp)
+	.type	__strcasecmp, @gnu_indirect_function
+	pushl	%ebx
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (ebx, 0)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
+	jne	1f
+	call	__init_cpu_features
+1:	leal	__strcasecmp_ia32@GOTOFF(%ebx), %eax
+	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
+	jz	2f
+	leal	__strcasecmp_ssse3@GOTOFF(%ebx), %eax
+	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
+	jz	2f
+	leal	__strcasecmp_sse4_2@GOTOFF(%ebx), %eax
+2:	popl	%ebx
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (ebx)
+	ret
+END(__strcasecmp)
+#else
+	.text
+ENTRY(__strcasecmp)
+	.type	__strcasecmp, @gnu_indirect_function
+	cmpl	$0, KIND_OFFSET+__cpu_features
+	jne	1f
+	call	__init_cpu_features
+1:	leal	__strcasecmp_ia32, %eax
+	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
+	jz	2f
+	leal	__strcasecmp_ssse3, %eax
+#if 0
+	// XXX Temporarily
+	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
+	jz	2f
+	leal	__strcasecmp_sse4_2, %eax
+#endif
+2:	ret
+END(__strcasecmp)
+#endif
+
+weak_alias (__strcasecmp, strcasecmp)

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c Tue Nov 15 00:02:11 2011
@@ -1,0 +1,11 @@
+#include <string.h>
+
+extern __typeof (strcasecmp_l) __strcasecmp_l_nonascii;
+
+#define __strcasecmp_l __strcasecmp_l_nonascii
+#define USE_IN_EXTENDED_LOCALE_MODEL    1
+#include <string/strcasecmp.c>
+
+/* The needs of strcasecmp in libc are minimal, no need to go through
+   the IFUNC.  */
+strong_alias (__strcasecmp_l_nonascii, __GI___strcasecmp_l)

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,2 @@
+#define USE_AS_STRCASECMP_L 1
+#include "strcmp-sse4.S"

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,2 @@
+#define USE_AS_STRCASECMP_L 1
+#include "strcmp-ssse3.S"

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,5 @@
+#define STRCMP __strcasecmp_l
+#define USE_AS_STRCASECMP_L
+#include "strcmp.S"
+
+weak_alias (__strcasecmp_l, strcasecmp_l)

Modified: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S (original)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S Tue Nov 15 00:02:11 2011
@@ -1,5 +1,5 @@
 /* strcmp with SSE4.2
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -34,33 +34,156 @@
 #define PUSH(REG)	pushl REG; CFI_PUSH (REG)
 #define POP(REG)	popl REG; CFI_POP (REG)
 
-#ifndef USE_AS_STRNCMP
+#ifdef USE_AS_STRNCMP
+# ifndef STRCMP
+#  define STRCMP	__strncmp_sse4_2
+# endif
+# define STR1		8
+# define STR2		STR1+4
+# define CNT		STR2+4
+# define RETURN		POP (REM); ret; .p2align 4; CFI_PUSH (REM)
+# define REM		%ebp
+#elif defined USE_AS_STRCASECMP_L
+# include "locale-defines.h"
+# ifndef STRCMP
+#  define STRCMP	__strcasecmp_l_sse4_2
+# endif
+# define STR1		12
+# define STR2		STR1+4
+# define LOCALE		12	/* Loaded before the adjustement.  */
+# ifdef PIC
+#  define RETURN	POP (%edi); POP (%ebx); ret; \
+			.p2align 4; CFI_PUSH (%ebx); CFI_PUSH (%edi)
+# else
+#  define RETURN	POP (%edi); ret; .p2align 4; CFI_PUSH (%edi)
+# endif
+# define NONASCII	__strcasecmp_nonascii
+#elif defined USE_AS_STRNCASECMP_L
+# include "locale-defines.h"
+# ifndef STRCMP
+#  define STRCMP	__strncasecmp_l_sse4_2
+# endif
+# define STR1		16
+# define STR2		STR1+4
+# define CNT		STR2+4
+# define LOCALE		16	/* Loaded before the adjustement.  */
+# ifdef PIC
+#  define RETURN	POP (%edi); POP (REM); POP (%ebx); ret; \
+			.p2align 4; \
+			CFI_PUSH (%ebx); CFI_PUSH (REM); CFI_PUSH (%edi)
+# else
+#  define RETURN	POP (%edi); POP (REM); ret; \
+			.p2align 4; CFI_PUSH (REM); CFI_PUSH (%edi)
+# endif
+# define REM		%ebp
+# define NONASCII	__strncasecmp_nonascii
+#else
 # ifndef STRCMP
 #  define STRCMP	__strcmp_sse4_2
 # endif
 # define STR1		4
 # define STR2		STR1+4
 # define RETURN		ret; .p2align 4
-#else
-# ifndef STRCMP
-#  define STRCMP	__strncmp_sse4_2
-# endif
-# define STR1		8
-# define STR2		STR1+4
-# define CNT		STR2+4
-# define RETURN		POP (%ebp); ret; .p2align 4; CFI_PUSH (%ebp)
 #endif
 
 	.section .text.sse4.2,"ax",@progbits
-ENTRY (STRCMP)
-#ifdef USE_AS_STRNCMP
-	PUSH	(%ebp)
+
+#ifdef USE_AS_STRCASECMP_L
+ENTRY (__strcasecmp_sse4_2)
+# ifdef PIC
+	PUSH	(%ebx)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+	movl	__libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# else
+	movl	__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+	movl	%gs:(%eax), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+	movl	LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+	movl	(%eax), %eax
+# endif
+	testl	$1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+	jne	__strcasecmp_nonascii
+	jmp	L(ascii)
+END (__strcasecmp_sse4_2)
+#endif
+
+#ifdef USE_AS_STRNCASECMP_L
+ENTRY (__strncasecmp_sse4_2)
+# ifdef PIC
+	PUSH	(%ebx)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+	movl	__libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# else
+	movl	__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+	movl	%gs:(%eax), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+	movl	LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+	movl	(%eax), %eax
+# endif
+	testl	$1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+	jne	__strncasecmp_nonascii
+	jmp	L(ascii)
+END (__strncasecmp_sse4_2)
+#endif
+
+	ENTRY (STRCMP)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movl	LOCALE(%esp), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+	movl	LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+	movl	(%eax), %eax
+# endif
+	testl	$1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+	jne	NONASCII
+
+# ifdef PIC
+	PUSH	(%ebx)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+# endif
+L(ascii):
+	.section .rodata.cst16,"aM",@progbits,16
+	.align 16
+.Lbelowupper:
+	.quad	0x4040404040404040
+	.quad	0x4040404040404040
+.Ltopupper:
+	.quad	0x5b5b5b5b5b5b5b5b
+	.quad	0x5b5b5b5b5b5b5b5b
+.Ltouppermask:
+	.quad	0x2020202020202020
+	.quad	0x2020202020202020
+	.previous
+
+# ifdef PIC
+#  define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
+#  define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
+#  define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
+# else
+#  define UCLOW_reg .Lbelowupper
+#  define UCHIGH_reg .Ltopupper
+#  define LCQWORD_reg .Ltouppermask
+# endif
+#endif
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	PUSH	(REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	PUSH	(%edi)
 #endif
 	mov	STR1(%esp), %edx
 	mov	STR2(%esp), %eax
-#ifdef USE_AS_STRNCMP
-	movl	CNT(%esp), %ebp
-	test	%ebp, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	movl	CNT(%esp), REM
+	test	REM, REM
 	je	L(eq)
 #endif
 	mov	%dx, %cx
@@ -72,10 +195,40 @@
 	and	$0xfff, %ecx
 	cmp	$0xff0, %ecx
 	ja	L(first4bytes)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# define TOLOWER(reg1, reg2) \
+	movdqa	reg1, %xmm3;						      \
+	movdqa	UCHIGH_reg, %xmm4;					      \
+	movdqa	reg2, %xmm5;						      \
+	movdqa	UCHIGH_reg, %xmm6;					      \
+	pcmpgtb	UCLOW_reg, %xmm3;					      \
+	pcmpgtb	reg1, %xmm4;						      \
+	pcmpgtb	UCLOW_reg, %xmm5;					      \
+	pcmpgtb	reg2, %xmm6;						      \
+	pand	%xmm4, %xmm3;						      \
+	pand	%xmm6, %xmm5;						      \
+	pand	LCQWORD_reg, %xmm3;					      \
+	pand	LCQWORD_reg, %xmm5;					      \
+	por	%xmm3, reg1;						      \
+	por	%xmm5, reg2
+
+	movdqu	(%eax), %xmm1
+	TOLOWER (%xmm2, %xmm1)
+	movd	%xmm2, %ecx
+	movd	%xmm1, %edi
+	movdqa	%xmm2, %xmm3
+	movdqa	%xmm1, %xmm4
+	cmpl	%edi, %ecx
+#else
+# define TOLOWER(reg1, reg)
+
 	movd	%xmm2, %ecx
 	cmp	(%eax), %ecx
+#endif
 	jne	L(less4bytes)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 	movdqu	(%eax), %xmm1
+#endif
 	pxor	%xmm2, %xmm1
 	pxor	%xmm0, %xmm0
 	ptest	%xmm1, %xmm0
@@ -84,113 +237,210 @@
 	ptest	%xmm2, %xmm0
 	jnc	L(less16bytes)
 
-#ifdef USE_AS_STRNCMP
-	sub	$16, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	sub	$16, REM
 	jbe	L(eq)
 #endif
 	add	$16, %edx
 	add	$16, %eax
 L(first4bytes):
 	movzbl	(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, (%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$1, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$1, REM
 	je	L(eq)
 #endif
 
 	movzbl	1(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	1(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 1(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$2, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$2, REM
 	je	L(eq)
 #endif
 	movzbl	2(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	2(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 2(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$3, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$3, REM
 	je	L(eq)
 #endif
 	movzbl	3(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	3(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 3(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$4, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$4, REM
 	je	L(eq)
 #endif
 	movzbl	4(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	4(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 4(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$5, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$5, REM
 	je	L(eq)
 #endif
 	movzbl	5(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	5(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 5(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$6, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$6, REM
 	je	L(eq)
 #endif
 	movzbl	6(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	6(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 6(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$7, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$7, REM
 	je	L(eq)
 #endif
 	movzbl	7(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	7(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 7(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	sub	$8, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	sub	$8, REM
 	je	L(eq)
 #endif
 	add	$8, %eax
 	add	$8, %edx
 
-	PUSH	(%ebx)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 	PUSH	(%edi)
+#endif
 	PUSH	(%esi)
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
 	cfi_remember_state
 #endif
 	mov	%edx, %edi
 	mov	%eax, %esi
 	xorl	%eax, %eax
 L(check_offset):
-	movl	%edi, %ebx
+	movl	%edi, %edx
 	movl	%esi, %ecx
-	andl	$0xfff, %ebx
+	andl	$0xfff, %edx
 	andl	$0xfff, %ecx
-	cmpl	%ebx, %ecx
-	cmovl	%ebx, %ecx
+	cmpl	%edx, %ecx
+	cmovl	%edx, %ecx
 	lea	-0xff0(%ecx), %edx
 	sub	%edx, %edi
 	sub	%edx, %esi
@@ -199,11 +449,12 @@
 L(loop):
 	movdqu	(%esi,%edx), %xmm2
 	movdqu	(%edi,%edx), %xmm1
+	TOLOWER (%xmm2, %xmm1)
 	pcmpistri	$0x1a, %xmm2, %xmm1
 	jbe	L(end)
 
-#ifdef USE_AS_STRNCMP
-	sub	$16, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	sub	$16, REM
 	jbe	L(more16byteseq)
 #endif
 
@@ -211,13 +462,22 @@
 	jle	L(loop)
 L(crosspage):
 	movzbl	(%edi,%edx), %eax
-	movzbl	(%esi,%edx), %ebx
-	subl	%ebx, %eax
+	movzbl	(%esi,%edx), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+# endif
+#endif
+	subl	%ecx, %eax
 	jne	L(ret)
-	testl	%ebx, %ebx
+	testl	%ecx, %ecx
 	je	L(ret)
-#ifdef USE_AS_STRNCMP
-	sub	$1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	sub	$1, REM
 	jbe	L(more16byteseq)
 #endif
 	inc	%edx
@@ -230,30 +490,44 @@
 	.p2align 4
 L(end):
 	jnc	L(ret)
-#ifdef USE_AS_STRNCMP
-	sub	%ecx, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	sub	%ecx, REM
 	jbe	L(more16byteseq)
 #endif
-	lea	(%ecx,%edx), %ebx
-	movzbl	(%edi,%ebx), %eax
-	movzbl	(%esi,%ebx), %ecx
+	lea	(%ecx,%edx), %ecx
+	movzbl	(%edi,%ecx), %eax
+	movzbl	(%esi,%ecx), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+# endif
+#endif
 	subl	%ecx, %eax
 L(ret):
 	POP	(%esi)
 	POP	(%edi)
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	POP	(REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
 	POP	(%ebx)
-#ifdef USE_AS_STRNCMP
-	POP	(%ebp)
+# endif
 #endif
 	ret
 
 	.p2align 4
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
 	cfi_restore_state
 L(more16byteseq):
 	POP	(%esi)
+# ifdef USE_AS_STRNCMP
 	POP	(%edi)
-	POP	(%ebx)
+# endif
 #endif
 L(eq):
 	xorl	%eax, %eax
@@ -269,27 +543,45 @@
 L(less16bytes):
 	add	$0xfefefeff, %ecx
 	jnc	L(less4bytes)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movd	%xmm3, %edi
+	xor	%edi, %ecx
+#else
 	xor	(%edx), %ecx
+#endif
 	or	$0xfefefeff, %ecx
 	add	$1, %ecx
 	jnz	L(less4bytes)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$4, REM
 	jbe	L(eq)
 #endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	psrldq	$4, %xmm3
+	psrldq	$4, %xmm4
+	movd	%xmm3, %ecx
+	movd	%xmm4, %edi
+	cmp	%edi, %ecx
+	mov	%ecx, %edi
+#else
 	mov	4(%edx), %ecx
 	cmp	4(%eax), %ecx
+#endif
 	jne	L(more4bytes)
 	add	$0xfefefeff, %ecx
 	jnc	L(more4bytes)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	xor	%edi, %ecx
+#else
 	xor	4(%edx), %ecx
+#endif
 	or	$0xfefefeff, %ecx
 	add	$1, %ecx
 	jnz	L(more4bytes)
 
-#ifdef USE_AS_STRNCMP
-	sub	$8, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	sub	$8, REM
 	jbe	L(eq)
 #endif
 
@@ -298,80 +590,176 @@
 L(less4bytes):
 
 	movzbl	(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, (%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$1, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$1, REM
 	je	L(eq)
 #endif
 	movzbl	1(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	1(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 1(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$2, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$2, REM
 	je	L(eq)
 #endif
 
 	movzbl	2(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	2(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 2(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$3, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$3, REM
 	je	L(eq)
 #endif
 	movzbl	3(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	3(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 3(%edx)
+#endif
 	jne	L(neq)
 	cmpl	$0, %ecx
 	je	L(eq)
 
 L(more4bytes):
-#ifdef USE_AS_STRNCMP
-	cmp	$4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$4, REM
 	je	L(eq)
 #endif
 	movzbl	4(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	4(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 4(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-
-#ifdef USE_AS_STRNCMP
-	cmp	$5, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$5, REM
 	je	L(eq)
 #endif
 	movzbl	5(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	5(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 5(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$6, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$6, REM
 	je	L(eq)
 #endif
 	movzbl	6(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	6(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 6(%edx)
-	jne	L(neq)
-	cmpl	$0, %ecx
-	je	L(eq)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$7, %ebp
+#endif
+	jne	L(neq)
+	cmpl	$0, %ecx
+	je	L(eq)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$7, REM
 	je	L(eq)
 #endif
 	movzbl	7(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movzbl	7(%edx), %edi
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+	cmpl	%ecx, %edi
+#else
 	cmpb	%cl, 7(%edx)
+#endif
 	jne	L(neq)
 	jmp	L(eq)
 

Modified: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S (original)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S Tue Nov 15 00:02:11 2011
@@ -34,7 +34,65 @@
 #define PUSH(REG)	pushl REG; CFI_PUSH (REG)
 #define POP(REG)	popl REG; CFI_POP (REG)
 
-#ifndef USE_AS_STRNCMP
+#ifdef USE_AS_STRNCMP
+# ifndef STRCMP
+#  define STRCMP	__strncmp_ssse3
+# endif
+# define STR1		8
+# define STR2		STR1+4
+# define CNT		STR2+4
+# define RETURN		POP (REM); ret; .p2align 4; CFI_PUSH (REM)
+# define UPDATE_STRNCMP_COUNTER				\
+	/* calculate left number to compare */		\
+	mov	$16, %esi;				\
+	sub	%ecx, %esi;				\
+	cmp	%esi, REM;				\
+	jbe	L(more8byteseq);			\
+	sub	%esi, REM
+# define FLAGS		%ebx
+# define REM		%ebp
+#elif defined USE_AS_STRCASECMP_L
+# include "locale-defines.h"
+# ifndef STRCMP
+#  define STRCMP	__strcasecmp_l_ssse3
+# endif
+# define STR1		8
+# define STR2		STR1+4
+# define LOCALE		12	/* Loaded before the adjustement.  */
+# ifdef PIC
+#  define RETURN	POP (%ebx); ret; .p2align 4; CFI_PUSH (%ebx)
+# else
+#  define RETURN	ret; .p2align 4
+# endif
+# define UPDATE_STRNCMP_COUNTER
+# define FLAGS		(%esp)
+# define NONASCII	__strcasecmp_nonascii
+#elif defined USE_AS_STRNCASECMP_L
+# include "locale-defines.h"
+# ifndef STRCMP
+#  define STRCMP	__strncasecmp_l_ssse3
+# endif
+# define STR1		12
+# define STR2		STR1+4
+# define CNT		STR2+4
+# define LOCALE		16	/* Loaded before the adjustement.  */
+# ifdef PIC
+#  define RETURN	POP (REM); POP (%ebx); ret; \
+			.p2align 4; CFI_PUSH (%ebx); CFI_PUSH (REM)
+# else
+#  define RETURN	POP (REM); ret; .p2align 4; CFI_PUSH (REM)
+# endif
+# define UPDATE_STRNCMP_COUNTER				\
+	/* calculate left number to compare */		\
+	mov	$16, %esi;				\
+	sub	%ecx, %esi;				\
+	cmp	%esi, REM;				\
+	jbe	L(more8byteseq);			\
+	sub	%esi, REM
+# define FLAGS		(%esp)
+# define REM		%ebp
+# define NONASCII	__strncasecmp_nonascii
+#else
 # ifndef STRCMP
 #  define STRCMP	__strcmp_ssse3
 # endif
@@ -42,35 +100,107 @@
 # define STR2		STR1+4
 # define RETURN		ret; .p2align 4
 # define UPDATE_STRNCMP_COUNTER
-#else
-# ifndef STRCMP
-#  define STRCMP	__strncmp_ssse3
-# endif
-# define STR1		8
-# define STR2		STR1+4
-# define CNT		STR2+4
-# define RETURN		POP (%ebp); ret; .p2align 4; CFI_PUSH (%ebp)
-# define UPDATE_STRNCMP_COUNTER				\
-	/* calculate left number to compare */		\
-	mov	$16, %esi;				\
-	sub	%ecx, %esi;				\
-	cmp	%esi, %ebp;				\
-	jbe	L(more8byteseq);			\
-	sub	%esi, %ebp
+# define FLAGS		%ebx
 #endif
 
 	.section .text.ssse3,"ax",@progbits
+
+#ifdef USE_AS_STRCASECMP_L
+ENTRY (__strcasecmp_ssse3)
+# ifdef PIC
+	PUSH	(%ebx)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+	movl	__libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# else
+	movl	__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+	movl	%gs:(%eax), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+	movl	LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+	movl	(%eax), %eax
+# endif
+	testl	$1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+	jne	__strcasecmp_nonascii
+	jmp	L(ascii)
+END (__strcasecmp_ssse3)
+#endif
+
+#ifdef USE_AS_STRNCASECMP_L
+ENTRY (__strncasecmp_ssse3)
+# ifdef PIC
+	PUSH	(%ebx)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+	movl	__libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# else
+	movl	__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+	movl	%gs:(%eax), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+	movl	LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+	movl	(%eax), %eax
+# endif
+	testl	$1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+	jne	__strncasecmp_nonascii
+	jmp	L(ascii)
+END (__strncasecmp_ssse3)
+#endif
+
 ENTRY (STRCMP)
-#ifdef USE_AS_STRNCMP
-	PUSH	(%ebp)
-#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movl	LOCALE(%esp), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+	movl	LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+	movl	(%eax), %eax
+# endif
+	testl	$1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+	jne	NONASCII
+
+# ifdef PIC
+	PUSH	(%ebx)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+# endif
+L(ascii):
+	.section .rodata.cst16,"aM",@progbits,16
+	.align 16
+.Lbelowupper:
+	.quad	0x4040404040404040
+	.quad	0x4040404040404040
+.Ltopupper:
+	.quad	0x5b5b5b5b5b5b5b5b
+	.quad	0x5b5b5b5b5b5b5b5b
+.Ltouppermask:
+	.quad	0x2020202020202020
+	.quad	0x2020202020202020
+	.previous
+
+# ifdef PIC
+#  define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
+#  define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
+#  define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
+# else
+#  define UCLOW_reg .Lbelowupper
+#  define UCHIGH_reg .Ltopupper
+#  define LCQWORD_reg .Ltouppermask
+# endif
+#endif
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	PUSH	(REM)
+#endif
+
 	movl	STR1(%esp), %edx
 	movl	STR2(%esp), %eax
-#ifdef USE_AS_STRNCMP
-	movl	CNT(%esp), %ebp
-	cmp	$16, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	movl	CNT(%esp), REM
+	cmp	$16, REM
 	jb	L(less16bytes_sncmp)
-#else
+#elif !defined USE_AS_STRCASECMP_L
 	movzbl	(%eax), %ecx
 	cmpb	%cl, (%edx)
 	jne	L(neq)
@@ -135,15 +265,35 @@
 	movlpd	(%edx), %xmm2
 	movhpd	8(%eax), %xmm1
 	movhpd	8(%edx), %xmm2
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# define TOLOWER(reg1, reg2) \
+	movdqa	reg1, %xmm5;					\
+	movdqa	reg2, %xmm7;					\
+	movdqa	UCHIGH_reg, %xmm6;				\
+	pcmpgtb	UCLOW_reg, %xmm5;				\
+	pcmpgtb	UCLOW_reg, %xmm7;				\
+	pcmpgtb	reg1, %xmm6;					\
+	pand	%xmm6, %xmm5;					\
+	movdqa	UCHIGH_reg, %xmm6;				\
+	pcmpgtb	reg2, %xmm6;					\
+	pand	%xmm6, %xmm7;					\
+	pand	LCQWORD_reg, %xmm5;				\
+	por	%xmm5, reg1;					\
+	pand	LCQWORD_reg, %xmm7;				\
+	por	%xmm7, reg2
+	TOLOWER (%xmm1, %xmm2)
+#else
+# define TOLOWER(reg1, reg2)
+#endif
 	pcmpeqb	%xmm1, %xmm0
 	pcmpeqb	%xmm2, %xmm1
 	psubb	%xmm0, %xmm1
 	pmovmskb %xmm1, %ecx
 	sub	$0xffff, %ecx
 	jnz	L(less16bytes)
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(eq)
 #endif
 	add	$16, %eax
@@ -151,10 +301,16 @@
 
 L(crosspage):
 
-	PUSH	(%ebx)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
+	PUSH	(FLAGS)
+#endif
 	PUSH	(%edi)
 	PUSH	(%esi)
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	pushl	$0
+	cfi_adjust_cfa_offset (4)
+#endif
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
 	cfi_remember_state
 #endif
 
@@ -164,11 +320,13 @@
 	and	$0xf, %edi
 	xor	%ecx, %eax
 	xor	%edi, %edx
-	xor	%ebx, %ebx
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
+	xor	FLAGS, FLAGS
+#endif
 	cmp	%edi, %ecx
 	je	L(ashr_0)
 	ja	L(bigger)
-	or	$0x20, %ebx
+	orl	$0x20, FLAGS
 	xchg	%edx, %eax
 	xchg	%ecx, %edi
 L(bigger):
@@ -218,7 +376,13 @@
 	movdqa	(%eax), %xmm1
 	pxor	%xmm0, %xmm0
 	pcmpeqb	%xmm1, %xmm0
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movdqa	(%edx), %xmm2
+	TOLOWER (%xmm1, %xmm2)
+	pcmpeqb	%xmm2, %xmm1
+#else
 	pcmpeqb	(%edx), %xmm1
+#endif
 	psubb	%xmm0, %xmm1
 	pmovmskb %xmm1, %edi
 	shr	%cl, %esi
@@ -227,23 +391,29 @@
 	mov	%ecx, %edi
 	jne	L(less32bytes)
 	UPDATE_STRNCMP_COUNTER
-	mov	$0x10, %ebx
+	movl	$0x10, FLAGS
 	mov	$0x10, %ecx
 	pxor	%xmm0, %xmm0
 	.p2align 4
 L(loop_ashr_0):
 	movdqa	(%eax, %ecx), %xmm1
-	movdqa	(%edx, %ecx), %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	movdqa	(%edx, %ecx), %xmm2
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+#else
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	(%edx, %ecx), %xmm1
+#endif
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -262,6 +432,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$15, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -276,7 +447,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$1, %ebx
+	orl	$1, FLAGS
 	lea	1(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -292,16 +463,17 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$1, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -316,17 +488,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$1, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -340,8 +513,8 @@
 	test	$0xfffe, %esi
 	jnz	L(ashr_1_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$15, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$15, REM
 	jbe	L(ashr_1_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -368,6 +541,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$14, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -382,7 +556,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$2, %ebx
+	orl	$2, FLAGS
 	lea	2(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -398,17 +572,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$2, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -422,17 +597,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$2, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -446,8 +622,8 @@
 	test	$0xfffc, %esi
 	jnz	L(ashr_2_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$14, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$14, REM
 	jbe	L(ashr_2_exittail)
 #endif
 
@@ -475,6 +651,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$13, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -489,7 +666,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$3, %ebx
+	orl	$3, FLAGS
 	lea	3(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -505,17 +682,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$3, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -529,17 +707,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$3, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -553,8 +732,8 @@
 	test	$0xfff8, %esi
 	jnz	L(ashr_3_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$13, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$13, REM
 	jbe	L(ashr_3_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -581,6 +760,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$12, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -595,7 +775,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$4, %ebx
+	orl	$4, FLAGS
 	lea	4(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -611,17 +791,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$4, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -636,17 +817,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$4, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -661,8 +843,8 @@
 	test	$0xfff0, %esi
 	jnz	L(ashr_4_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$12, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$12, REM
 	jbe	L(ashr_4_exittail)
 #endif
 
@@ -690,6 +872,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$11, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -704,7 +887,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$5, %ebx
+	orl	$5, FLAGS
 	lea	5(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -720,17 +903,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$5, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -744,17 +928,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$5, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -768,8 +953,8 @@
 	test	$0xffe0, %esi
 	jnz	L(ashr_5_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$11, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$11, REM
 	jbe	L(ashr_5_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -797,6 +982,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$10, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -811,7 +997,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$6, %ebx
+	orl	$6, FLAGS
 	lea	6(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -827,17 +1013,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$6, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -852,16 +1039,17 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$6, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -876,8 +1064,8 @@
 	test	$0xffc0, %esi
 	jnz	L(ashr_6_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$10, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$10, REM
 	jbe	L(ashr_6_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -905,6 +1093,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$9, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -919,7 +1108,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$7, %ebx
+	orl	$7, FLAGS
 	lea	8(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -935,17 +1124,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$7, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -960,17 +1150,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$7, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -985,8 +1176,8 @@
 	test	$0xff80, %esi
 	jnz	L(ashr_7_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$9, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$9, REM
 	jbe	L(ashr_7_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1014,6 +1205,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$8, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1028,7 +1220,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$8, %ebx
+	orl	$8, FLAGS
 	lea	8(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1044,17 +1236,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$8, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1068,17 +1261,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$8, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1092,8 +1286,8 @@
 	test	$0xff00, %esi
 	jnz	L(ashr_8_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$8, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$8, REM
 	jbe	L(ashr_8_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1121,6 +1315,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$7, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1135,7 +1330,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$9, %ebx
+	orl	$9, FLAGS
 	lea	9(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1151,17 +1346,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$9, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1175,17 +1371,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$9, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1199,8 +1396,8 @@
 	test	$0xfe00, %esi
 	jnz	L(ashr_9_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$7, REM
 	jbe	L(ashr_9_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1227,6 +1424,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$6, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1241,7 +1439,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$10, %ebx
+	orl	$10, FLAGS
 	lea	10(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1257,17 +1455,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$10, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1281,17 +1480,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$10, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1305,8 +1505,8 @@
 	test	$0xfc00, %esi
 	jnz	L(ashr_10_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$6, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$6, REM
 	jbe	L(ashr_10_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1333,6 +1533,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$5, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1347,7 +1548,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$11, %ebx
+	orl	$11, FLAGS
 	lea	11(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1363,17 +1564,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$11, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1387,17 +1589,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$11, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1411,8 +1614,8 @@
 	test	$0xf800, %esi
 	jnz	L(ashr_11_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$5, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$5, REM
 	jbe	L(ashr_11_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1439,6 +1642,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$4, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1453,7 +1657,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$12, %ebx
+	orl	$12, FLAGS
 	lea	12(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1469,17 +1673,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$12, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 
@@ -1494,17 +1699,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$12, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1518,8 +1724,8 @@
 	test	$0xf000, %esi
 	jnz	L(ashr_12_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$4, REM
 	jbe	L(ashr_12_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1546,6 +1752,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$3, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1560,7 +1767,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$13, %ebx
+	orl	$13, FLAGS
 	lea	13(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1576,17 +1783,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$13, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1600,17 +1808,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$13, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1624,8 +1833,8 @@
 	test	$0xe000, %esi
 	jnz	L(ashr_13_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$3, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$3, REM
 	jbe	L(ashr_13_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1652,6 +1861,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$2, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1666,7 +1876,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$14, %ebx
+	orl	$14, FLAGS
 	lea	14(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1682,17 +1892,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$14, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1706,17 +1917,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$14, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1730,8 +1942,8 @@
 	test	$0xc000, %esi
 	jnz	L(ashr_14_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$2, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$2, REM
 	jbe	L(ashr_14_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1759,6 +1971,7 @@
 	movdqa	(%eax), %xmm1
 	pcmpeqb	%xmm1, %xmm0
 	pslldq	$1, %xmm2
+	TOLOWER (%xmm1, %xmm2)
 	pcmpeqb	%xmm1, %xmm2
 	psubb	%xmm0, %xmm2
 	pmovmskb %xmm2, %edi
@@ -1773,7 +1986,7 @@
 	movdqa	(%edx), %xmm3
 	pxor	%xmm0, %xmm0
 	mov	$16, %ecx
-	or	$15, %ebx
+	orl	$15, FLAGS
 	lea	15(%edx), %edi
 	and	$0xfff, %edi
 	sub	$0x1000, %edi
@@ -1789,17 +2002,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$15, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1813,17 +2027,18 @@
 	movdqa	%xmm2, %xmm4
 
 	palignr	$15, %xmm3, %xmm2
-
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm1
-	psubb	%xmm0, %xmm1
-	pmovmskb %xmm1, %esi
-	sub	$0xffff, %esi
-	jnz	L(exit)
-
-#ifdef USE_AS_STRNCMP
-	cmp	$16, %ebp
-	lea	-16(%ebp), %ebp
+	TOLOWER (%xmm1, %xmm2)
+
+	pcmpeqb	%xmm1, %xmm0
+	pcmpeqb	%xmm2, %xmm1
+	psubb	%xmm0, %xmm1
+	pmovmskb %xmm1, %esi
+	sub	$0xffff, %esi
+	jnz	L(exit)
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$16, REM
+	lea	-16(REM), REM
 	jbe	L(more8byteseq)
 #endif
 	add	$16, %ecx
@@ -1837,8 +2052,8 @@
 	test	$0x8000, %esi
 	jnz	L(ashr_15_exittail)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$1, REM
 	jbe	L(ashr_15_exittail)
 #endif
 	pxor	%xmm0, %xmm0
@@ -1854,27 +2069,34 @@
 
 	.p2align 4
 L(aftertail):
+	TOLOWER (%xmm1, %xmm3)
 	pcmpeqb	%xmm3, %xmm1
 	psubb	%xmm0, %xmm1
 	pmovmskb %xmm1, %esi
 	not	%esi
 L(exit):
-	mov	%ebx, %edi
+	mov	FLAGS, %edi
 	and	$0x1f, %edi
 	lea	-16(%edi, %ecx), %edi
 L(less32bytes):
 	add	%edi, %edx
 	add	%ecx, %eax
-	test	$0x20, %ebx
+	testl	$0x20, FLAGS
 	jz	L(ret2)
 	xchg	%eax, %edx
 
 	.p2align 4
 L(ret2):
 	mov	%esi, %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	addl	$4, %esp
+	cfi_adjust_cfa_offset (-4)
+#endif
 	POP	(%esi)
 	POP	(%edi)
-	POP	(%ebx)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
+	POP	(FLAGS)
+#endif
 L(less16bytes):
 	test	%cl, %cl
 	jz	L(2next_8_bytes)
@@ -1899,90 +2121,169 @@
 
 	test	$0x40, %cl
 	jnz	L(Byte6)
-#ifdef USE_AS_STRNCMP
-	cmp	$7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$7, REM
 	jbe	L(eq)
 #endif
 
 	movzx	7(%eax), %ecx
 	movzx	7(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
 
 	sub	%ecx, %eax
 	RETURN
 
 L(Byte0):
-#ifdef USE_AS_STRNCMP
-	cmp	$0, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$0, REM
 	jbe	L(eq)
 #endif
 	movzx	(%eax), %ecx
 	movzx	(%edx), %eax
 
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
 	sub	%ecx, %eax
 	RETURN
 
 L(Byte1):
-#ifdef USE_AS_STRNCMP
-	cmp	$1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$1, REM
 	jbe	L(eq)
 #endif
 	movzx	1(%eax), %ecx
 	movzx	1(%edx), %eax
 
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
 	sub	%ecx, %eax
 	RETURN
 
 L(Byte2):
-#ifdef USE_AS_STRNCMP
-	cmp	$2, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$2, REM
 	jbe	L(eq)
 #endif
 	movzx	2(%eax), %ecx
 	movzx	2(%edx), %eax
 
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
 	sub	%ecx, %eax
 	RETURN
 
 L(Byte3):
-#ifdef USE_AS_STRNCMP
-	cmp	$3, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$3, REM
 	jbe	L(eq)
 #endif
 	movzx	3(%eax), %ecx
 	movzx	3(%edx), %eax
 
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
 	sub	%ecx, %eax
 	RETURN
 
 L(Byte4):
-#ifdef USE_AS_STRNCMP
-	cmp	$4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$4, REM
 	jbe	L(eq)
 #endif
 	movzx	4(%eax), %ecx
 	movzx	4(%edx), %eax
 
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
 	sub	%ecx, %eax
 	RETURN
 
 L(Byte5):
-#ifdef USE_AS_STRNCMP
-	cmp	$5, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$5, REM
 	jbe	L(eq)
 #endif
 	movzx	5(%eax), %ecx
 	movzx	5(%edx), %eax
 
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
 	sub	%ecx, %eax
 	RETURN
 
 L(Byte6):
-#ifdef USE_AS_STRNCMP
-	cmp	$6, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$6, REM
 	jbe	L(eq)
 #endif
 	movzx	6(%eax), %ecx
 	movzx	6(%edx), %eax
+
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
 
 	sub	%ecx, %eax
 	RETURN
@@ -1990,9 +2291,9 @@
 L(2next_8_bytes):
 	add	$8, %eax
 	add	$8, %edx
-#ifdef USE_AS_STRNCMP
-	cmp	$8, %ebp
-	lea	-8(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$8, REM
+	lea	-8(REM), REM
 	jbe	L(eq)
 #endif
 
@@ -2017,194 +2318,455 @@
 	test	$0x40, %ch
 	jnz	L(Byte6)
 
-#ifdef USE_AS_STRNCMP
-	cmp	$7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	cmp	$7, REM
 	jbe	L(eq)
 #endif
 	movzx	7(%eax), %ecx
 	movzx	7(%edx), %eax
 
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
 	sub	%ecx, %eax
 	RETURN
 
+#ifdef USE_AS_STRNCMP
+L(neq_sncmp):
+#endif
 L(neq):
 	mov	$1, %eax
 	ja	L(neq_bigger)
 	neg	%eax
 L(neq_bigger):
-#ifdef USE_AS_STRNCMP
-	POP	(%ebp)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+	addl	$4, %esp
+	cfi_adjust_cfa_offset (-4)
+#endif
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	POP	(REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+	POP	(%ebx)
+# endif
 #endif
 	ret
 
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
 	.p2align 4
 	cfi_restore_state
 L(more8byteseq):
+
+# ifdef USE_AS_STRNCASECMP_L
+	addl	$4, %esp
+	cfi_adjust_cfa_offset (-4)
+# endif
 	POP	(%esi)
 	POP	(%edi)
+# ifdef USE_AS_STRNCMP
+	POP	(FLAGS)
+# endif
+#endif
+
+#ifdef USE_AS_STRNCMP
+L(eq_sncmp):
+#endif
+L(eq):
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	POP	(REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
 	POP	(%ebx)
-#endif
-
-L(eq):
-
-#ifdef USE_AS_STRNCMP
-	POP	(%ebp)
+# endif
 #endif
 	xorl	%eax, %eax
 	ret
 
-#ifdef USE_AS_STRNCMP
-	.p2align 4
-	CFI_PUSH (%ebp)
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+	.p2align 4
+# if defined USE_AS_STRNCASECMP_L && defined PIC
+	CFI_PUSH (%ebx)
+# endif
+	CFI_PUSH (REM)
 L(less16bytes_sncmp):
-	test	%ebp, %ebp
-	jz	L(eq)
+# ifdef USE_AS_STRNCASECMP_L
+	PUSH	(%esi)
+# endif
+	test	REM, REM
+	jz	L(eq_sncmp)
 
 	movzbl	(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, (%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
 	je	L(eq)
 
-	cmp	$1, %ebp
-	je	L(eq)
+	cmp	$1, REM
+	je	L(eq_sncmp)
 
 	movzbl	1(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	1(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 1(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$2, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$2, REM
+	je	L(eq_sncmp)
 
 	movzbl	2(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	2(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 2(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$3, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$3, REM
+	je	L(eq_sncmp)
 
 	movzbl	3(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	3(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 3(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$4, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$4, REM
+	je	L(eq_sncmp)
 
 	movzbl	4(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	4(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 4(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$5, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$5, REM
+	je	L(eq_sncmp)
 
 	movzbl	5(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	5(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 5(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$6, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$6, REM
+	je	L(eq_sncmp)
 
 	movzbl	6(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	6(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 6(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$7, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$7, REM
+	je	L(eq_sncmp)
 
 	movzbl	7(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	7(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 7(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-
-	cmp	$8, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+
+	cmp	$8, REM
+	je	L(eq_sncmp)
 
 	movzbl	8(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	8(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 8(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$9, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$9, REM
+	je	L(eq_sncmp)
 
 	movzbl	9(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	9(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 9(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$10, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$10, REM
+	je	L(eq_sncmp)
 
 	movzbl	10(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	10(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 10(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$11, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$11, REM
+	je	L(eq_sncmp)
 
 	movzbl	11(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	11(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 11(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-
-	cmp	$12, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+
+	cmp	$12, REM
+	je	L(eq_sncmp)
 
 	movzbl	12(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	12(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 12(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$13, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$13, REM
+	je	L(eq_sncmp)
 
 	movzbl	13(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	13(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 13(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$14, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$14, REM
+	je	L(eq_sncmp)
 
 	movzbl	14(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	14(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 14(%edx)
-	jne	L(neq)
+# endif
+	jne	L(neq_sncmp)
 	test	%cl, %cl
-	je	L(eq)
-
-	cmp	$15, %ebp
-	je	L(eq)
+	je	L(eq_sncmp)
+
+	cmp	$15, REM
+	je	L(eq_sncmp)
 
 	movzbl	15(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+	movzbl	15(%edx), %esi
+#  ifdef PIC
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+#  else
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+	movl	_nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+#  endif
+	cmpl	%ecx, %esi
+# else
 	cmpb	%cl, 15(%edx)
-	jne	L(neq)
-
-	POP	(%ebp)
+# endif
+	jne	L(neq_sncmp)
+
+# ifdef USE_AS_STRNCASECMP_L
+L(eq_sncmp):
+	POP	(%esi)
+# endif
+	POP	(REM)
+# if defined USE_AS_STRNCASECMP_L && defined PIC
+	POP	(%ebx)
+# endif
 	xor	%eax, %eax
 	ret
+
+# ifdef USE_AS_STRNCASECMP_L
+	.p2align 4
+#  ifdef PIC
+	CFI_PUSH (%ebx)
+#  endif
+	CFI_PUSH (REM)
+	CFI_PUSH (%esi)
+L(neq_sncmp):
+	mov	$1, %eax
+	mov	$-1, %edx
+	cmovna	%edx, %eax
+	POP	(%esi)
+	POP	(REM)
+#  ifdef PIC
+	POP	(%ebx)
+#  endif
+	ret
+# endif
 #endif
 
 END (STRCMP)

Modified: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp.S (original)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcmp.S Tue Nov 15 00:02:11 2011
@@ -1,5 +1,5 @@
 /* Multiple versions of strcmp
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
@@ -21,18 +21,30 @@
 #include <sysdep.h>
 #include <init-arch.h>
 
-#ifndef USE_AS_STRNCMP
+#ifdef USE_AS_STRNCMP
+# define STRCMP			strncmp
+# define __GI_STRCMP		__GI_strncmp
+# define __STRCMP_IA32		__strncmp_ia32
+# define __STRCMP_SSSE3		__strncmp_ssse3
+# define __STRCMP_SSE4_2	__strncmp_sse4_2
+#elif defined USE_AS_STRCASECMP_L
+# define STRCMP			__strcasecmp_l
+# define __GI_STRCMP		__GI_strcasecmp_l
+# define __STRCMP_IA32		__strcasecmp_l_ia32
+# define __STRCMP_SSSE3		__strcasecmp_l_ssse3
+# define __STRCMP_SSE4_2	__strcasecmp_l_sse4_2
+#elif defined USE_AS_STRNCASECMP_L
+# define STRCMP			__strncasecmp_l
+# define __GI_STRCMP		__GI_strncasecmp_l
+# define __STRCMP_IA32		__strncasecmp_l_ia32
+# define __STRCMP_SSSE3		__strncasecmp_l_ssse3
+# define __STRCMP_SSE4_2	__strncasecmp_l_sse4_2
+#else
 # define STRCMP			strcmp
 # define __GI_STRCMP		__GI_strcmp
 # define __STRCMP_IA32		__strcmp_ia32
 # define __STRCMP_SSSE3		__strcmp_ssse3
 # define __STRCMP_SSE4_2	__strcmp_sse4_2
-#else
-# define STRCMP			strncmp
-# define __GI_STRCMP		__GI_strncmp
-# define __STRCMP_IA32		__strncmp_ia32
-# define __STRCMP_SSSE3		__strncmp_ssse3
-# define __STRCMP_SSE4_2	__strncmp_sse4_2
 #endif
 
 /* Define multiple versions only for the definition in libc.  Don't

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase-c.c
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase-c.c (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase-c.c Tue Nov 15 00:02:11 2011
@@ -1,0 +1,8 @@
+#include <string.h>
+
+extern __typeof (strncasecmp) __strncasecmp_nonascii;
+
+#define __strncasecmp __strncasecmp_nonascii
+#include <string/strncase.c>
+
+strong_alias (__strncasecmp_nonascii, __strncasecmp_ia32)

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,68 @@
+/* Entry point for multi-version x86 strncasecmp.
+   Copyright (C) 2011 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sysdep.h>
+#include <init-arch.h>
+
+#ifdef SHARED
+	.text
+ENTRY(__strncasecmp)
+	.type	__strncasecmp, @gnu_indirect_function
+	pushl	%ebx
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (ebx, 0)
+	call	__i686.get_pc_thunk.bx
+	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
+	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
+	jne	1f
+	call	__init_cpu_features
+1:	leal	__strncasecmp_ia32@GOTOFF(%ebx), %eax
+	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
+	jz	2f
+	leal	__strncasecmp_ssse3@GOTOFF(%ebx), %eax
+	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
+	jz	2f
+	leal	__strncasecmp_sse4_2@GOTOFF(%ebx), %eax
+2:	popl	%ebx
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (ebx)
+	ret
+END(__strncasecmp)
+#else
+	.text
+ENTRY(__strncasecmp)
+	.type	__strncasecmp, @gnu_indirect_function
+	cmpl	$0, KIND_OFFSET+__cpu_features
+	jne	1f
+	call	__init_cpu_features
+1:	leal	__strncasecmp_ia32, %eax
+	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
+	jz	2f
+	leal	__strncasecmp_ssse3, %eax
+#if 0
+	// XXX Temporarily
+	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
+	jz	2f
+	leal	__strncasecmp_sse4_2, %eax
+#endif
+2:	ret
+END(__strncasecmp)
+#endif
+
+weak_alias (__strncasecmp, strncasecmp)

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-c.c
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-c.c (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-c.c Tue Nov 15 00:02:11 2011
@@ -1,0 +1,11 @@
+#include <string.h>
+
+extern __typeof (strncasecmp_l) __strncasecmp_l_nonascii;
+
+#define __strncasecmp_l __strncasecmp_l_nonascii
+#define USE_IN_EXTENDED_LOCALE_MODEL    1
+#include <string/strncase.c>
+
+/* The needs of strcasecmp in libc are minimal, no need to go through
+   the IFUNC.  */
+strong_alias (__strncasecmp_l_nonascii, __GI___strncasecmp_l)

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,2 @@
+#define USE_AS_STRNCASECMP_L 1
+#include "strcmp-sse4.S"

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,2 @@
+#define USE_AS_STRNCASECMP_L 1
+#include "strcmp-ssse3.S"

Added: fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l.S (added)
+++ fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase_l.S Tue Nov 15 00:02:11 2011
@@ -1,0 +1,5 @@
+#define STRCMP __strncasecmp_l
+#define USE_AS_STRNCASECMP_L
+#include "strcmp.S"
+
+weak_alias (__strncasecmp_l, strncasecmp_l)

Modified: fsf/trunk/libc/time/tzfile.c
==============================================================================
--- fsf/trunk/libc/time/tzfile.c (original)
+++ fsf/trunk/libc/time/tzfile.c Tue Nov 15 00:02:11 2011
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-1993,1995-2001,2003,2004,2006,2007,2009
+/* Copyright (C) 1991-1993,1995-2001,2003,2004,2006,2007,2009,2011
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -178,8 +178,8 @@
     }
 
   /* Note the file is opened with cancellation in the I/O functions
-     disabled.  */
-  f = fopen (file, "rc");
+     disabled and if available FD_CLOEXEC set.  */
+  f = fopen (file, "rce");
   if (f == NULL)
     goto ret_free_transitions;
 

_______________________________________________
Commits mailing list
Commits@xxxxxxxxxx
http://eglibc.org/cgi-bin/mailman/listinfo/commits