master: x86-64, utf8-sap-to-string: remove redundant moves
stassats via Sbcl-commits <[email protected]> Sun, 19 Jul 2026 04:51:55 +0000
| Newsgroups | gmane.lisp.steel-bank.cvs |
|---|---|
| Message-ID | <[email protected]> |
The branch "master" has been updated in SBCL:
via 0843efc927405e31a970cfd145fe845f29d0923b (commit)
from 26a27bc8d8ccf9a921c950463f77c4f1533eb5b3 (commit)
- Log -----------------------------------------------------------------
commit 0843efc927405e31a970cfd145fe845f29d0923b
Author: Stas Boukarev <[email protected]>
Date: Sun Jul 19 06:35:23 2026 +0300
x86-64, utf8-sap-to-string: remove redundant moves
---
src/code/x86-64-simd.lisp | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp
index 4ee3c78b4..f3eed8afe 100644
--- a/src/code/x86-64-simd.lisp
+++ b/src/code/x86-64-simd.lisp
@@ -2322,7 +2322,6 @@
(inst vmovd x2 tmp)
(inst vpbroadcastb c-c0 x2)
-
(inst mov tmp #xDF)
(inst vmovd x2 tmp)
(inst vpbroadcastb c-df x2)
@@ -2357,7 +2356,6 @@
;; suitable for the lookup table
(inst vpcmpgtb x3 c-c0 current)
(inst vpmovmskb tmp2 x3)
- (inst and :dword tmp2 #xFF)
(inst shl :dword tmp2 4)
(inst vpmovzxbw x3 current)
@@ -2398,9 +2396,6 @@
(convert-1-2 START-FULL)
START-FULL
- (inst mov tmp #xC0)
- (inst vmovd c-c0 tmp)
- (inst vpbroadcastb c-c0 c-c0)
(inst mov tmp #xFF)
(inst vmovd c-00ff tmp)
@@ -2454,16 +2449,14 @@
(inst vpcmpgtb x2 current c-c0)
;; Turn them into an 8 bit index
(inst vpmovmskb tmp x2)
- (inst mov :dword index tmp)
- (inst and :dword index #xFF)
+ (inst movzx '(:byte :dword) index tmp)
(inst popcnt :dword produced index)
;; Count the number of bytes to the next leading byte, turning it into a 2 bit suffix
- (inst mov :dword tmp2 tmp)
- (inst shr :dword tmp2 8)
- (inst tzcnt :dword tmp2 tmp2)
- (inst shl :dword tmp2 8)
- (inst or :dword index tmp2)
+ (inst shr :dword tmp 8)
+ (inst tzcnt :dword tmp tmp)
+ (inst shl :dword tmp 8)
+ (inst or :dword index tmp)
(inst shl :dword index 5)
@@ -2501,7 +2494,7 @@
;; continuation bytes into the next word, (and can't
;; add suffix to byte-index, as it will kill out of
;; order execution)
- (inst test :dword tmp2 tmp2)
+ (inst test :dword tmp tmp)
(inst jmp :nz FULL-LOOP)
(convert-1-2 FULL-LOOP)))
@@ -2571,6 +2564,7 @@
((table sap-reg t))
((full-table sap-reg t))
((tmp unsigned-reg))
+ ((multiplier unsigned-reg))
((temp complex-double-reg))
((bytes complex-double-reg))
((c-3f complex-double-reg))
@@ -2688,10 +2682,10 @@
;; Either select two bytes or one byte
(inst vpblendvb bytes high-bytes bytes ascii)
;; Shrink the mask from 16 bits to 8 bits
- (inst vpacksswb ascii ascii ascii)
+ (inst vpacksswb ascii ascii zero)
;; Remove the zero second byte from ascii words
(inst vpmovmskb tmp ascii)
- (inst and :dword tmp 255)
+
(inst shl :dword tmp 4)
(inst vpshufb bytes bytes (ea table tmp))
(if (eq size 32)
@@ -2724,16 +2718,14 @@
(inst vpsubd temp zero temp)
;; Build an 8-bit index mask
- ;; Pack four 32-bit values down to four 8-bit values in the lowest 32 bits
+ ;; Narrow to 16 bits, making a 64-bit mask
(inst vpackusdw temp temp temp)
- (inst vpackuswb temp temp temp)
- (inst vmovd tmp temp)
+ (inst vmovq tmp temp)
;; Multiplying by 1 + 2^6 + 2^12 + 2^18
;; shifts two bits per byte into the upper byte
- (inst imul :dword tmp tmp #x01041040)
- (inst shr :dword tmp 24)
- (inst shl :dword tmp 6)
+ (inst imul tmp multiplier)
+ (inst shr tmp (- 56 6)) ;; shift left 6 for the table entry size
;; Spread the character to all 4 bytes
(inst vpslld t1 bytes 6)
@@ -2790,6 +2782,8 @@
(inst mov tmp #x7f)
(inst vmovd temp tmp)
(inst vpbroadcastd c-7f temp)
+ (inst mov multiplier #x0100040010004000)
+
FULL-LENGTH
(convert-full)
-----------------------------------------------------------------------
hooks/post-receive
--
SBCL