]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: Remove unnecessary overflow check from wcsnlen-sse4_1.S
authorNoah Goldstein <goldstein.w.n@gmail.com>
Wed, 23 Jun 2021 23:19:34 +0000 (19:19 -0400)
committerNoah Goldstein <goldstein.w.n@gmail.com>
Thu, 24 Jun 2021 23:14:19 +0000 (19:14 -0400)
No bug. The way wcsnlen will check if near the end of maxlen
is the following macro:

mov %r11, %rsi; \
subq %rax, %rsi; \
andq $-64, %rax; \
testq $-64, %rsi; \
je L(strnlen_ret)

Which words independently of s + maxlen overflowing. So the
second overflow check is unnecissary for correctness and
just extra overhead in the common no overflow case.

test-strlen.c, test-wcslen.c, test-strnlen.c and test-wcsnlen.c are
all passing

Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
sysdeps/x86_64/multiarch/strlen-vec.S

index 439e486a4317a332018fbd2a8ccdd244a5f9b130..b7657282bd2e6fa54af81f820d8f685bdf16ccdc 100644 (file)
@@ -71,19 +71,12 @@ L(n_nonzero):
    suffice.  */
        mov     %RSI_LP, %R10_LP
        sar     $62, %R10_LP
-       test    %R10_LP, %R10_LP
        jnz     __wcslen_sse4_1
        sal     $2, %RSI_LP
 # endif
 
-
 /* Initialize long lived registers.  */
-
        add     %RDI_LP, %RSI_LP
-# ifdef AS_WCSLEN
-/* Check for overflow again from s + maxlen * sizeof(wchar_t).  */
-       jbe     __wcslen_sse4_1
-# endif
        mov     %RSI_LP, %R10_LP
        and     $-64, %R10_LP
        mov     %RSI_LP, %R11_LP