[PATCH] x86-64: Update strlen.S to support wcslen/wcsnlen
H.J. Lu
hjl.tools@gmail.com
Tue Jun 6 12:37:00 GMT 2017
On Mon, Jun 5, 2017 at 10:37 PM, Markus Trippelsdorf
<markus@trippelsdorf.de> wrote:
> 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
>
Please try this. Sorry for the breakage.
--
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-x86-64-Move-wcsnlen.S-to-multiarch-wcsnlen-sse4_1.S.patch
Type: text/x-patch
Size: 6759 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20170606/a6017051/attachment.bin>
More information about the Libc-alpha
mailing list