This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] x86-64: Update strlen.S to support wcslen/wcsnlen


On 2017.06.05 at 07:24 -0700, H.J. Lu wrote:
> On Tue, May 30, 2017 at 3:14 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> > On Sat, May 20, 2017 at 6:56 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> >> The difference between strlen and wcslen is byte vs int.  We can
> >> replace pminub and pcmpeqb with pminud and pcmpeqd to turn strlen
> >> into wcslen.  Tested on Ivy Bridge with benchtests/bench-wcslen.c,
> >> the new strlen based wcslen is as fast as the old wcslen.
> >>
> >> OK for master?
> >>
> >> H.J.
> >> ---
> >>         * sysdeps/x86_64/strlen.S (PMINU): New.
> >>         (PCMPEQ): Likewise.
> >>         (SHIFT_RETURN): Likewise.
> >>         (FIND_ZERO): Replace pcmpeqb with PCMPEQ.
> >>         (strlen): Add SHIFT_RETURN before ret.  Replace pcmpeqb and
> >>         pminub with PCMPEQ and PMINU.
> >>         * sysdeps/x86_64/wcslen.S: Define AS_WCSLEN and strlen.
> >>         Include "strlen.S".
> >>         * sysdeps/x86_64/wcsnlen.S: New file.
> >
> > Here is the updated patch only with SSE2 wcsnlen.S.  Any
> > comments?
> >
> 
> I will check it in today.

It doesn't work on old machines without SSE4.1:

FAIL: stdio-common/tstdiomisc               
FAIL: wcsmbs/test-wcpncpy                   
FAIL: wcsmbs/test-wcsncmp                   
FAIL: wcsmbs/test-wcsncpy                   
FAIL: wcsmbs/test-wcsnlen                   
FAIL: wcsmbs/wcsatcliff

markus@x4 tmp % gdb --args /var/tmp/glibc-build/elf/ld-linux-x86-64.so.2 --library-path /var/tmp/glibc-build:/var/tmp/glibc-build/math:/var/tmp/glibc-build/elf:/var/tmp/gl[31/150]d/dlfcn:/var/tmp/glibc-build/nss:/var/tmp/glibc-build/nis:/var/tmp/glibc-build/rt:/var/tmp/glibc-build/resolv:/var/tmp/glibc-build/crypt:/var/tmp/glibc-build/mathvec:/var/tmp/glib
c-build/support:/var/tmp/glibc-build/nptl /var/tmp/glibc-build/stdio-common/tstdiomisc   
Reading symbols from /var/tmp/glibc-build/elf/ld-linux-x86-64.so.2...done.               
(gdb) run                                                                                
Starting program: /home/markus/tmp/glibc-build/elf/ld-linux-x86-64.so.2 --library-path /var/tmp/glibc-build:/var/tmp/glibc-build/math:/var/tmp/glibc-build/elf:/var/tmp/glibc-build/dlfcn:/var/tmp/glibc-build/nss:/var/tmp/glibc-build/nis:/var/tmp/glibc-build/rt:/var/tmp/glibc-build/resolv:/var/tmp/glibc-build/crypt:/var/tmp/glibc-build/mathvec:/var/tmp/glibc-build/support:/var/tmp/glibc-build/nptl /var/tmp/glibc-build/stdio-common/tstdiomisc    
t1: count=5                                                                              
sscanf ("12345", "%ld", &x) => 1, x = 12345                                              
sscanf ("12345", "%llllld", &x) => 0, x = -1                                             
sscanf ("12345", "%LLLLLd", &x) => 0, x = -1                                             
sscanf ("test ", "%*s%n", &x) => 0, x = 4                                                
sscanf ("test ", "%2*s%n", &x) => 0, x = -1                                              
sscanf ("12 ", "%l2d", &x) => 0, x = -1                                                  
sscanf ("12 ", "%2ld", &x) => 1, x = 12                                                  
sscanf ("1 1", "%d %Z", &n, &N) => 1, n = 1, N = -1                                      
expected "nan NAN nan NAN nan NAN nan NAN", got "nan NAN nan NAN nan NAN nan NAN"        
expected "-nan -NAN -nan -NAN -nan -NAN -nan -NAN", got "-nan -NAN -nan -NAN -nan -NAN -nan -NAN"                                                                                  
expected "nan NAN nan NAN nan NAN nan NAN", got "nan NAN nan NAN nan NAN nan NAN"        
expected "-nan -NAN -nan -NAN -nan -NAN -nan -NAN", got "-nan -NAN -nan -NAN -nan -NAN -nan -NAN"                                                                                  expected "inf INF inf INF inf INF inf INF", got "inf INF inf INF inf INF inf INF"        
expected "-inf -INF -inf -INF -inf -INF -inf -INF", got "-inf -INF -inf -INF -inf -INF -inf -INF"                                                                                                                              
Program received signal SIGILL, Illegal instruction.                                     
wcsnlen () at ../sysdeps/x86_64/strlen.S:180                                             
180             PMINU   16(%rax), %xmm0 

-- 
Markus


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]