]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Use strspn/strcspn/strpbrk ifunc in internal calls.
authorOndřej Bílka <neleai@seznam.cz>
Tue, 18 Mar 2014 10:01:38 +0000 (11:01 +0100)
committerOndřej Bílka <neleai@seznam.cz>
Tue, 12 May 2015 18:18:51 +0000 (20:18 +0200)
To make a strtok faster and improve performance in general we need to do one
additional change.

A comment:

/* It doesn't make sense to send libc-internal strcspn calls through a PLT.
   The speedup we get from using SSE4.2 instruction is likely eaten away
   by the indirect call in the PLT.  */

Does not make sense at all because nobody bothered to check it. Gap
between these implementations is quite big, when haystack is empty a
sse2 is around 40 cycles slower because it needs to populate a lookup
table and difference only increases with size. That is much bigger than
plt slowdown which is few cycles.

Even benchtest show a gap which also may be reverse by branch
misprediction but my internal benchmark shown.

 simple_strspn stupid_strspn __strspn_sse42  __strspn_sse2
Length    0, alignment  0, acc len  6:  18.6562 35.2344 17.0469 61.6719
Length    6, alignment  0, acc len  6:  59.5469 72.5781 16.4219 73.625

This patch also handles strpbrk which is implemented by including a
x86_64/multiarch/strcspn.S file.

* sysdeps/x86_64/multiarch/strspn.S: Remove plt indirection.
* sysdeps/x86_64/multiarch/strcspn.S: Likewise.

ChangeLog
sysdeps/x86_64/multiarch/strcspn.S
sysdeps/x86_64/multiarch/strspn.S

index 85234b355945fc423f49e12187fb2a43c97aeaac..f2f2447d22b8cd4a489f154300fc291f34239a2f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-12  Ondřej Bílka  <neleai@seznam.cz>
+
+       * sysdeps/x86_64/multiarch/strcspn.S: Remove plt indirection.
+       * sysdeps/x86_64/multiarch/strspn.S: Likewise.
+
 2015-05-12  Roland McGrath  <roland@hack.frob.com>
 
        * posix/uname-values.h: New file.
index 00e46173ae607221e424476d2616139f91662ea5..95e882c443b19451c6f6185a8c2c9360bc8d028c 100644 (file)
@@ -65,14 +65,7 @@ END(STRCSPN)
 # undef END
 # define END(name) \
        cfi_endproc; .size STRCSPN_SSE2, .-STRCSPN_SSE2
-# undef libc_hidden_builtin_def
-/* It doesn't make sense to send libc-internal strcspn calls through a PLT.
-   The speedup we get from using SSE4.2 instruction is likely eaten away
-   by the indirect call in the PLT.  */
-# define libc_hidden_builtin_def(name) \
-       .globl __GI_STRCSPN; __GI_STRCSPN = STRCSPN_SSE2
 #endif
-
 #endif /* HAVE_SSE4_SUPPORT */
 
 #ifdef USE_AS_STRPBRK
index aea8e4c945542fb486d37293d84a65987e36ea2a..b734c1729aca579d95fbbd832943d759ab9b64bf 100644 (file)
@@ -50,12 +50,6 @@ END(strspn)
 # undef END
 # define END(name) \
        cfi_endproc; .size __strspn_sse2, .-__strspn_sse2
-# undef libc_hidden_builtin_def
-/* It doesn't make sense to send libc-internal strspn calls through a PLT.
-   The speedup we get from using SSE4.2 instruction is likely eaten away
-   by the indirect call in the PLT.  */
-# define libc_hidden_builtin_def(name) \
-       .globl __GI_strspn; __GI_strspn = __strspn_sse2
 #endif
 
 #endif /* HAVE_SSE4_SUPPORT */