Loading...
arm/string/strnlen.s Libc-825.26 Libc-763.13
--- Libc/Libc-825.26/arm/string/strnlen.s
+++ Libc/Libc-763.13/arm/string/strnlen.s
@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 2011 Apple, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-#include <arm/arch.h>
-.syntax unified
-.code 32
-.globl _strnlen
-
-#define addr r0
-#define maxl r1
-#define temp r2
-#define mask r3
-#define save ip
-#define word lr
-#define byte lr
-#define indx r0
-
-.macro IfHS_and_WordDoesntContainNUL_SetZ
-#if defined _ARM_ARCH_6
-//  In each word of the string, we check for NUL bytes via a saturating
-//  unsigned subtraction of each byte from 0x1.  The result of this is
-//  non-zero if and only if the corresponding byte in the string is NUL.
-//  Simply using a TST instruction checks all four bytes for NULs in one
-//  go.
-    uqsub8  temp,   mask,   word
-    tsths   temp,           temp
-#else
-//  If we're on armv5, we do not have the uqsub8 instruction, so we need
-//  to use a different test for NUL.  Instead, we compute:
-//
-//      byte - 0x1 & ~byte
-//
-//  and test the high-order bit.  If it is set, then byte is NUL.  Just
-//  as with the other test, this can be applied simultaneously to all
-//  bytes in a word.
-    sub     temp,   word,   mask
-    bic     temp,   temp,   word
-    tsths   temp,           mask, lsl #7
-#endif
-.endm
-
-.text
-.align 3
-.long 0x0           // padding
-.long 0x01010101    // mask for use in finding NULs
-_strnlen:
-//  Establish stack frame, load mask that we will use to find NUL bytes,
-//  and set aside a copy of the pointer to the string.  Subtract 4 from
-//  the maxlen, and jump into a byte-by-byte search if this requires a
-//  borrow, as we cannot use a word-by-word search in that case.
-    push    {r7,lr}
-    mov     r7,     sp
-    ldr     mask,   (_strnlen-4)
-    add		save,   addr,   #4
-    subs    maxl,   maxl,   #4
-    blo     L_bytewiseSearch
-
-//  Load the aligned word that contains the start of the string, then OR
-//  0x01 into any bytes that preceed the start to prevent false positives
-//  when we check for NUL bytes.  Additionally, add the number of unused
-//  bytes to maxlen.
-    and     temp,   addr,   #3
-    bic     addr,   addr,   #3
-    add     maxl,   maxl,   temp
-    lsl     temp,   temp,   #3
-    ldr     word,  [addr],  #4
-    rsb     temp,   temp,   #32
-    orr     word,   word,   mask, lsr temp
-
-    subs    maxl,   maxl,   #4
-    IfHS_and_WordDoesntContainNUL_SetZ
-    bne     1f
-
-.align 4
-0:  ldr     word,  [addr],  #4
-    subs    maxl,   maxl,   #4
-    IfHS_and_WordDoesntContainNUL_SetZ
-    beq     0b
-
-.align 4
-//  Either the last word that we loaded contained a NUL, or we will
-//  exceed maxlen before we finish the next word in the string.  Determine
-//  which case we are in by repeating the check for NUL, and branch if
-//  there was not a NUL byte.  Padding ensures that we don't have two
-//  branches in a single 16-byte fetch group, as this interferes with
-//  branch prediction on Swift.
-1:  tst     temp,           temp
-    beq     L_bytewiseSearch
-
-//  The last word that we loaded contained a NUL.  Subtracting the saved
-//  pointer from the current pointer gives us the number of bytes from
-//  the start of the string to the word containing the NUL.
-    sub     indx,   addr,   save
-#if defined _ARM_ARCH_6
-//  To that we add the index of the first NUL byte in the word, computed
-//  using REV and CLZ followed by a shift.
-    rev     temp,           temp
-    clz     temp,           temp
-    add     indx,   indx,   temp, lsr #3
-#else
-//  armv5 does not have the REV instruction, so instead we find the
-//  index of the NUL byte in word with a linear search.
-    tst     word,           #0x000000ff
-    addne   indx,           #1
-    tstne   word,           #0x0000ff00
-    addne   indx,           #1
-    tstne   word,           #0x00ff0000
-    addne   indx,           #1
-#endif
-    pop     {r7,pc}
-
-.align 4
-L_bytewiseSearch:
-//  Restore maxlen (the last thing that happened before we branched here
-//  was that we subtracted 4 from maxlen), and adjust the saved string
-//  pointer.  Then we do a simple byte-by-byte search until we either
-//  reach the end of the string or maxlen reaches zero, at which point
-//  the length to return is simply the difference between the current
-//  and saved pointers.
-    adds    maxl,   maxl,   #4
-    sub     save,   save,   #4
-    beq     1f
-0:  ldrb    byte,          [addr]
-    cmp     byte,           #0
-    addhi   addr,           #1
-    subshi  maxl,           #1
-    bhi     0b
-1:  sub     indx,   addr,   save
-    pop     {r7,pc}