master: arm64: optimize simd-character-string-utf8-length

stassats via Sbcl-commits <[email protected]> Fri, 19 Jun 2026 03:25:45 +0000
Newsgroups gmane.lisp.steel-bank.cvs
Message-ID <[email protected]>
The branch "master" has been updated in SBCL:
       via  91b54fdda856b601d452a970c64f5aab53418d0b (commit)
      from  19cf152c1d8a6af7c408a56874c9bd40d7b73af5 (commit)

- Log -----------------------------------------------------------------
commit 91b54fdda856b601d452a970c64f5aab53418d0b
Author: Stas Boukarev <[email protected]>
Date:   Fri Jun 19 06:25:37 2026 +0300

    arm64: optimize simd-character-string-utf8-length
---
 src/code/arm64-simd.lisp | 151 +++++++++++++++++------------------------------
 1 file changed, 55 insertions(+), 96 deletions(-)

diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp
index 579cfcd67..791823324 100644
--- a/src/code/arm64-simd.lisp
+++ b/src/code/arm64-simd.lisp
@@ -1464,9 +1464,7 @@
          ((c-7f         complex-double-reg))
          ((c-7ff        complex-double-reg))
          ((c-ffff       complex-double-reg))
-         ((c-10ffff     complex-double-reg))
          ((c-1b         complex-double-reg))
-         ((indexes      complex-double-reg))
 
          ((extra-len    complex-double-reg))
          ((errors       complex-double-reg))
