master: arm64: speed up length calculation in copy-character-string-to-utf8

stassats via Sbcl-commits <[email protected]> Fri, 17 Jul 2026 01:32:04 +0000
Newsgroups gmane.lisp.steel-bank.cvs
Message-ID <[email protected]>
The branch "master" has been updated in SBCL:
       via  b30453bed86f63775b059cf5b995db394d7fc150 (commit)
      from  0c48a0eec151962c3c3f69341eb0925ec9db526e (commit)

- Log -----------------------------------------------------------------
commit b30453bed86f63775b059cf5b995db394d7fc150
Author: Stas Boukarev <[email protected]>
Date:   Fri Jul 17 04:04:01 2026 +0300

    arm64: speed up length calculation in copy-character-string-to-utf8
---
 src/code/arm64-simd.lisp | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp
index b2cc9af8a..0903c3074 100644
--- a/src/code/arm64-simd.lisp
+++ b/src/code/arm64-simd.lisp
@@ -1952,15 +1952,13 @@
                        ((f3 complex-double-reg t :offset 3))
                        ((bytes complex-double-reg t :offset 4))
                        ((bytes2 complex-double-reg t :offset 5))
-                       ((m1 complex-double-reg t))
                        ((r4 complex-double-reg t))
+                       ((length1 complex-double-reg t :offset 10))
+                       ((length2 complex-double-reg t :offset 11))
                        ((shuf-mask complex-double-reg t :offset 6))
                        ((and-mask complex-double-reg t :offset 7))
                        ((orr-mask complex-double-reg t :offset 8))
-                       ((shift-mask complex-double-reg t))
-                       ((c-10000 complex-double-reg t))
-                       ((c-800 complex-double-reg t))
-                       ((c-80-4s complex-double-reg t)))
+                       ((shift-mask complex-double-reg t)))
               ((byte-index unsigned-reg positive-fixnum :from :load)
                (char-index unsigned-reg positive-fixnum :from :load))
             (inst movi c-80 #x80 :8h)
@@ -2098,14 +2096,9 @@
                      (inst ushr f3 bytes 6 :4s)
 
                      ;; Compute utf8 lengths - 1
-                     (inst movi temp 3 :4s)
-                     (inst cmhi m1 c-80-4s bytes :4s)
-                     (inst add temp temp m1 :4s)
-                     (inst cmhi m1 c-800 bytes :4s)
-                     (inst add temp temp m1 :4s)
-                     (inst cmhi m1 c-10000 bytes :4s)
-                     (inst add temp temp m1 :4s)
-
+                     (inst clz temp bytes :4s)
+                     ;; Map leading zeros to utf8 lengths
+                     (inst tbl temp (list length1 length2) temp :16b)
                      (inst addv r4 temp :4s) ;; total length in utf-8 bytes - 4
 
                      ;; Shift by 0 2 4 6
@@ -2156,10 +2149,9 @@
 
                 START-FULL-LENGTH
                 (load-inline-constant shift-mask :oword #x6000000040000000200000000)
-                (inst movi c-10000 #x10000 :4s)
-                (inst movi c-800 #x800 :4s)
-                (inst movi c-80-4s #x80 :4s)
                 (load-inline-constant full-table (make-full-table))
+                (inst movi length1 3 :16b)
+                (load-inline-constant length2 :oword #x00000000000000010101010202020202)
                 FULL-LENGTH
                 (convert-full)
 

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


hooks/post-receive
-- 
SBCL