master: Get the encodable ranges right for SAP-REF-{8, 16, 32}

stassats via Sbcl-commits <[email protected]> Sun, 12 Jul 2026 19:52:00 +0000
Newsgroups gmane.lisp.steel-bank.cvs
Message-ID <[email protected]>
The branch "master" has been updated in SBCL:
       via  90ce44aad599b74ab63595167f276fccd6f8b0d6 (commit)
      from  99af116141b9be142f093e5de5bd54f4a798c52c (commit)

- Log -----------------------------------------------------------------
commit 90ce44aad599b74ab63595167f276fccd6f8b0d6
Author: Hayley Patton <[email protected]>
Date:   Sat Jul 11 15:44:25 2026 +1000

    Get the encodable ranges right for SAP-REF-{8,16,32}
---
 src/compiler/arm64/insts.lisp |  8 +++++++-
 src/compiler/arm64/sap.lisp   | 30 +++++++++++++++---------------
 src/compiler/arm64/vm.lisp    |  3 +++
 3 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp
index 2e60636cf..4249591b6 100644
--- a/src/compiler/arm64/insts.lisp
+++ b/src/compiler/arm64/insts.lisp
@@ -19,7 +19,9 @@
             negative-add-sub-immediate-p
             encode-logical-immediate fixnum-encode-logical-immediate
             movi-immediate-p
-            ldr-str-offset-encodable ldp-stp-offset-p
+            ldr-str-offset-encodable ldr-str-8-offset-encodable
+            ldr-str-16-offset-encodable ldr-str-32-offset-encodable
+            ldp-stp-offset-p
             extend lsl lsr asr ror @ encode-fp-immediate) "SB-VM")
   ;; Imports from SB-VM into this package
   #+sb-simd-pack
@@ -1548,6 +1550,10 @@
       (multiple-value-bind (qout rem) (truncate offset (truncate size 8))
         (and (zerop rem)
              (typep qout '(unsigned-byte 12))))))
+;; kludge for SATISFIES types in sap.lisp
+(defun ldr-str-8-offset-encodable (offset) (ldr-str-offset-encodable offset 8))
+(defun ldr-str-16-offset-encodable (offset) (ldr-str-offset-encodable offset 16))
+(defun ldr-str-32-offset-encodable (offset) (ldr-str-offset-encodable offset 32))
 
 (defun emit-load-store (size opc segment dst address &optional vector-size)
   (let* ((base (memory-operand-base address))
diff --git a/src/compiler/arm64/sap.lisp b/src/compiler/arm64/sap.lisp
index c6fd024c3..0f10692c6 100644
--- a/src/compiler/arm64/sap.lisp
+++ b/src/compiler/arm64/sap.lisp
@@ -146,7 +146,7 @@
 
 ;;;; mumble-SYSTEM-REF and mumble-SYSTEM-SET
 (macrolet ((def-system-ref-and-set
-               (ref-name set-name sc type size &key signed)
+               (ref-name set-name sc type size offset-test &key signed)
              `(progn
                 ,@(when (implements-cas-sap-ref ref-name)
                     (multiple-value-bind (load store cas)
@@ -248,7 +248,7 @@
                   (:policy :fast-safe)
                   (:args (sap :scs (sap-reg)))
                   (:info offset)
-                  (:arg-types system-area-pointer (:constant (satisfies ldr-str-offset-encodable)))
+                  (:arg-types system-area-pointer (:constant (satisfies ,offset-test)))
                   (:RESULTS (result :scs (,sc)))
                   (:result-types ,type)
                   (:generator 4
@@ -268,7 +268,7 @@
                   (:args (value :scs (,sc zero))
                          (sap :scs (sap-reg)))
                   (:info offset)
-                  (:arg-types ,type system-area-pointer (:constant (satisfies ldr-str-offset-encodable)))
+                  (:arg-types ,type system-area-pointer (:constant (satisfies ,offset-test)))
                   (:generator 4
                     (inst ,(case size
                              (:byte 'strb)
@@ -279,29 +279,29 @@
                            'value)
                       (@ sap offset)))))))
   (def-system-ref-and-set sap-ref-8 %set-sap-ref-8
-    unsigned-reg positive-fixnum :byte :signed nil)
+    unsigned-reg positive-fixnum :byte ldr-str-8-offset-encodable :signed nil)
   (def-system-ref-and-set signed-sap-ref-8 %set-signed-sap-ref-8
-    signed-reg tagged-num :byte :signed t)
+    signed-reg tagged-num :byte ldr-str-8-offset-encodable :signed t)
   (def-system-ref-and-set sap-ref-16 %set-sap-ref-16
-    unsigned-reg positive-fixnum :short :signed nil)
+    unsigned-reg positive-fixnum :short ldr-str-16-offset-encodable :signed nil)
   (def-system-ref-and-set signed-sap-ref-16 %set-signed-sap-ref-16
-    signed-reg tagged-num :short :signed t)
+    signed-reg tagged-num :short ldr-str-16-offset-encodable :signed t)
   (def-system-ref-and-set sap-ref-32 %set-sap-ref-32
-    unsigned-reg unsigned-num :word :signed nil)
+    unsigned-reg unsigned-num :word ldr-str-32-offset-encodable :signed nil)
   (def-system-ref-and-set signed-sap-ref-32 %set-signed-sap-ref-32
-    signed-reg signed-num :word :signed t)
+    signed-reg signed-num :word ldr-str-32-offset-encodable :signed t)
   (def-system-ref-and-set sap-ref-64 %set-sap-ref-64
-    unsigned-reg unsigned-num :long :signed nil)
+    unsigned-reg unsigned-num :long ldr-str-offset-encodable :signed nil)
   (def-system-ref-and-set signed-sap-ref-64 %set-signed-sap-ref-64
-    signed-reg signed-num :long :signed t)
+    signed-reg signed-num :long ldr-str-offset-encodable :signed t)
   (def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
-    sap-reg system-area-pointer :long)
+    sap-reg system-area-pointer :long ldr-str-offset-encodable)
   (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj
-    descriptor-reg * :long)
+    descriptor-reg * :long ldr-str-offset-encodable)
   (def-system-ref-and-set sap-ref-single %set-sap-ref-single
-    single-reg single-float :single)
+    single-reg single-float :single ldr-str-32-offset-encodable)
   (def-system-ref-and-set sap-ref-double %set-sap-ref-double
-    double-reg double-float :double))
+    double-reg double-float :double ldr-str-offset-encodable))
 
 (define-vop (%sap-ref-indexed)
   (:translate %sap-ref-16-indexed %sap-ref-32-indexed %sap-ref-64-indexed)
diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp
index d7ea7d1a8..b55201bcc 100644
--- a/src/compiler/arm64/vm.lisp
+++ b/src/compiler/arm64/vm.lisp
@@ -366,4 +366,7 @@
         bic-fixnum-encode-immediate
         logical-immediate-or-word-mask
         sb-arm64-asm::ldr-str-offset-encodable
+        sb-arm64-asm::ldr-str-8-offset-encodable
+        sb-arm64-asm::ldr-str-16-offset-encodable
+        sb-arm64-asm::ldr-str-32-offset-encodable
         power-of-two-p))

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


hooks/post-receive
-- 
SBCL