@@ -1476,119 +1474,80 @@
          ((mask         complex-double-reg)))
 
         ((res descriptor-reg t :from :load)
-         (all-ascii descriptor-reg))
-      (flet ((process-chunk ()
-               (assemble ()
-                 ;; ASCII fast path
-                 (inst umaxv tmp1 current :4s)
-                 (inst fmov tmp (reg-in-sc tmp1 'single-reg))
-                 (inst cmp tmp 127)
-                 (inst b :le DONE)
+         (all-ascii descriptor-reg t :from :load))
+      (inst mov res length)
 
-                 (inst cmhi tmp1 current c-10ffff :4s)
-                 (inst orr errors errors tmp1 :16b)
+      (load-symbol all-ascii t)
 
-                 ;; Check for surrogates #xD800-#xDFFF
-                 (inst ushr tmp1 current 11 :4s)
-                 (inst cmeq tmp1 tmp1 c-1b :4s)
-                 (inst orr errors errors tmp1 :16b)
+      (inst cbz length DONE)
 
-                 (inst cmhi tmp1 current c-7f :4s)
+      (inst lsr chars-left length n-fixnum-tag-bits)
 
-                 (inst cmhi mask current c-7ff :4s)
-                 (inst add tmp1 tmp1 mask :4s)
+      ASCII-LOOP
+      (inst ldr current (@ ptr 16 :post-index))
 
-                 (inst cmhi mask current c-ffff :4s)
-                 (inst add tmp1 tmp1 mask :4s)
+      (inst umaxv tmp1 current :4s)
+      (inst fmov tmp (reg-in-sc tmp1 'single-reg))
+      (inst cmp tmp 127)
 
-                 (inst saddlp tmp1 tmp1 :4s)
-                 (inst sub extra-len extra-len tmp1 :2d)
-                 DONE)))
-        (assemble ()
-          (inst mov res 0)
-          (load-inline-constant indexes :oword #x00000003000000020000000100000000)
-          (load-symbol all-ascii t)
-          (inst cbz length DONE)
+      (inst b :hi NON-ASCII)
+      (inst subs chars-left chars-left 4)
+      (inst b :gt ASCII-LOOP)
+      (inst b DONE)
 
-          (inst lsr chars-left length n-fixnum-tag-bits)
+      NON-ASCII
+      (inst mov res null-tn)
+      (inst movi extra-len 0 :16b)
+      (inst movi errors 0 :16b)
 
-          ASCII-LOOP
-          (inst ldr current (@ ptr 16 :post-index))
+      (inst movi c-7f  #x7F :4s)
+      (inst movi c-7ff #x7FF :4s)
+      (inst movi c-ffff #x0000ffff0000ffff :2d)
+      (inst movi c-1b  #x1b :4s)
 
-          (inst cmp chars-left 4)
+      (inst b START)
 
-          (inst b :lo ASCII-TAIL)
+      LOOP
+      (inst subs chars-left chars-left 4)
+      (inst b :le EXIT)
+      (inst ldr current (@ ptr 16 :post-index))
 
-          (inst umaxv tmp1 current :4s)
-          (inst fmov tmp (reg-in-sc tmp1 'single-reg))
-          (inst cmp tmp 127)
+      ;; ASCII fast path
+      (inst umaxv tmp1 current :4s)
+      (inst fmov tmp (reg-in-sc tmp1 'single-reg))
+      (inst cmp tmp 127)
+      (inst b :le LOOP)
 
-          (inst b :hi non-ascii)
+      START
+      ;; Check for surrogates #xD800-#xDFFF
+      (inst ushr tmp1 current 11 :4s)
+      (inst cmeq tmp1 tmp1 c-1b :4s)
+      (inst orr errors errors tmp1 :16b)
 
-          (inst subs chars-left chars-left 4)
-          (inst b :hi ASCII-LOOP)
+      (inst cmhi tmp1 current c-7f :4s)
 
-          ASCII-TAIL
-          (inst mov res length)
+      (inst cmhi mask current c-7ff :4s)
+      (inst add tmp1 tmp1 mask :4s)
 
-          ;; Clear the extra bits
-          (inst dup tmp1 chars-left :4s)
-          (inst cmhi mask tmp1 indexes :4s)
-          (inst and current current mask :16b)
+      (inst cmhi mask current c-ffff :4s)
+      (inst add tmp1 tmp1 mask :4s)
 
-          (inst umaxv tmp1 current :4s)
-          (inst fmov tmp (reg-in-sc tmp1 'single-reg))
-          (inst cmp tmp 127)
-          (inst b :hi non-ascii)
+      (inst saddlp tmp1 tmp1 :4s)
+      (inst sub extra-len extra-len tmp1 :2d)
 
+      (inst b LOOP)
 
-          (inst b DONE)
+      EXIT
+      (inst umaxv tmp1 errors :4s)
+      (inst fmov tmp (reg-in-sc tmp1 'single-reg))
+      (inst cbnz tmp DONE)
 
-          NON-ASCII
-          (inst mov res null-tn)
-          (inst movi extra-len 0 :16b)
-          (inst movi errors 0 :16b)
+      (inst addp tmp1 extra-len extra-len :2d)
+      (inst fmov tmp (reg-in-sc tmp1 'double-reg))
 
-          (inst movi c-7f  #x7F :4s)
-          (inst movi c-7ff #x7FF :4s)
-          (inst movi c-ffff #x0000ffff0000ffff :2d)
-          (inst movi c-10ffff #x10ffff :4s)
-          (inst movi c-1b  #x1b :4s)
+      (inst add res length (lsl tmp n-fixnum-tag-bits))
 
-          (inst b START)
+      (inst cmp tmp 0)
+      (inst csel all-ascii all-ascii null-tn :eq)
 
-          LOOP
-          (inst ldr current (@ ptr 16 :post-index))
-
-          START
-
-          (inst cmp chars-left 4)
-          (inst b :lo TAIL)
-
-          (process-chunk)
-
-          (inst subs chars-left chars-left 4)
-          (inst b :hi LOOP)
-
-          TAIL
-
-          (inst dup tmp1 chars-left :4s)
-          (inst cmhi mask tmp1 indexes :4s)
-          (inst and current current mask :16b)
-
-          (process-chunk)
-
-          EXIT
-          (inst umaxv tmp1 errors :4s)
-          (inst fmov tmp (reg-in-sc tmp1 'single-reg))
-          (inst cbnz tmp DONE)
-
-          (inst addp tmp1 extra-len extra-len :2d)
-          (inst fmov tmp (reg-in-sc tmp1 'double-reg))
-
-          (inst add res length (lsl tmp n-fixnum-tag-bits))
-
-          (inst cmp tmp 0)
-          (inst csel all-ascii all-ascii null-tn :eq)
-
-          DONE)))))
+      DONE)))

-----------------------------------------------------------------------


hooks/post-receive
-- 
SBCL