Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F154839967
D46398.id142310.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D46398.id142310.diff
View Options
diff --git a/lib/libc/aarch64/string/Makefile.inc b/lib/libc/aarch64/string/Makefile.inc
--- a/lib/libc/aarch64/string/Makefile.inc
+++ b/lib/libc/aarch64/string/Makefile.inc
@@ -20,6 +20,8 @@
strnlen \
strrchr
+MDSRCS+= strcspn.S
+
#
# Add the above functions. Generate an asm file that includes the needed
# Arm Optimized Routines file defining the function name to the libc name.
diff --git a/lib/libc/aarch64/string/strcspn.S b/lib/libc/aarch64/string/strcspn.S
new file mode 100644
--- /dev/null
+++ b/lib/libc/aarch64/string/strcspn.S
@@ -0,0 +1,107 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 Getz Mikalsen <getz@FreeBSD.org>
+*/
+
+#include <machine/asm.h>
+
+ .weak strcspn
+ .set strcspn, __strcspn
+ .text
+
+ENTRY(__strcspn)
+
+ stp x29, x30, [sp, #-16]!
+ mov x29, sp
+ sub sp, sp, #256 // allocate 256 bytes on the stack
+
+ /* check for special cases */
+ ldrb w4, [x1] // first character in the set
+ cbz w4, .Lstrlen
+
+ mov x15, #1 // preload register with 1 for stores
+
+ ldrb w5, [x1, #1] // second character in the set
+ cbz w5, .Lstrchr
+
+ /* no special case matches -- prepare lookup table */
+ mov w3, #28
+
+0: add x9, sp, x3, lsl #3
+ stp xzr, xzr, [x9]
+ stp xzr, xzr, [x9, #16]
+ subs w3, w3, #4
+ b.cs 0b
+
+ add x1, x1, #2
+ strb w15, [sp, x4] // register first chars in the set
+ strb w15, [sp, x5]
+
+ mov x4, x0 // stash a copy of src
+
+ /* process remaining chars in set */
+ .p2align 4
+0: ldrb w5, [x1]
+ strb w15, [sp, x5]
+ cbz w5, 1f // end of set?
+
+ ldrb w5, [x1, #1]
+ strb w15, [sp, x5]
+ cbz w5, 1f
+
+ add x1, x1, #2
+ b 0b
+
+ /* find match */
+ .p2align 4
+1: ldrb w8, [x0]
+ ldrb w9, [sp, x8]
+ cmp w9, #0
+ b.ne 2f
+
+ ldrb w8, [x0, #1]
+ ldrb w9, [sp, x8]
+ cmp w9, #0
+ b.ne 3f
+
+ ldrb w8, [x0, #2]
+ ldrb w9, [sp, x8]
+ cmp w9, #0
+ b.ne 4f
+
+ ldrb w8, [x0, #3]
+ add x0, x0, #4
+ ldrb w9, [sp, x8]
+ cmp w9, #0
+ b.eq 1b
+
+ sub x0, x0, #3 // fix up return value
+4: sub x4, x4, #1
+3: add x0, x0, #1
+2: sub x0, x0, x4
+ mov sp, x29
+ ldp x29, x30, [sp], #16 // restore sp and lr
+ ret
+
+ /* set is empty, degrades to strlen */
+.Lstrlen:
+ mov sp, x29
+ ldp x29, x30, [sp], #16 // restore sp and lr
+ b strlen
+
+ /* just one character in set, degrades to strchrnul */
+.Lstrchr:
+ stp x0, x1, [sp, #-32]!
+ mov x1, x4
+
+ bl strchrnul
+
+ ldp x18, x17, [sp], #16 // restore stashed src
+ sub x0, x0, x18
+
+ mov sp, x29
+ ldp x29, x30, [sp], #16 // Restore sp and lr
+ ret
+
+END(__strcspn)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Apr 30, 2:04 PM (9 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32522408
Default Alt Text
D46398.id142310.diff (2 KB)
Attached To
Mode
D46398: lib/libc/aarch64/string: add strcspn optimized implementation
Attached
Detach File
Event Timeline
Log In to Comment