master: sb-simd: support for load/store to and from SAPs

stassats via Sbcl-commits <[email protected]> Sun, 02 Aug 2026 14:03:16 +0000
Newsgroups gmane.lisp.steel-bank.cvs
Message-ID <[email protected]>
The branch "master" has been updated in SBCL:
       via  a659610f72c82d9bfb8a4d9eee0eeb014f016672 (commit)
      from  1a8c99523f5a3ca874ccbf1923d686fe5ff3db4d (commit)

- Log -----------------------------------------------------------------
commit a659610f72c82d9bfb8a4d9eee0eeb014f016672
Author: arthur <[email protected]>
Date:   Fri Jul 24 12:37:09 2026 +0200

    sb-simd: support for load/store to and from SAPs
---
 contrib/sb-simd/code/define-arefs.lisp             |   2 +
 contrib/sb-simd/code/define-reffers.lisp           |  26 ++-
 contrib/sb-simd/code/define-vref-vops.lisp         |  47 ++++-
 contrib/sb-simd/code/define-vrefs.lisp             |  52 +++--
 contrib/sb-simd/code/instruction-sets/avx.lisp     | 136 +++++++-------
 contrib/sb-simd/code/instruction-sets/avx2.lisp    |  80 ++++----
 contrib/sb-simd/code/instruction-sets/neon.lisp    |  44 ++---
 contrib/sb-simd/code/instruction-sets/sb-simd.lisp |  20 +-
 contrib/sb-simd/code/instruction-sets/sse.lisp     |  10 +-
 contrib/sb-simd/code/instruction-sets/sse2.lisp    |  61 +++---
 contrib/sb-simd/code/instruction-sets/sse4-1.lisp  |  40 ++--
 contrib/sb-simd/code/packages.lisp                 | 209 ++++++++++++---------
 contrib/sb-simd/code/record.lisp                   |  92 ++++++++-
 13 files changed, 501 insertions(+), 318 deletions(-)

diff --git a/contrib/sb-simd/code/define-arefs.lisp b/contrib/sb-simd/code/define-arefs.lisp
index 9692adb7e..12b9a2261 100644
--- a/contrib/sb-simd/code/define-arefs.lisp
+++ b/contrib/sb-simd/code/define-arefs.lisp
@@ -101,6 +101,7 @@
     ((define-aref (load-record-name)
        (with-accessors ((load load-record-name)
                         (aref load-record-aref)
+                        (sap-ref load-record-sap-ref)
                         (row-major-aref load-record-row-major-aref)
                         (value-record load-record-value-record)
                         (vector-record load-record-vector-record))
@@ -134,6 +135,7 @@
      (define-setf-aref (store-record-name)
        (with-accessors ((store store-record-name)
                         (aref store-record-aref)
+                        (sap-ref store-record-sap-ref)
                         (row-major-aref store-record-row-major-aref)
                         (value-record store-record-value-record)
                         (vector-record store-record-vector-record))
diff --git a/contrib/sb-simd/code/define-reffers.lisp b/contrib/sb-simd/code/define-reffers.lisp
index d6261cb06..3d916c0d4 100644
--- a/contrib/sb-simd/code/define-reffers.lisp
+++ b/contrib/sb-simd/code/define-reffers.lisp
@@ -32,6 +32,19 @@
                            `(let ((,v ,value))
                               (setf (aref (the (array ,',type) ,array) ,@subscripts)
                                     ,v)))))
+                  when (sap-ref-record-p record) collect
+                    (let ((bits (value-record-bits value-record))
+                          (cl-type (value-record-type value-record)))
+                      `(define-inline ,name (sap index)
+                         (declare (type sb-alien:system-area-pointer sap) (type index index))
+                         ,(cond ((subtypep cl-type 'single-float)
+                                 `(sb-sys:sap-ref-single sap index))
+                                ((subtypep cl-type 'double-float)
+                                 `(sb-sys:sap-ref-double sap index))
+                                ((subtypep cl-type 'signed-byte)
+                                 `(,(mksym "SB-SYS" "SIGNED-SAP-REF-" (format nil "~D" bits)) sap index))
+                                (t
+                                 `(,(mksym "SB-SYS" "SAP-REF-" (format nil "~D" bits)) sap index)))))
                   when (row-major-aref-record-p record) collect
                     `(define-inline ,name (array index)
                        (declare (type (array ,type) array))
@@ -40,5 +53,16 @@
                     `(define-inline ,name (value array index)
                        (declare (type ,type value)
                                 (type (array ,type) array))
-                       (setf (row-major-aref array index) value))))))
+                       (setf (row-major-aref array index) value))
+                 when (setf-sap-ref-record-p record) collect
+                   (let ((bits (value-record-bits value-record))
+                         (cl-type (value-record-type value-record)))
+                     `(define-inline ,name (value sap index)
+                        (declare (type ,cl-type value) (type sb-alien:system-area-pointer sap) (type index index))
+                        (setf ,(cond ((subtypep cl-type 'single-float) `(sb-sys:sap-ref-single sap index))
+                                     ((subtypep cl-type 'double-float) `(sb-sys:sap-ref-double sap index))
+                                     ((subtypep cl-type 'signed-byte)
+                                      `(,(mksym "SB-SYS" "SIGNED-SAP-REF-" (format nil "~D" bits)) sap index))
+                                     (t `(,(mksym "SB-SYS" "SAP-REF-" (format nil "~D" bits)) sap index)))
+                              value)))))))
   (define-reffers))
diff --git a/contrib/sb-simd/code/define-vref-vops.lisp b/contrib/sb-simd/code/define-vref-vops.lisp
index 3f143b722..2eaca11ae 100644
--- a/contrib/sb-simd/code/define-vref-vops.lisp
+++ b/contrib/sb-simd/code/define-vref-vops.lisp
@@ -16,9 +16,12 @@
                         (mnemonic sb-simd-internals:vref-record-mnemonic)
                         (value-record sb-simd-internals:vref-record-value-record)
                         (vector-record sb-simd-internals:vref-record-vector-record)
-                        (store sb-simd-internals:store-record-p))
+                        (store sb-simd-internals:store-record-p)
+                        (sap-ref sb-simd-internals:vref-record-sap-ref))
            (sb-simd-internals:find-function-record vref-record-name)
-         (let* ((vector-type (sb-simd-internals:value-record-type vector-record))
+         (let* ((sap-vop (when sap-ref (sb-simd-internals:mksym (symbol-package name) (if store "%SET-" "%") sap-ref)))
+                (sap-vop-c (when sap-ref (sb-simd-internals:mksym (symbol-package name) (if store "%SET-" "%") sap-ref "-C")))
+                (vector-type (sb-simd-internals:value-record-type vector-record))
                 (vector-primitive-type (sb-simd-internals:value-record-primitive-type vector-record))
                 (value-scs (sb-simd-internals:value-record-scs value-record))
                 (value-type (sb-simd-internals:value-record-type value-record))
@@ -88,7 +91,45 @@
                        (if store
                            `((inst ,mnemonic ,ea value)
                              (move result value))
-                           `((inst ,mnemonic result ,ea)))))))))))
+                           `((inst ,mnemonic result ,ea))))))
+                ,@(when sap-ref
+                    `((sb-c:defknown ,sap-vop (,@(when store `(,value-type))
+                                               sb-alien:system-area-pointer index ,displacement)
+                          (values ,value-type &optional) (always-translatable) :overwrite-fndb-silently t)
+                      (define-vop (,sap-vop)
+                        (:translate ,sap-vop)
+                        (:policy :fast-safe)
+                        (:args ,@(when store `((value :scs ,value-scs :target result)))
+                               (sap :scs (sap-reg))
+                               (index :scs ,index-scs))
+                        (:info addend)
+                        (:arg-types ,@(when store `(,value-primitive-type))
+                                    sb-alien:system-area-pointer positive-fixnum
+                                    (:constant ,displacement))
+                        (:results (result :scs ,value-scs))
+                        (:result-types ,value-primitive-type)
+                        (:generator 2
+                          ,@(let ((ea `(ea (* addend ,bytes-per-element) sap index ,scale)))
+                              (if store
+                                  `((inst ,mnemonic ,ea value) (move result value))
+                                  `((inst ,mnemonic result ,ea))))))
+                      (define-vop (,sap-vop-c)
+                        (:translate ,sap-vop)
+                        (:policy :fast-safe)
+                        (:args ,@(when store `((value :scs ,value-scs :target result)))
+                               (sap :scs (sap-reg)))
+                        (:info index addend)
+                        (:arg-types ,@(when store `(,value-primitive-type))
+                                    sb-alien:system-area-pointer
+                                    (:constant low-index)
+                                    (:constant ,displacement))
+                        (:results (result :scs ,value-scs))
+                        (:result-types ,value-primitive-type)
+                        (:generator 1
+                          ,@(let ((ea `(ea (* ,bytes-per-element (+ index addend)) sap)))
+                              (if store
+                                  `((inst ,mnemonic ,ea value) (move result value))
+                                  `((inst ,mnemonic result ,ea)))))))))))))
      (define-vref-vops ()
        `(progn
           ,@(loop for vref-record
diff --git a/contrib/sb-simd/code/define-vrefs.lisp b/contrib/sb-simd/code/define-vrefs.lisp
index 11186b567..dbcd89429 100644
--- a/contrib/sb-simd/code/define-vrefs.lisp
+++ b/contrib/sb-simd/code/define-vrefs.lisp
@@ -6,43 +6,59 @@
                         (instruction-set vref-record-instruction-set)
                         (value-record vref-record-value-record)
                         (vector-record vref-record-vector-record)
-                        (vop vref-record-vop))
+                        (vop vref-record-vop)
+                        (sap vref-record-sap-ref))
            (find-function-record name)
          (let* ((simd-width (value-record-simd-width value-record))
                 (element-type
                   (second
-                   (value-record-type vector-record))))
+                   (value-record-type vector-record)))
+                (sap-vop (when sap (mksym (symbol-package name) (if (eq kind :store) "%SET-" "%") sap))))
+           (declare (ignorable simd-width element-type))
            (ecase kind
              (:load
               (if (not (instruction-set-available-p instruction-set))
                   `(define-missing-instruction ,name
                      :required-arguments (array index))
-                  `(define-inline ,name (array index)
-                     (declare (type (array ,element-type) array)
-                              (index index))
-                     (sb-kernel:check-bound array (array-total-size array) (+ index ,(1- simd-width)))
-                     (multiple-value-bind (vector index)
-                         (sb-kernel:%data-vector-and-index array index)
-                       (declare (type (simple-array ,element-type (*)) vector))
-                       (,vop vector index 0)))))
+                  `(progn
+                    (define-inline ,name (array index)
+                       (declare (type (array ,element-type) array)
+                                (index index))
+                       (sb-kernel:check-bound array (array-total-size array) (+ index ,(1- simd-width)))
+                       (multiple-value-bind (vector index)
+                           (sb-kernel:%data-vector-and-index array index)
+                         (declare (type (simple-array ,element-type (*)) vector))
+                         (,vop vector index 0)))
+                    ,@(when sap
+                        `((define-inline ,sap (sap index)
+                            (declare (type sb-alien:system-area-pointer sap) (type index index))
+                            (,sap-vop sap index 0)))))))
              (:store
               (if (not (instruction-set-available-p instruction-set))
                   `(define-missing-instruction ,name
                      :required-arguments (value array index))
-                  `(define-inline ,name (value array index)
-                     (declare (type (array ,element-type) array)
-                              (index index))
-                     (sb-kernel:check-bound array (array-total-size array) (+ index ,(1- simd-width)))
-                     (multiple-value-bind (vector index)
-                         (sb-kernel:%data-vector-and-index array index)
-                       (declare (type (simple-array ,element-type (*)) vector))
-                       (,vop (,(value-record-name value-record) value) vector index 0)))))))))
+                  `(progn
+                    (define-inline ,name (value array index)
+                       (declare (type (array ,element-type) array)
+                                (index index))
+                       (sb-kernel:check-bound array (array-total-size array) (+ index ,(1- simd-width)))
+                       (multiple-value-bind (vector index)
+                           (sb-kernel:%data-vector-and-index array index)
+                         (declare (type (simple-array ,element-type (*)) vector))
+                         (,vop (,(value-record-name value-record) value) vector
+                               index 0)))
+                    ,@(when sap
+                        `((define-inline (setf ,sap) (value sap index)
+                            (declare (type sb-alien:system-area-pointer sap) (type index index))
+                            (,sap-vop (,(value-record-name value-record) value) sap index 0)))))))))))
      (define-vrefs ()
        `(progn
           ,@(loop for load-record in (filter-function-records #'load-record-p)
                   for name = (load-record-name load-record)
+                  for sap = (vref-record-sap-ref load-record)
                   collect `(define-vref ,name :load))
           ,@(loop for store-record in (filter-function-records #'store-record-p)
                   for name = (store-record-name store-record)
+                  for sap = (vref-record-sap-ref store-record)
                   collect `(define-vref ,name :store)))))
   (define-vrefs))
diff --git a/contrib/sb-simd/code/instruction-sets/avx.lisp b/contrib/sb-simd/code/instruction-sets/avx.lisp
index f10877081..4af8b6102 100644
--- a/contrib/sb-simd/code/instruction-sets/avx.lisp
+++ b/contrib/sb-simd/code/instruction-sets/avx.lisp
@@ -641,78 +641,78 @@
    (s64.4-permute128    #:vperm2f128   (s64.4) (s64.4 s64.4 imm8) :cost 1))
   (:loads
    #+sb-unicode
-   (u32.4-load-from-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
+   (u32.4-load-from-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref u32.4-string-sap-ref)
    #+sb-unicode
-   (u32.8-load-from-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref)
-   (f32-load    #:vmovss  f32    f32vec f32-array f32-aref   f32-row-major-aref)
-   (f64-load    #:vmovsd  f64    f64vec f64-array f64-aref   f64-row-major-aref)
-   (f32.4-load  #:vmovups f32.4  f32vec f32-array f32.4-aref f32.4-row-major-aref)
-   (f64.2-load  #:vmovupd f64.2  f64vec f64-array f64.2-aref f64.2-row-major-aref)
-   (f32.8-load  #:vmovups f32.8  f32vec f32-array f32.8-aref f32.8-row-major-aref)
-   (f64.4-load  #:vmovupd f64.4  f64vec f64-array f64.4-aref f64.4-row-major-aref)
-   (u8.16-load  #:vmovdqu u8.16   u8vec  u8-array u8.16-aref u8.16-row-major-aref)
-   (u16.8-load  #:vmovdqu u16.8  u16vec u16-array u16.8-aref u16.8-row-major-aref)
-   (u32.4-load  #:vmovdqu u32.4  u32vec u32-array u32.4-aref u32.4-row-major-aref)
-   (u64.2-load  #:vmovdqu u64.2  u64vec u64-array u64.2-aref u64.2-row-major-aref)
-   (u8.32-load  #:vmovdqu u8.32   u8vec  u8-array u8.32-aref u8.32-row-major-aref)
-   (u16.16-load #:vmovdqu u16.16 u16vec u16-array u16.16-aref u16.16-row-major-aref)
-   (u32.8-load  #:vmovdqu u32.8  u32vec u32-array u32.8-aref u32.8-row-major-aref)
-   (u64.4-load  #:vmovdqu u64.4  u64vec u64-array u64.4-aref u64.4-row-major-aref)
-   (s8.16-load  #:vmovdqu s8.16   s8vec  s8-array s8.16-aref s8.16-row-major-aref)
-   (s16.8-load  #:vmovdqu s16.8  s16vec s16-array s16.8-aref s16.8-row-major-aref)
-   (s32.4-load  #:vmovdqu s32.4  s32vec s32-array s32.4-aref s32.4-row-major-aref)
-   (s64.2-load  #:vmovdqu s64.2  s64vec s64-array s64.2-aref s64.2-row-major-aref)
-   (s8.32-load  #:vmovdqu s8.32   s8vec  s8-array s8.32-aref s8.32-row-major-aref)
-   (s16.16-load #:vmovdqu s16.16 s16vec s16-array s16.16-aref s16.16-row-major-aref)
-   (s32.8-load  #:vmovdqu s32.8  s32vec s32-array s32.8-aref s32.8-row-major-aref)
-   (s64.4-load  #:vmovdqu s64.4  s64vec s64-array s64.4-aref s64.4-row-major-aref))
+   (u32.8-load-from-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref u32.8-string-sap-ref)
+   (f32-load    #:vmovss  f32    f32vec f32-array f32-aref   f32-row-major-aref f32-sap-ref)
+   (f64-load    #:vmovsd  f64    f64vec f64-array f64-aref   f64-row-major-aref f64-sap-ref)
+   (f32.4-load  #:vmovups f32.4  f32vec f32-array f32.4-aref f32.4-row-major-aref f32.4-sap-ref)
+   (f64.2-load  #:vmovupd f64.2  f64vec f64-array f64.2-aref f64.2-row-major-aref f64.2-sap-ref)
+   (f32.8-load  #:vmovups f32.8  f32vec f32-array f32.8-aref f32.8-row-major-aref f32.8-sap-ref)
+   (f64.4-load  #:vmovupd f64.4  f64vec f64-array f64.4-aref f64.4-row-major-aref f64.4-sap-ref)
+   (u8.16-load  #:vmovdqu u8.16   u8vec  u8-array u8.16-aref u8.16-row-major-aref u8.16-sap-ref)
+   (u16.8-load  #:vmovdqu u16.8  u16vec u16-array u16.8-aref u16.8-row-major-aref u16.8-sap-ref)
+   (u32.4-load  #:vmovdqu u32.4  u32vec u32-array u32.4-aref u32.4-row-major-aref u32.4-sap-ref)
+   (u64.2-load  #:vmovdqu u64.2  u64vec u64-array u64.2-aref u64.2-row-major-aref u64.2-sap-ref)
+   (u8.32-load  #:vmovdqu u8.32   u8vec  u8-array u8.32-aref u8.32-row-major-aref u8.32-sap-ref)
+   (u16.16-load #:vmovdqu u16.16 u16vec u16-array u16.16-aref u16.16-row-major-aref u16.16-sap-ref)
+   (u32.8-load  #:vmovdqu u32.8  u32vec u32-array u32.8-aref u32.8-row-major-aref u32.8-sap-ref)
+   (u64.4-load  #:vmovdqu u64.4  u64vec u64-array u64.4-aref u64.4-row-major-aref u64.4-sap-ref)
+   (s8.16-load  #:vmovdqu s8.16   s8vec  s8-array s8.16-aref s8.16-row-major-aref s8.16-sap-ref)
+   (s16.8-load  #:vmovdqu s16.8  s16vec s16-array s16.8-aref s16.8-row-major-aref s16.8-sap-ref)
+   (s32.4-load  #:vmovdqu s32.4  s32vec s32-array s32.4-aref s32.4-row-major-aref s32.4-sap-ref)
+   (s64.2-load  #:vmovdqu s64.2  s64vec s64-array s64.2-aref s64.2-row-major-aref s64.2-sap-ref)
+   (s8.32-load  #:vmovdqu s8.32   s8vec  s8-array s8.32-aref s8.32-row-major-aref s8.32-sap-ref)
+   (s16.16-load #:vmovdqu s16.16 s16vec s16-array s16.16-aref s16.16-row-major-aref s16.16-sap-ref)
+   (s32.8-load  #:vmovdqu s32.8  s32vec s32-array s32.8-aref s32.8-row-major-aref s32.8-sap-ref)
+   (s64.4-load  #:vmovdqu s64.4  s64vec s64-array s64.4-aref s64.4-row-major-aref s64.4-sap-ref))
   (:stores
    #+sb-unicode
-   (u32.4-store-into-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
+   (u32.4-store-into-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref u32.4-string-sap-ref)
    #+sb-unicode
-   (u32.8-store-into-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref)
-   (f32-store   #:vmovss  f32    f32vec f32-array f32-aref   f32-row-major-aref)
-   (f64-store   #:vmovsd  f64    f64vec f64-array f64-aref   f64-row-major-aref)
-   (f32.4-store #:vmovups f32.4  f32vec f32-array f32.4-aref f32.4-row-major-aref)
-   (f64.2-store #:vmovupd f64.2  f64vec f64-array f64.2-aref f64.2-row-major-aref)
-   (f32.8-store #:vmovups f32.8  f32vec f32-array f32.8-aref f32.8-row-major-aref)
-   (f64.4-store #:vmovupd f64.4  f64vec f64-array f64.4-aref f64.4-row-major-aref)
-   (u8.16-store #:vmovdqu u8.16   u8vec  u8-array u8.16-aref u8.16-row-major-aref)
-   (u16.8-store #:vmovdqu u16.8  u16vec u16-array u16.8-aref u16.8-row-major-aref)
-   (u32.4-store #:vmovdqu u32.4  u32vec u32-array u32.4-aref u32.4-row-major-aref)
-   (u64.2-store #:vmovdqu u64.2  u64vec u64-array u64.2-aref u64.2-row-major-aref)
-   (s8.16-store #:vmovdqu s8.16   s8vec  s8-array s8.16-aref s8.16-row-major-aref)
-   (s16.8-store #:vmovdqu s16.8  s16vec s16-array s16.8-aref s16.8-row-major-aref)
-   (s32.4-store #:vmovdqu s32.4  s32vec s32-array s32.4-aref s32.4-row-major-aref)
-   (s64.2-store #:vmovdqu s64.2  s64vec s64-array s64.2-aref s64.2-row-major-aref)
-   (u8.32-store    #:vmovdqu  u8.32   u8vec  u8-array u8.32-aref  u8.32-row-major-aref)
-   (u16.16-store   #:vmovdqu  u16.16 u16vec u16-array u16.16-aref u16.16-row-major-aref)
-   (u32.8-store    #:vmovdqu  u32.8  u32vec u32-array u32.8-aref  u32.8-row-major-aref)
-   (u64.4-store    #:vmovdqu  u64.4  u64vec u64-array u64.4-aref  u64.4-row-major-aref)
-   (s8.32-store    #:vmovdqu  s8.32   s8vec  s8-array s8.32-aref  s8.32-row-major-aref)
-   (s16.16-store   #:vmovdqu  s16.16 s16vec s16-array s16.16-aref s16.16-row-major-aref)
-   (s32.8-store    #:vmovdqu  s32.8  s32vec s32-array s32.8-aref  s32.8-row-major-aref)
-   (s64.4-store    #:vmovdqu  s64.4  s64vec s64-array s64.4-aref  s64.4-row-major-aref)
-   (f32.4-ntstore  #:vmovntps f32.4  f32vec f32-array f32.4-non-temporal-aref  f32.4-non-temporal-row-major-aref)
-   (f64.2-ntstore  #:vmovntpd f64.2  f64vec f64-array f64.2-non-temporal-aref  f64.2-non-temporal-row-major-aref)
-   (f32.8-ntstore  #:vmovntps f32.8  f32vec f32-array f32.8-non-temporal-aref  f32.8-non-temporal-row-major-aref)
-   (f64.4-ntstore  #:vmovntpd f64.4  f64vec f64-array f64.4-non-temporal-aref  f64.4-non-temporal-row-major-aref)
-   (u8.16-ntstore  #:vmovntdq u8.16   u8vec  u8-array u8.16-non-temporal-aref  u8.16-non-temporal-row-major-aref)
-   (u16.8-ntstore  #:vmovntdq u16.8  u16vec u16-array u16.8-non-temporal-aref  u16.8-non-temporal-row-major-aref)
-   (u32.4-ntstore  #:vmovntdq u32.4  u32vec u32-array u32.4-non-temporal-aref  u32.4-non-temporal-row-major-aref)
-   (u64.2-ntstore  #:vmovntdq u64.2  u64vec u64-array u64.2-non-temporal-aref  u64.2-non-temporal-row-major-aref)
-   (s8.16-ntstore  #:vmovntdq s8.16   s8vec  s8-array s8.16-non-temporal-aref  s8.16-non-temporal-row-major-aref)
-   (s16.8-ntstore  #:vmovntdq s16.8  s16vec s16-array s16.8-non-temporal-aref  s16.8-non-temporal-row-major-aref)
-   (s32.4-ntstore  #:vmovntdq s32.4  s32vec s32-array s32.4-non-temporal-aref  s32.4-non-temporal-row-major-aref)
-   (s64.2-ntstore  #:vmovntdq s64.2  s64vec s64-array s64.2-non-temporal-aref  s64.2-non-temporal-row-major-aref)
-   (u8.32-ntstore  #:vmovntdq u8.32   u8vec  u8-array u8.32-non-temporal-aref  u8.32-non-temporal-row-major-aref)
-   (u16.16-ntstore #:vmovntdq u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref)
-   (u32.8-ntstore  #:vmovntdq u32.8  u32vec u32-array u32.8-non-temporal-aref  u32.8-non-temporal-row-major-aref)
-   (u64.4-ntstore  #:vmovntdq u64.4  u64vec u64-array u64.4-non-temporal-aref  u64.4-non-temporal-row-major-aref)
-   (s8.32-ntstore  #:vmovntdq s8.32   s8vec  s8-array s8.32-non-temporal-aref  s8.32-non-temporal-row-major-aref)
-   (s16.16-ntstore #:vmovntdq s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref)
-   (s32.8-ntstore  #:vmovntdq s32.8  s32vec s32-array s32.8-non-temporal-aref  s32.8-non-temporal-row-major-aref)
-   (s64.4-ntstore  #:vmovntdq s64.4  s64vec s64-array s64.4-non-temporal-aref  s64.4-non-temporal-row-major-aref))
+   (u32.8-store-into-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref u32.8-string-sap-ref)
+   (f32-store   #:vmovss  f32    f32vec f32-array f32-aref   f32-row-major-aref f32-sap-ref)
+   (f64-store   #:vmovsd  f64    f64vec f64-array f64-aref   f64-row-major-aref f64-sap-ref)
+   (f32.4-store #:vmovups f32.4  f32vec f32-array f32.4-aref f32.4-row-major-aref f32.4-sap-ref)
+   (f64.2-store #:vmovupd f64.2  f64vec f64-array f64.2-aref f64.2-row-major-aref f64.2-sap-ref)
+   (f32.8-store #:vmovups f32.8  f32vec f32-array f32.8-aref f32.8-row-major-aref f32.8-sap-ref)
+   (f64.4-store #:vmovupd f64.4  f64vec f64-array f64.4-aref f64.4-row-major-aref f64.4-sap-ref)
+   (u8.16-store #:vmovdqu u8.16   u8vec  u8-array u8.16-aref u8.16-row-major-aref u8.16-sap-ref)
+   (u16.8-store #:vmovdqu u16.8  u16vec u16-array u16.8-aref u16.8-row-major-aref u16.8-sap-ref)
+   (u32.4-store #:vmovdqu u32.4  u32vec u32-array u32.4-aref u32.4-row-major-aref u32.4-sap-ref)
+   (u64.2-store #:vmovdqu u64.2  u64vec u64-array u64.2-aref u64.2-row-major-aref u64.2-sap-ref)
+   (s8.16-store #:vmovdqu s8.16   s8vec  s8-array s8.16-aref s8.16-row-major-aref s8.16-sap-ref)
+   (s16.8-store #:vmovdqu s16.8  s16vec s16-array s16.8-aref s16.8-row-major-aref s16.8-sap-ref)
+   (s32.4-store #:vmovdqu s32.4  s32vec s32-array s32.4-aref s32.4-row-major-aref s32.4-sap-ref)
+   (s64.2-store #:vmovdqu s64.2  s64vec s64-array s64.2-aref s64.2-row-major-aref s64.2-sap-ref)
+   (u8.32-store    #:vmovdqu  u8.32   u8vec  u8-array u8.32-aref  u8.32-row-major-aref u8.32-sap-ref)
+   (u16.16-store   #:vmovdqu  u16.16 u16vec u16-array u16.16-aref u16.16-row-major-aref u16.16-sap-ref)
+   (u32.8-store    #:vmovdqu  u32.8  u32vec u32-array u32.8-aref  u32.8-row-major-aref u32.8-sap-ref)
+   (u64.4-store    #:vmovdqu  u64.4  u64vec u64-array u64.4-aref  u64.4-row-major-aref u64.4-sap-ref)
+   (s8.32-store    #:vmovdqu  s8.32   s8vec  s8-array s8.32-aref  s8.32-row-major-aref s8.32-sap-ref)
+   (s16.16-store   #:vmovdqu  s16.16 s16vec s16-array s16.16-aref s16.16-row-major-aref s16.16-sap-ref)
+   (s32.8-store    #:vmovdqu  s32.8  s32vec s32-array s32.8-aref  s32.8-row-major-aref s32.8-sap-ref)
+   (s64.4-store    #:vmovdqu  s64.4  s64vec s64-array s64.4-aref  s64.4-row-major-aref s64.4-sap-ref)
+   (f32.4-ntstore  #:vmovntps f32.4  f32vec f32-array f32.4-non-temporal-aref  f32.4-non-temporal-row-major-aref f32.4-non-temporal-sap-ref)
+   (f64.2-ntstore  #:vmovntpd f64.2  f64vec f64-array f64.2-non-temporal-aref  f64.2-non-temporal-row-major-aref f64.2-non-temporal-sap-ref)
+   (f32.8-ntstore  #:vmovntps f32.8  f32vec f32-array f32.8-non-temporal-aref  f32.8-non-temporal-row-major-aref f32.8-non-temporal-sap-ref)
+   (f64.4-ntstore  #:vmovntpd f64.4  f64vec f64-array f64.4-non-temporal-aref  f64.4-non-temporal-row-major-aref f64.4-non-temporal-sap-ref)
+   (u8.16-ntstore  #:vmovntdq u8.16   u8vec  u8-array u8.16-non-temporal-aref  u8.16-non-temporal-row-major-aref u8.16-non-temporal-sap-ref)
+   (u16.8-ntstore  #:vmovntdq u16.8  u16vec u16-array u16.8-non-temporal-aref  u16.8-non-temporal-row-major-aref u16.8-non-temporal-sap-ref)
+   (u32.4-ntstore  #:vmovntdq u32.4  u32vec u32-array u32.4-non-temporal-aref  u32.4-non-temporal-row-major-aref u32.4-non-temporal-sap-ref)
+   (u64.2-ntstore  #:vmovntdq u64.2  u64vec u64-array u64.2-non-temporal-aref  u64.2-non-temporal-row-major-aref u64.2-non-temporal-sap-ref)
+   (s8.16-ntstore  #:vmovntdq s8.16   s8vec  s8-array s8.16-non-temporal-aref  s8.16-non-temporal-row-major-aref s8.16-non-temporal-sap-ref)
+   (s16.8-ntstore  #:vmovntdq s16.8  s16vec s16-array s16.8-non-temporal-aref  s16.8-non-temporal-row-major-aref s16.8-non-temporal-sap-ref)
+   (s32.4-ntstore  #:vmovntdq s32.4  s32vec s32-array s32.4-non-temporal-aref  s32.4-non-temporal-row-major-aref s32.4-non-temporal-sap-ref)
+   (s64.2-ntstore  #:vmovntdq s64.2  s64vec s64-array s64.2-non-temporal-aref  s64.2-non-temporal-row-major-aref s64.2-non-temporal-sap-ref)
+   (u8.32-ntstore  #:vmovntdq u8.32   u8vec  u8-array u8.32-non-temporal-aref  u8.32-non-temporal-row-major-aref u8.32-non-temporal-sap-ref)
+   (u16.16-ntstore #:vmovntdq u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref u16.16-non-temporal-sap-ref)
+   (u32.8-ntstore  #:vmovntdq u32.8  u32vec u32-array u32.8-non-temporal-aref  u32.8-non-temporal-row-major-aref u32.8-non-temporal-sap-ref)
+   (u64.4-ntstore  #:vmovntdq u64.4  u64vec u64-array u64.4-non-temporal-aref  u64.4-non-temporal-row-major-aref u64.4-non-temporal-sap-ref)
+   (s8.32-ntstore  #:vmovntdq s8.32   s8vec  s8-array s8.32-non-temporal-aref  s8.32-non-temporal-row-major-aref s8.32-non-temporal-sap-ref)
+   (s16.16-ntstore #:vmovntdq s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref s16.16-non-temporal-sap-ref)
+   (s32.8-ntstore  #:vmovntdq s32.8  s32vec s32-array s32.8-non-temporal-aref  s32.8-non-temporal-row-major-aref s32.8-non-temporal-sap-ref)
+   (s64.4-ntstore  #:vmovntdq s64.4  s64vec s64-array s64.4-non-temporal-aref  s64.4-non-temporal-row-major-aref s64.4-non-temporal-sap-ref))
   (:associatives
    (f32-and two-arg-f32-and +f32-true+)
    (f32-or  two-arg-f32-or  +f32-false+)
diff --git a/contrib/sb-simd/code/instruction-sets/avx2.lisp b/contrib/sb-simd/code/instruction-sets/avx2.lisp
index 0466dad5c..77738a038 100644
--- a/contrib/sb-simd/code/instruction-sets/avx2.lisp
+++ b/contrib/sb-simd/code/instruction-sets/avx2.lisp
@@ -368,47 +368,47 @@
    (s64.4-insert-s64.2    #:vinserti128  (s64.4) (s64.4 s64.2 imm1) :cost 1)
    (s64.4-permute128      #:vperm2i128   (s64.4) (s64.4 s64.4 imm8) :cost 1))
   (:loads
-   (f32.4-ntload  #:vmovntdqa f32.4  f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref)
-   (f64.2-ntload  #:vmovntdqa f64.2  f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref)
-   (f32.8-ntload  #:vmovntdqa f32.8  f32vec f32-array f32.8-non-temporal-aref f32.8-non-temporal-row-major-aref)
-   (f64.4-ntload  #:vmovntdqa f64.4  f64vec f64-array f64.4-non-temporal-aref f64.4-non-temporal-row-major-aref)
-   (u8.16-ntload  #:vmovntdqa u8.16   u8vec  u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref)
-   (u16.8-ntload  #:vmovntdqa u16.8  u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref)
-   (u32.4-ntload  #:vmovntdqa u32.4  u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref)
-   (u64.2-ntload  #:vmovntdqa u64.2  u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref)
-   (s8.16-ntload  #:vmovntdqa s8.16   s8vec  s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref)
-   (s16.8-ntload  #:vmovntdqa s16.8  s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref)
-   (s32.4-ntload  #:vmovntdqa s32.4  s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref)
-   (s64.2-ntload  #:vmovntdqa s64.2  s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref)
-   (u8.32-ntload  #:vmovntdqa u8.32   u8vec  u8-array u8.32-non-temporal-aref  u8.32-non-temporal-row-major-aref)
-   (u16.16-ntload #:vmovntdqa u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref)
-   (u32.8-ntload  #:vmovntdqa u32.8  u32vec u32-array u32.8-non-temporal-aref  u32.8-non-temporal-row-major-aref)
-   (u64.4-ntload  #:vmovntdqa u64.4  u64vec u64-array u64.4-non-temporal-aref  u64.4-non-temporal-row-major-aref)
-   (s8.32-ntload  #:vmovntdqa s8.32   s8vec  s8-array s8.32-non-temporal-aref  s8.32-non-temporal-row-major-aref)
-   (s16.16-ntload #:vmovntdqa s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref)
-   (s32.8-ntload  #:vmovntdqa s32.8  s32vec s32-array s32.8-non-temporal-aref  s32.8-non-temporal-row-major-aref)
-   (s64.4-ntload  #:vmovntdqa s64.4  s64vec s64-array s64.4-non-temporal-aref  s64.4-non-temporal-row-major-aref))
+   (f32.4-ntload  #:vmovntdqa f32.4  f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref   f32.4-non-temporal-sap-ref)
+   (f64.2-ntload  #:vmovntdqa f64.2  f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref   f64.2-non-temporal-sap-ref)
+   (f32.8-ntload  #:vmovntdqa f32.8  f32vec f32-array f32.8-non-temporal-aref f32.8-non-temporal-row-major-aref   f32.8-non-temporal-sap-ref)
+   (f64.4-ntload  #:vmovntdqa f64.4  f64vec f64-array f64.4-non-temporal-aref f64.4-non-temporal-row-major-aref   f64.4-non-temporal-sap-ref)
+   (u8.16-ntload  #:vmovntdqa u8.16   u8vec  u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref   u8.16-non-temporal-sap-ref)
+   (u16.8-ntload  #:vmovntdqa u16.8  u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref   u16.8-non-temporal-sap-ref)
+   (u32.4-ntload  #:vmovntdqa u32.4  u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref   u32.4-non-temporal-sap-ref)
+   (u64.2-ntload  #:vmovntdqa u64.2  u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref   u64.2-non-temporal-sap-ref)
+   (s8.16-ntload  #:vmovntdqa s8.16   s8vec  s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref   s8.16-non-temporal-sap-ref)
+   (s16.8-ntload  #:vmovntdqa s16.8  s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref   s16.8-non-temporal-sap-ref)
+   (s32.4-ntload  #:vmovntdqa s32.4  s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref   s32.4-non-temporal-sap-ref)
+   (s64.2-ntload  #:vmovntdqa s64.2  s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref   s64.2-non-temporal-sap-ref)
+   (u8.32-ntload  #:vmovntdqa u8.32   u8vec  u8-array u8.32-non-temporal-aref  u8.32-non-temporal-row-major-aref  u8.32-non-temporal-sap-ref)
+   (u16.16-ntload #:vmovntdqa u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref u16.16-non-temporal-sap-ref)
+   (u32.8-ntload  #:vmovntdqa u32.8  u32vec u32-array u32.8-non-temporal-aref  u32.8-non-temporal-row-major-aref  u32.8-non-temporal-sap-ref)
+   (u64.4-ntload  #:vmovntdqa u64.4  u64vec u64-array u64.4-non-temporal-aref  u64.4-non-temporal-row-major-aref  u64.4-non-temporal-sap-ref)
+   (s8.32-ntload  #:vmovntdqa s8.32   s8vec  s8-array s8.32-non-temporal-aref  s8.32-non-temporal-row-major-aref  s8.32-non-temporal-sap-ref)
+   (s16.16-ntload #:vmovntdqa s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref s16.16-non-temporal-sap-ref)
+   (s32.8-ntload  #:vmovntdqa s32.8  s32vec s32-array s32.8-non-temporal-aref  s32.8-non-temporal-row-major-aref  s32.8-non-temporal-sap-ref)
+   (s64.4-ntload  #:vmovntdqa s64.4  s64vec s64-array s64.4-non-temporal-aref  s64.4-non-temporal-row-major-aref  s64.4-non-temporal-sap-ref))
   (:stores
-   (f32.4-ntstore  #:vmovntps f32.4  f32vec f32-array f32.4-non-temporal-aref  f32.4-non-temporal-row-major-aref)
-   (f64.2-ntstore  #:vmovntpd f64.2  f64vec f64-array f64.2-non-temporal-aref  f64.2-non-temporal-row-major-aref)
-   (f32.8-ntstore  #:vmovntps f32.8  f32vec f32-array f32.8-non-temporal-aref  f32.8-non-temporal-row-major-aref)
-   (f64.4-ntstore  #:vmovntpd f64.4  f64vec f64-array f64.4-non-temporal-aref  f64.4-non-temporal-row-major-aref)
-   (u8.16-ntstore  #:vmovntdq u8.16   u8vec  u8-array u8.16-non-temporal-aref  u8.16-non-temporal-row-major-aref)
-   (u16.8-ntstore  #:vmovntdq u16.8  u16vec u16-array u16.8-non-temporal-aref  u16.8-non-temporal-row-major-aref)
-   (u32.4-ntstore  #:vmovntdq u32.4  u32vec u32-array u32.4-non-temporal-aref  u32.4-non-temporal-row-major-aref)
-   (u64.2-ntstore  #:vmovntdq u64.2  u64vec u64-array u64.2-non-temporal-aref  u64.2-non-temporal-row-major-aref)
-   (s8.16-ntstore  #:vmovntdq s8.16   s8vec  s8-array s8.16-non-temporal-aref  s8.16-non-temporal-row-major-aref)
-   (s16.8-ntstore  #:vmovntdq s16.8  s16vec s16-array s16.8-non-temporal-aref  s16.8-non-temporal-row-major-aref)
-   (s32.4-ntstore  #:vmovntdq s32.4  s32vec s32-array s32.4-non-temporal-aref  s32.4-non-temporal-row-major-aref)
-   (s64.2-ntstore  #:vmovntdq s64.2  s64vec s64-array s64.2-non-temporal-aref  s64.2-non-temporal-row-major-aref)
-   (u8.32-ntstore  #:vmovntdq u8.32   u8vec  u8-array u8.32-non-temporal-aref  u8.32-non-temporal-row-major-aref)
-   (u16.16-ntstore #:vmovntdq u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref)
-   (u32.8-ntstore  #:vmovntdq u32.8  u32vec u32-array u32.8-non-temporal-aref  u32.8-non-temporal-row-major-aref)
-   (u64.4-ntstore  #:vmovntdq u64.4  u64vec u64-array u64.4-non-temporal-aref  u64.4-non-temporal-row-major-aref)
-   (s8.32-ntstore  #:vmovntdq s8.32   s8vec  s8-array s8.32-non-temporal-aref  s8.32-non-temporal-row-major-aref)
-   (s16.16-ntstore #:vmovntdq s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref)
-   (s32.8-ntstore  #:vmovntdq s32.8  s32vec s32-array s32.8-non-temporal-aref  s32.8-non-temporal-row-major-aref)
-   (s64.4-ntstore  #:vmovntdq s64.4  s64vec s64-array s64.4-non-temporal-aref  s64.4-non-temporal-row-major-aref))
+   (f32.4-ntstore  #:vmovntps f32.4  f32vec f32-array f32.4-non-temporal-aref  f32.4-non-temporal-row-major-aref f32.4-non-temporal-sap-ref)
+   (f64.2-ntstore  #:vmovntpd f64.2  f64vec f64-array f64.2-non-temporal-aref  f64.2-non-temporal-row-major-aref f64.2-non-temporal-sap-ref)
+   (f32.8-ntstore  #:vmovntps f32.8  f32vec f32-array f32.8-non-temporal-aref  f32.8-non-temporal-row-major-aref f32.8-non-temporal-sap-ref)
+   (f64.4-ntstore  #:vmovntpd f64.4  f64vec f64-array f64.4-non-temporal-aref  f64.4-non-temporal-row-major-aref f64.4-non-temporal-sap-ref)
+   (u8.16-ntstore  #:vmovntdq u8.16   u8vec  u8-array u8.16-non-temporal-aref  u8.16-non-temporal-row-major-aref u8.16-non-temporal-sap-ref)
+   (u16.8-ntstore  #:vmovntdq u16.8  u16vec u16-array u16.8-non-temporal-aref  u16.8-non-temporal-row-major-aref u16.8-non-temporal-sap-ref)
+   (u32.4-ntstore  #:vmovntdq u32.4  u32vec u32-array u32.4-non-temporal-aref  u32.4-non-temporal-row-major-aref u32.4-non-temporal-sap-ref)
+   (u64.2-ntstore  #:vmovntdq u64.2  u64vec u64-array u64.2-non-temporal-aref  u64.2-non-temporal-row-major-aref u64.2-non-temporal-sap-ref)
+   (s8.16-ntstore  #:vmovntdq s8.16   s8vec  s8-array s8.16-non-temporal-aref  s8.16-non-temporal-row-major-aref s8.16-non-temporal-sap-ref)
+   (s16.8-ntstore  #:vmovntdq s16.8  s16vec s16-array s16.8-non-temporal-aref  s16.8-non-temporal-row-major-aref s16.8-non-temporal-sap-ref)
+   (s32.4-ntstore  #:vmovntdq s32.4  s32vec s32-array s32.4-non-temporal-aref  s32.4-non-temporal-row-major-aref s32.4-non-temporal-sap-ref)
+   (s64.2-ntstore  #:vmovntdq s64.2  s64vec s64-array s64.2-non-temporal-aref  s64.2-non-temporal-row-major-aref s64.2-non-temporal-sap-ref)
+   (u8.32-ntstore  #:vmovntdq u8.32   u8vec  u8-array u8.32-non-temporal-aref  u8.32-non-temporal-row-major-aref u8.32-non-temporal-sap-ref)
+   (u16.16-ntstore #:vmovntdq u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref u16.16-non-temporal-sap-ref)
+   (u32.8-ntstore  #:vmovntdq u32.8  u32vec u32-array u32.8-non-temporal-aref  u32.8-non-temporal-row-major-aref u32.8-non-temporal-sap-ref)
+   (u64.4-ntstore  #:vmovntdq u64.4  u64vec u64-array u64.4-non-temporal-aref  u64.4-non-temporal-row-major-aref u64.4-non-temporal-sap-ref)
+   (s8.32-ntstore  #:vmovntdq s8.32   s8vec  s8-array s8.32-non-temporal-aref  s8.32-non-temporal-row-major-aref s8.32-non-temporal-sap-ref)
+   (s16.16-ntstore #:vmovntdq s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref s16.16-non-temporal-sap-ref)
+   (s32.8-ntstore  #:vmovntdq s32.8  s32vec s32-array s32.8-non-temporal-aref  s32.8-non-temporal-row-major-aref s32.8-non-temporal-sap-ref)
+   (s64.4-ntstore  #:vmovntdq s64.4  s64vec s64-array s64.4-non-temporal-aref  s64.4-non-temporal-row-major-aref s64.4-non-temporal-sap-ref))
   (:associatives
    (u8.32-and two-arg-u8.32-and +u8-true+)
    (u8.32-or  two-arg-u8.32-or  +u8-false+)
diff --git a/contrib/sb-simd/code/instruction-sets/neon.lisp b/contrib/sb-simd/code/instruction-sets/neon.lisp
index 506702c2a..52d2f9c3d 100644
--- a/contrib/sb-simd/code/instruction-sets/neon.lisp
+++ b/contrib/sb-simd/code/instruction-sets/neon.lisp
@@ -576,30 +576,30 @@
    (s64.2-zip-odd     #:zip2     (s64.2) (s64.2 s64.2) :cost 1 :suffix '(:2d)))
   (:loads
    #+sb-unicode
-   (u32.4-load-from-string #:ldr u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
-   (f32.4-load        #:ldr  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref)
-   (f64.2-load        #:ldr  f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref)
-   (u8.16-load        #:ldr  u8.16 u8vec  u8-array  u8.16-aref u8.16-row-major-aref)
-   (u16.8-load        #:ldr  u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref)
-   (u32.4-load        #:ldr  u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref)
-   (u64.2-load        #:ldr  u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref)
-   (s8.16-load        #:ldr  s8.16 s8vec  s8-array  s8.16-aref s8.16-row-major-aref)
-   (s16.8-load        #:ldr  s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref)
-   (s32.4-load        #:ldr  s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref)
-   (s64.2-load        #:ldr  s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref))
+   (u32.4-load-from-string #:ldr u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref u32.4-string-sap-ref)
+   (f32.4-load        #:ldr  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref f32.4-sap-ref)
+   (f64.2-load        #:ldr  f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref f64.2-sap-ref)
+   (u8.16-load        #:ldr  u8.16 u8vec  u8-array  u8.16-aref u8.16-row-major-aref u8.16-sap-ref)
+   (u16.8-load        #:ldr  u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref u16.8-sap-ref)
+   (u32.4-load        #:ldr  u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref u32.4-sap-ref)
+   (u64.2-load        #:ldr  u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref u64.2-sap-ref)
+   (s8.16-load        #:ldr  s8.16 s8vec  s8-array  s8.16-aref s8.16-row-major-aref s8.16-sap-ref)
+   (s16.8-load        #:ldr  s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref s16.8-sap-ref)
+   (s32.4-load        #:ldr  s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref s32.4-sap-ref)
+   (s64.2-load        #:ldr  s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref s64.2-sap-ref))
   (:stores
    #+sb-unicode
-   (u32.4-store-into-string #:str u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
-   (f32.4-store       #:str  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref)
-   (f64.2-store       #:str  f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref)
-   (u8.16-store       #:str  u8.16 u8vec  u8-array  u8.16-aref u8.16-row-major-aref)
-   (u16.8-store       #:str  u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref)
-   (u32.4-store       #:str  u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref)
-   (u64.2-store       #:str  u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref)
-   (s8.16-store       #:str  s8.16 s8vec  s8-array  s8.16-aref s8.16-row-major-aref)
-   (s16.8-store       #:str  s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref)
-   (s32.4-store       #:str  s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref)
-   (s64.2-store       #:str  s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref))
+   (u32.4-store-into-string #:str u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref u32.4-string-sap-ref)
+   (f32.4-store       #:str  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref f32.4-sap-ref)
+   (f64.2-store       #:str  f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref f64.2-sap-ref)
+   (u8.16-store       #:str  u8.16 u8vec  u8-array  u8.16-aref u8.16-row-major-aref u8.16-sap-ref)
+   (u16.8-store       #:str  u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref u16.8-sap-ref)
+   (u32.4-store       #:str  u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref u32.4-sap-ref)
+   (u64.2-store       #:str  u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref u64.2-sap-ref)
+   (s8.16-store       #:str  s8.16 s8vec  s8-array  s8.16-aref s8.16-row-major-aref s8.16-sap-ref)
+   (s16.8-store       #:str  s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref s16.8-sap-ref)
+   (s32.4-store       #:str  s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref s32.4-sap-ref)
+   (s64.2-store       #:str  s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref s64.2-sap-ref))
   (:associatives
    (f32.4-and two-arg-f32.4-and +f32-true+)
    (f32.4-or  two-arg-f32.4-or  +f32-false+)
diff --git a/contrib/sb-simd/code/instruction-sets/sb-simd.lisp b/contrib/sb-simd/code/instruction-sets/sb-simd.lisp
index 8a6a94a69..3da71f6bb 100644
--- a/contrib/sb-simd/code/instruction-sets/sb-simd.lisp
+++ b/contrib/sb-simd/code/instruction-sets/sb-simd.lisp
@@ -242,16 +242,16 @@
    (s64-andc1       nil (s64) (s64 s64) :encoding :fake-vop)
    (s64-not         nil (s64) (s64)     :encoding :fake-vop))
   (:reffers
-   (f32 f32-array f32-aref f32-row-major-aref)
-   (f64 f64-array f64-aref f64-row-major-aref)
-   ( u8  u8-array  u8-aref  u8-row-major-aref)
-   (u16 u16-array u16-aref u16-row-major-aref)
-   (u32 u32-array u32-aref u32-row-major-aref)
-   (u64 u64-array u64-aref u64-row-major-aref)
-   ( s8  s8-array  s8-aref  s8-row-major-aref)
-   (s16 s16-array s16-aref s16-row-major-aref)
-   (s32 s32-array s32-aref s32-row-major-aref)
-   (s64 s64-array s64-aref s64-row-major-aref))
+   (f32 f32-array f32-aref f32-row-major-aref f32-sap-ref)
+   (f64 f64-array f64-aref f64-row-major-aref f64-sap-ref)
+   ( u8  u8-array  u8-aref  u8-row-major-aref  u8-sap-ref)
+   (u16 u16-array u16-aref u16-row-major-aref u16-sap-ref)
+   (u32 u32-array u32-aref u32-row-major-aref u32-sap-ref)
+   (u64 u64-array u64-aref u64-row-major-aref u64-sap-ref)
+   ( s8  s8-array  s8-aref  s8-row-major-aref  s8-sap-ref)
+   (s16 s16-array s16-aref s16-row-major-aref s16-sap-ref)
+   (s32 s32-array s32-aref s32-row-major-aref s32-sap-ref)
+   (s64 s64-array s64-aref s64-row-major-aref s64-sap-ref))
   (:associatives
    (f32-and two-arg-f32-and +f32-true+)
    (f32-or  two-arg-f32-or  +f32-false+)
diff --git a/contrib/sb-simd/code/instruction-sets/sse.lisp b/contrib/sb-simd/code/instruction-sets/sse.lisp
index 01914ed50..ef861fe1a 100644
--- a/contrib/sb-simd/code/instruction-sets/sse.lisp
+++ b/contrib/sb-simd/code/instruction-sets/sse.lisp
@@ -68,12 +68,12 @@
    (f32.4-unpackhi    #:unpckhps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse)
    (f32.4-movemask    #:movmskps (u4)    (f32.4)       :cost 1))
   (:loads
-   (f32-load          #:movss   f32   f32vec f32-array f32-aref   f32-row-major-aref)
-   (f32.4-load        #:movups  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref))
+   (f32-load          #:movss   f32   f32vec f32-array f32-aref   f32-row-major-aref   f32-sap-ref)
+   (f32.4-load        #:movups  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref f32.4-sap-ref))
   (:stores
-   (f32-store         #:movss   f32   f32vec f32-array f32-aref   f32-row-major-aref)
-   (f32.4-store       #:movups  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref)
-   (f32.4-ntstore     #:movntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref))
+   (f32-store         #:movss   f32   f32vec f32-array f32-aref   f32-row-major-aref f32-sap-ref)
+   (f32.4-store       #:movups  f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref f32.4-sap-ref)
+   (f32.4-ntstore     #:movntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref f32.4-non-temporal-sap-ref))
   (:associatives
    (f32-and two-arg-f32-and +f32-true+)
    (f32-or  two-arg-f32-or  +f32-false+)
diff --git a/contrib/sb-simd/code/instruction-sets/sse2.lisp b/contrib/sb-simd/code/instruction-sets/sse2.lisp
index e7392e95f..6d6af89ce 100644
--- a/contrib/sb-simd/code/instruction-sets/sse2.lisp
+++ b/contrib/sb-simd/code/instruction-sets/sse2.lisp
@@ -308,39 +308,38 @@
    (s64.2-shiftr      #:psrlq      (s64.2) (s64.2 imm6)  :cost 1 :encoding :sse))
   (:loads
    #+sb-unicode
-   (u32.4-load-from-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
-   (f64-load   #:movsd  f64   f64vec f64-array f64-aref   f64-row-major-aref)
-   (f64.2-load #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref)
-   (u8.16-load #:movdqu u8.16  u8vec  u8-array u8.16-aref u8.16-row-major-aref)
-   (u16.8-load #:movdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref)
-   (u32.4-load #:movdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref)
-   (u64.2-load #:movdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref)
-   (s8.16-load #:movdqu s8.16  s8vec  s8-array s8.16-aref s8.16-row-major-aref)
-   (s16.8-load #:movdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref)
-   (s32.4-load #:movdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref)
-   (s64.2-load #:movdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref))
+   (u32.4-load-from-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref u32.4-string-sap-ref)
+   (f64-load   #:movsd  f64   f64vec f64-array f64-aref   f64-row-major-aref f64-sap-ref)
+   (f64.2-load #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref f64.2-sap-ref)
+   (u8.16-load #:movdqu u8.16  u8vec  u8-array u8.16-aref u8.16-row-major-aref u8.16-sap-ref)
+   (u16.8-load #:movdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref u16.8-sap-ref)
+   (u32.4-load #:movdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref u32.4-sap-ref)
+   (u64.2-load #:movdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref u64.2-sap-ref)
+   (s8.16-load #:movdqu s8.16  s8vec  s8-array s8.16-aref s8.16-row-major-aref s8.16-sap-ref)
+   (s16.8-load #:movdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref s16.8-sap-ref)
+   (s32.4-load #:movdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref s32.4-sap-ref)
+   (s64.2-load #:movdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref s64.2-sap-ref))
   (:stores
    #+sb-unicode
-   (u32.4-store-into-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref)
-   (f64-store   #:movsd  f64   f64vec f64-array f64-aref   f64-row-major-aref)
-   (f64.2-store #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref)
-   (u8.16-store #:movdqu u8.16  u8vec  u8-array u8.16-aref u8.16-row-major-aref)
-   (u16.8-store #:movdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref)
-   (u32.4-store #:movdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref)
-   (u64.2-store #:movdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref)
-   (s8.16-store #:movdqu s8.16  s8vec  s8-array s8.16-aref s8.16-row-major-aref)
-   (s16.8-store #:movdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref)
-   (s32.4-store #:movdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref)
-   (s64.2-store #:movdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref)
-   (f64.2-ntstore #:movntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref)
-   (u8.16-ntstore #:movntdq u8.16  u8vec  u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref)
-   (u16.8-ntstore #:movntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref)
-   (u32.4-ntstore #:movntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref)
-   (u64.2-ntstore #:movntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref)
-   (s8.16-ntstore #:movntdq s8.16  s8vec  s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref)
-   (s16.8-ntstore #:movntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref)
-   (s32.4-ntstore #:movntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref)
-   (s64.2-ntstore #:movntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref))
+   (u32.4-store-into-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref u32.4-string-sap-ref)
+   (f64.2-store #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref f64.2-sap-ref)
+   (u8.16-store #:movdqu u8.16 u8vec u8-array u8.16-aref u8.16-row-major-aref u8.16-sap-ref)
+   (u16.8-store #:movdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref u16.8-sap-ref)
+   (u32.4-store #:movdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref u32.4-sap-ref)
+   (u64.2-store #:movdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref u64.2-sap-ref)
+   (s8.16-store #:movdqu s8.16 s8vec s8-array s8.16-aref s8.16-row-major-aref s8.16-sap-ref)
+   (s16.8-store #:movdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref s16.8-sap-ref)
+   (s32.4-store #:movdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref s32.4-sap-ref)
+   (s64.2-store #:movdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref s64.2-sap-ref)
+   (f64.2-ntstore #:movntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref f64.2-non-temporal-sap-ref)
+   (u8.16-ntstore #:movntdq u8.16 u8vec  u8-array  u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref u8.16-non-temporal-sap-ref)
+   (u16.8-ntstore #:movntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref u16.8-non-temporal-sap-ref)
+   (u32.4-ntstore #:movntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref u32.4-non-temporal-sap-ref)
+   (u64.2-ntstore #:movntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref u64.2-non-temporal-sap-ref)
+   (s8.16-ntstore #:movntdq s8.16 s8vec  s8-array  s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref s8.16-non-temporal-sap-ref)
+   (s16.8-ntstore #:movntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref s16.8-non-temporal-sap-ref)
+   (s32.4-ntstore #:movntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref s32.4-non-temporal-sap-ref)
+   (s64.2-ntstore #:movntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref s64.2-non-temporal-sap-ref))
   (:associatives
    (f64-and two-arg-f64-and +f64-true+)
    (f64-or  two-arg-f64-or  +f64-false+)
diff --git a/contrib/sb-simd/code/instruction-sets/sse4-1.lisp b/contrib/sb-simd/code/instruction-sets/sse4-1.lisp
index fe40f9179..fd139bf05 100644
--- a/contrib/sb-simd/code/instruction-sets/sse4-1.lisp
+++ b/contrib/sb-simd/code/instruction-sets/sse4-1.lisp
@@ -72,27 +72,27 @@
    (s64.2-elt           #:pextrq    (s64)   (s64.2 imm1)       :cost 1)
    (s64.2-insert        #:pinsrq    (s64.2) (s64.2 s64 imm1)   :cost 1 :encoding :sse))
   (:loads
-   (f32.4-ntload #:movntdqa f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref)
-   (f64.2-ntload #:movntdqa f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref)
-   (u8.16-ntload #:movntdqa u8.16  u8vec  u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref)
-   (u16.8-ntload #:movntdqa u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref)
-   (u32.4-ntload #:movntdqa u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref)
-   (u64.2-ntload #:movntdqa u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref)
-   (s8.16-ntload #:movntdqa s8.16  s8vec  s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref)
-   (s16.8-ntload #:movntdqa s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref)
-   (s32.4-ntload #:movntdqa s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref)
-   (s64.2-ntload #:movntdqa s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref))
+   (f32.4-ntload #:movntdqa f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref f32.4-non-temporal-sap-ref)
+   (f64.2-ntload #:movntdqa f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref f64.2-non-temporal-sap-ref)
+   (u8.16-ntload #:movntdqa u8.16  u8vec  u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref u8.16-non-temporal-sap-ref)
+   (u16.8-ntload #:movntdqa u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref u16.8-non-temporal-sap-ref)
+   (u32.4-ntload #:movntdqa u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref u32.4-non-temporal-sap-ref)
+   (u64.2-ntload #:movntdqa u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref u64.2-non-temporal-sap-ref)
+   (s8.16-ntload #:movntdqa s8.16  s8vec  s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref s8.16-non-temporal-sap-ref)
+   (s16.8-ntload #:movntdqa s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref s16.8-non-temporal-sap-ref)
+   (s32.4-ntload #:movntdqa s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref s32.4-non-temporal-sap-ref)
+   (s64.2-ntload #:movntdqa s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref s64.2-non-temporal-sap-ref))
   (:stores
-   (f32.4-ntstore #:movntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref)
-   (f64.2-ntstore #:movntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref)
-   (u8.16-ntstore #:movntdq u8.16  u8vec  u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref)
-   (u16.8-ntstore #:movntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref)
-   (u32.4-ntstore #:movntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref)
-   (u64.2-ntstore #:movntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref)
-   (s8.16-ntstore #:movntdq s8.16  s8vec  s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref)
-   (s16.8-ntstore #:movntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref)
-   (s32.4-ntstore #:movntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref)
-   (s64.2-ntstore #:movntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref))
+   (f32.4-ntstore #:movntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref f32.4-non-temporal-sap-ref)
+   (f64.2-ntstore #:movntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref f64.2-non-temporal-sap-ref)
+   (u8.16-ntstore #:movntdq u8.16  u8vec  u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref u8.16-non-temporal-sap-ref)
+   (u16.8-ntstore #:movntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref u16.8-non-temporal-sap-ref)
+   (u32.4-ntstore #:movntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref u32.4-non-temporal-sap-ref)
+   (u64.2-ntstore #:movntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref u64.2-non-temporal-sap-ref)
+   (s8.16-ntstore #:movntdq s8.16  s8vec  s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref s8.16-non-temporal-sap-ref)
+   (s16.8-ntstore #:movntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref s16.8-non-temporal-sap-ref)
+   (s32.4-ntstore #:movntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref s32.4-non-temporal-sap-ref)
+   (s64.2-ntstore #:movntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref s64.2-non-temporal-sap-ref))
   (:associatives
    (u16.8-max two-arg-u16.8-max nil)
    (u16.8-min two-arg-u16.8-min nil)
diff --git a/contrib/sb-simd/code/packages.lisp b/contrib/sb-simd/code/packages.lisp
index 13a7a58fc..34e9d02f6 100644
--- a/contrib/sb-simd/code/packages.lisp
+++ b/contrib/sb-simd/code/packages.lisp
@@ -126,6 +126,10 @@
    #:row-major-aref-record-p
    #:setf-row-major-aref-record
    #:setf-row-major-aref-record-p
+   #:sap-ref-record
+   #:sap-ref-record-p
+   #:setf-sap-ref-record
+   #:setf-sap-ref-record-p
    #:instruction-record
    #:instruction-record-p
    #:instruction-record-name
@@ -151,6 +155,7 @@
    #:vref-record-value-record
    #:vref-record-vector-record
    #:vref-record-aref
+   #:vref-record-sap-ref
    #:vref-record-row-major-aref
    #:load-record
    #:load-record-p
@@ -162,6 +167,7 @@
    #:load-record-value-record
    #:load-record-vector-record
    #:load-record-aref
+   #:load-record-sap-ref
    #:load-record-row-major-aref
    #:store-record
    #:store-record-p
@@ -173,6 +179,7 @@
    #:store-record-value-record
    #:store-record-vector-record
    #:store-record-aref
+   #:store-record-sap-ref
    #:store-record-row-major-aref
    #:reffer-record
    #:reffer-record-p
@@ -327,6 +334,7 @@
      #:f32-incf
      #:f32-decf
      #:f32-aref
+     #:f32-sap-ref
      #:f32-row-major-aref
      ;; f64
      #:f64
@@ -356,6 +364,7 @@
      #:f64-incf
      #:f64-decf
      #:f64-aref
+     #:f64-sap-ref
      #:f64-row-major-aref
      ;; u1
      #:u1
@@ -386,6 +395,7 @@
      #:u8-incf
      #:u8-decf
      #:u8-aref
+     #:u8-sap-ref
      #:u8-row-major-aref
      ;; u16
      #:u16
@@ -410,6 +420,7 @@
      #:u16-incf
      #:u16-decf
      #:u16-aref
+     #:u16-sap-ref
      #:u16-row-major-aref
      ;; u32
      #:u32
@@ -434,6 +445,7 @@
      #:u32-incf
      #:u32-decf
      #:u32-aref
+     #:u32-sap-ref
      #:u32-row-major-aref
      ;; u64
      #:u64
@@ -458,6 +470,7 @@
      #:u64-incf
      #:u64-decf
      #:u64-aref
+     #:u64-sap-ref
      #:u64-row-major-aref
      ;; s8
      #:s8
@@ -482,6 +495,7 @@
      #:s8-incf
      #:s8-decf
      #:s8-aref
+     #:s8-sap-ref
      #:s8-row-major-aref
      ;; s16
      #:s16
@@ -506,6 +520,7 @@
      #:s16-incf
      #:s16-decf
      #:s16-aref
+     #:s16-sap-ref
      #:s16-row-major-aref
      ;; s32
      #:s32
@@ -532,6 +547,7 @@
      #:s32-incf
      #:s32-decf
      #:s32-aref
+     #:s32-sap-ref
      #:s32-row-major-aref
      ;; s64
      #:s64
@@ -556,6 +572,7 @@
      #:s64-incf
      #:s64-decf
      #:s64-aref
+     #:s64-sap-ref
      #:s64-row-major-aref
      ;; Simple Strings
      #+sb-unicode
@@ -620,8 +637,7 @@
      #:f32>=
      #:f32-incf
      #:f32-decf
-     #:f32-aref
-     #:f32-row-major-aref)
+     #:f32-aref #:f32-row-major-aref #:f32-sap-ref)
     #0#
     #1#
     #2=
@@ -662,8 +678,8 @@
      #:f32.4-unpacklo
      #:f32.4-incf
      #:f32.4-decf
-     #:f32.4-aref #:f32.4-row-major-aref
-     #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref))
+     #:f32.4-aref #:f32.4-row-major-aref  #:f32.4-sap-ref
+     #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref #:f32.4-non-temporal-sap-ref))
 
   (defpackage #:sb-simd-sse2
     (:use #:common-lisp #:sb-simd-internals #:sb-simd-sse)
@@ -691,7 +707,8 @@
      #:f64-incf
      #:f64-decf
      #:f64-aref
-     #:f64-row-major-aref)
+     #:f64-row-major-aref
+     #:f64-sap-ref)
     #0#
     #1#
     #2#
@@ -746,8 +763,8 @@
      #:f64.2-movemask
      #:f64.2-incf
      #:f64.2-decf
-     #:f64.2-aref #:f64.2-row-major-aref
-     #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref
+     #:f64.2-aref #:f64.2-row-major-aref #:f64.2-sap-ref
+     #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref #:f64.2-non-temporal-sap-ref
      ;; u8.16
      #:make-u8.16
      #:u8.16
@@ -777,8 +794,8 @@
      ;; #:u8.16-shiftr
      #:u8.16-incf
      #:u8.16-decf
-     #:u8.16-aref #:u8.16-row-major-aref
-     #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref
+     #:u8.16-aref #:u8.16-row-major-aref #:u8.16-sap-ref
+     #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref #:u8.16-non-temporal-sap-ref
      ;; u16.8
      #:make-u16.8
      #:u16.8
@@ -809,8 +826,8 @@
      #:u16.8-elt
      #:u16.8-shufflehi
      #:u16.8-shufflelo
-     #:u16.8-aref #:u16.8-row-major-aref
-     #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref
+     #:u16.8-aref #:u16.8-row-major-aref #:u16.8-sap-ref
+     #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref #:u16.8-non-temporal-sap-ref
      ;; u32.4
      #:make-u32.4
      #:u32.4
@@ -838,8 +855,8 @@
      #:u32.4-shiftr
      #:u32.4-incf
      #:u32.4-decf
-     #:u32.4-aref #:u32.4-row-major-aref
-     #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref
+     #:u32.4-aref #:u32.4-row-major-aref #:u32.4-sap-ref
+     #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref #:u32.4-non-temporal-sap-ref
      #+sb-unicode
      #:u32.4-string-ref
      #+sb-unicode
@@ -864,8 +881,8 @@
      #:u64.2-shiftr
      #:u64.2-incf
      #:u64.2-decf
-     #:u64.2-aref #:u64.2-row-major-aref
-     #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref
+     #:u64.2-aref #:u64.2-row-major-aref #:u64.2-sap-ref
+     #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref #:u64.2-non-temporal-sap-ref
      ;; s8.16
      #:make-s8.16
      #:s8.16
@@ -888,8 +905,8 @@
      #:s8.16-unpackhi
      #:s8.16-unpacklo
      #:s8.16-movemask
-     #:s8.16-aref #:s8.16-row-major-aref
-     #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref
+     #:s8.16-aref #:s8.16-row-major-aref #:s8.16-sap-ref
+     #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref #:s8.16-non-temporal-sap-ref
      ;; s16.8
      #:make-s16.8
      #:s16.8
@@ -918,8 +935,8 @@
      #:s16.8-shufflelo
      #:s16.8-shiftl
      #:s16.8-shiftr
-     #:s16.8-aref #:s16.8-row-major-aref
-     #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref
+     #:s16.8-aref #:s16.8-row-major-aref #:s16.8-sap-ref
+     #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref #:s16.8-non-temporal-sap-ref
      ;; s32.4
      #:make-s32.4
      #:s32.4
@@ -947,8 +964,8 @@
      #:s32.4-shuffle
      #:s32.4-shiftl
      #:s32.4-shiftr
-     #:s32.4-aref #:s32.4-row-major-aref
-     #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref
+     #:s32.4-aref #:s32.4-row-major-aref #:s32.4-sap-ref
+     #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref #:s32.4-non-temporal-sap-ref
      ;; s64.2
      #:make-s64.2
      #:s64.2
@@ -967,8 +984,8 @@
      #:s64.2-movemask
      #:s64.2-shiftl
      #:s64.2-shiftr
-     #:s64.2-aref #:s64.2-row-major-aref
-     #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref))
+     #:s64.2-aref #:s64.2-row-major-aref #:s64.2-sap-ref
+     #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref #:s64.2-non-temporal-sap-ref))
 
   (defpackage #:sb-simd-sse3
     (:use #:common-lisp #:sb-simd-internals #:sb-simd-sse2)
@@ -1013,16 +1030,16 @@
   (defpackage #:sb-simd-sse4.1
     (:use #:common-lisp #:sb-simd-internals #:sb-simd-ssse3)
     (:shadow
-     #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref
-     #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref
-     #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref
-     #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref
-     #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref
-     #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref
-     #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref
-     #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref
-     #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref
-     #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref)
+     #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref #:f32.4-non-temporal-sap-ref
+     #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref #:f64.2-non-temporal-sap-ref
+     #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref #:u8.16-non-temporal-sap-ref
+     #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref #:u16.8-non-temporal-sap-ref
+     #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref #:u32.4-non-temporal-sap-ref
+     #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref #:u64.2-non-temporal-sap-ref
+     #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref #:s8.16-non-temporal-sap-ref
+     #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref #:s16.8-non-temporal-sap-ref
+     #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref #:s32.4-non-temporal-sap-ref
+     #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref #:s64.2-non-temporal-sap-ref)
     #0#
     #1#
     #2#
@@ -1142,6 +1159,7 @@
      #:f32-incf
      #:f32-decf
      #:f32-aref
+     #:f32-sap-ref
      #:f32-row-major-aref
      ;; f64
      #:f64
@@ -1166,6 +1184,7 @@
      #:f64-incf
      #:f64-decf
      #:f64-aref
+     #:f64-sap-ref
      #:f64-row-major-aref)
     #8=
     (:export
@@ -1231,8 +1250,8 @@
      #:f32.4-decf
      #:f32.4-dupeven
      #:f32.4-dupodd
-     #:f32.4-aref #:f32.4-row-major-aref
-     #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref
+     #:f32.4-aref #:f32.4-row-major-aref #:f32.4-sap-ref
+     #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref #:f32.4-non-temporal-sap-ref
      ;; f64.2
      #:make-f64.2
      #:f64.2
@@ -1279,8 +1298,8 @@
      #:f64.2-movemask
      #:f64.2-incf
      #:f64.2-decf
-     #:f64.2-aref #:f64.2-row-major-aref
-     #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref
+     #:f64.2-aref #:f64.2-row-major-aref #:f64.2-sap-ref
+     #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref #:f64.2-non-temporal-sap-ref
      ;; f32.8
      #:make-f32.8
      #:f32.8
@@ -1335,8 +1354,8 @@
      #:f32.8-round
      #:f32.8-incf
      #:f32.8-decf
-     #:f32.8-aref #:f32.8-row-major-aref
-     #:f32.8-non-temporal-aref #:f32.8-non-temporal-row-major-aref
+     #:f32.8-aref #:f32.8-row-major-aref #:f32.8-sap-ref
+     #:f32.8-non-temporal-aref #:f32.8-non-temporal-row-major-aref #:f32.8-non-temporal-sap-ref
      ;; f64.4
      #:make-f64.4
      #:f64.4
@@ -1389,8 +1408,8 @@
      #:f64.4-round
      #:f64.4-incf
      #:f64.4-decf
-     #:f64.4-aref #:f64.4-row-major-aref
-     #:f64.4-non-temporal-aref #:f64.4-non-temporal-row-major-aref
+     #:f64.4-aref #:f64.4-row-major-aref #:f64.4-sap-ref
+     #:f64.4-non-temporal-aref #:f64.4-non-temporal-row-major-aref #:f64.4-non-temporal-sap-ref
      ;; u8.16
      #:make-u8.16
      #:u8.16
@@ -1415,8 +1434,8 @@
      #:u8.16-unpacklo
      #:u8.16-movemask
      #:u8.16-shuffle
-     #:u8.16-aref #:u8.16-row-major-aref
-     #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref
+     #:u8.16-aref #:u8.16-row-major-aref #:u8.16-sap-ref
+     #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref #:u8.16-non-temporal-sap-ref
      ;; u16.8
      #:make-u16.8
      #:u16.8
@@ -1444,8 +1463,8 @@
      #:u16.8-movemask
      #:u16.8-shufflehi
      #:u16.8-shufflelo
-     #:u16.8-aref #:u16.8-row-major-aref
-     #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref
+     #:u16.8-aref #:u16.8-row-major-aref #:u16.8-sap-ref
+     #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref #:u16.8-non-temporal-sap-ref
      ;; u32.4
      #:make-u32.4
      #:u32.4
@@ -1470,11 +1489,13 @@
      #:u32.4-unpacklo
      #:u32.4-movemask
      #:u32.4-permute
-     #:u32.4-aref #:u32.4-row-major-aref
-     #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref
+     #:u32.4-aref #:u32.4-row-major-aref #:u32.4-sap-ref
+     #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref #:u32.4-non-temporal-sap-ref
      #+sb-unicode
      #:u32.4-string-ref
      #+sb-unicode
+     #:u32.4-string-sap-ref
+     #+sb-unicode
      #:u32.4-row-major-string-ref
      ;; u64.2
      #:make-u64.2
@@ -1500,8 +1521,8 @@
      #:u64.2-unpacklo
      #:u64.2-movemask
      #:u64.2-permute
-     #:u64.2-aref #:u64.2-row-major-aref
-     #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref
+     #:u64.2-aref #:u64.2-row-major-aref #:u64.2-sap-ref
+     #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref #:u64.2-non-temporal-sap-ref
      ;; u8.32
      #:make-u8.32
      #:u8.32
@@ -1510,8 +1531,8 @@
      #:u8.32-broadcast
      #:u8.16-from-u8.32
      #:u8.32-insert-u8.16
-     #:u8.32-aref #:u8.32-row-major-aref
-     #:u8.32-non-temporal-aref #:u8.32-non-temporal-row-major-aref
+     #:u8.32-aref #:u8.32-row-major-aref #:u8.32-sap-ref
+     #:u8.32-non-temporal-aref #:u8.32-non-temporal-row-major-aref #:u8.32-non-temporal-sap-ref
      ;; u16.16
      #:make-u16.16
      #:u16.16
@@ -1520,8 +1541,8 @@
      #:u16.16-broadcast
      #:u16.8-from-u16.16
      #:u16.16-insert-u16.8
-     #:u16.16-aref #:u16.16-row-major-aref
-     #:u16.16-non-temporal-aref #:u16.16-non-temporal-row-major-aref
+     #:u16.16-aref #:u16.16-row-major-aref #:u16.16-sap-ref
+     #:u16.16-non-temporal-aref #:u16.16-non-temporal-row-major-aref #:u16.16-non-temporal-sap-ref
      ;; u32.8
      #:make-u32.8
      #:u32.8
@@ -1530,11 +1551,13 @@
      #:u32.8-broadcast
      #:u32.8-permute
      #:u32.8-insert-u32.4
-     #:u32.8-aref #:u32.8-row-major-aref
-     #:u32.8-non-temporal-aref #:u32.8-non-temporal-row-major-aref
+     #:u32.8-aref #:u32.8-row-major-aref #:u32.8-sap-ref
+     #:u32.8-non-temporal-aref #:u32.8-non-temporal-row-major-aref #:u32.8-non-temporal-sap-ref
      #+sb-unicode
      #:u32.8-string-ref
      #+sb-unicode
+     #:u32.8-string-sap-ref
+     #+sb-unicode
      #:u32.8-row-major-string-ref
      ;; u64.4
      #:make-u64.4
@@ -1545,8 +1568,8 @@
      #:u64.4-permute
      #:u64.2-from-u64.4
      #:u64.4-insert-u64.2
-     #:u64.4-aref #:u64.4-row-major-aref
-     #:u64.4-non-temporal-aref #:u64.4-non-temporal-row-major-aref
+     #:u64.4-aref #:u64.4-row-major-aref #:u64.4-sap-ref
+     #:u64.4-non-temporal-aref #:u64.4-non-temporal-row-major-aref #:u64.4-non-temporal-sap-ref
      ;; s8.16
      #:make-s8.16
      #:s8.16
@@ -1571,8 +1594,8 @@
      #:s8.16-unpacklo
      #:s8.16-movemask
      #:s8.16-shuffle
-     #:s8.16-aref #:s8.16-row-major-aref
-     #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref
+     #:s8.16-aref #:s8.16-row-major-aref #:s8.16-sap-ref
+     #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref #:s8.16-non-temporal-sap-ref
      ;; s16.8
      #:make-s16.8
      #:s16.8
@@ -1602,8 +1625,8 @@
      #:s16.8-movemask
      #:s16.8-shufflehi
      #:s16.8-shufflelo
-     #:s16.8-aref #:s16.8-row-major-aref
-     #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref
+     #:s16.8-aref #:s16.8-row-major-aref #:s16.8-sap-ref
+     #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref #:s16.8-non-temporal-sap-ref
      ;; s32.4
      #:make-s32.4
      #:s32.4
@@ -1632,8 +1655,8 @@
      #:s32.4-unpacklo
      #:s32.4-movemask
      #:s32.4-permute
-     #:s32.4-aref #:s32.4-row-major-aref
-     #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref
+     #:s32.4-aref #:s32.4-row-major-aref #:s32.4-sap-ref
+     #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref #:s32.4-non-temporal-sap-ref
      ;; s64.2
      #:s64.2
      #:make-s64.2
@@ -1661,8 +1684,8 @@
      #:s64.2-unpacklo
      #:s64.2-movemask
      #:s64.2-permute
-     #:s64.2-aref #:s64.2-row-major-aref
-     #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref
+     #:s64.2-aref #:s64.2-row-major-aref #:s64.2-sap-ref
+     #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref #:s64.2-non-temporal-sap-ref
      ;; s8.32
      #:make-s8.32
      #:s8.32
@@ -1672,8 +1695,8 @@
      #:s8.16-from-s8.32
      #:s8.32-insert-s8.16
      #:s8.32-permute128
-     #:s8.32-aref #:s8.32-row-major-aref
-     #:s8.32-non-temporal-aref #:s8.32-non-temporal-row-major-aref
+     #:s8.32-aref #:s8.32-row-major-aref #:s8.32-sap-ref
+     #:s8.32-non-temporal-aref #:s8.32-non-temporal-row-major-aref #:s8.32-non-temporal-sap-ref
      ;; s16.16
      #:make-s16.16
      #:s16.16
@@ -1683,8 +1706,8 @@
      #:s16.8-from-s16.16
      #:s16.16-insert-s16.8
      #:s16.16-permute128
-     #:s16.16-aref #:s16.16-row-major-aref
-     #:s16.16-non-temporal-aref #:s16.16-non-temporal-row-major-aref
+     #:s16.16-aref #:s16.16-row-major-aref #:s16.16-sap-ref
+     #:s16.16-non-temporal-aref #:s16.16-non-temporal-row-major-aref #:s16.16-non-temporal-sap-ref
      ;; s32.8
      #:make-s32.8
      #:s32.8
@@ -1696,8 +1719,8 @@
      #:s32.8-insert-s32.4
      #:s32.8-permute128
      #:s32.8-permute
-     #:s32.8-aref #:s32.8-row-major-aref
-     #:s32.8-non-temporal-aref #:s32.8-non-temporal-row-major-aref
+     #:s32.8-aref #:s32.8-row-major-aref #:s32.8-sap-ref
+     #:s32.8-non-temporal-aref #:s32.8-non-temporal-row-major-aref #:s32.8-non-temporal-sap-ref
      ;; s64.4
      #:make-s64.4
      #:s64.4
@@ -1708,8 +1731,8 @@
      #:s64.4-insert-s64.2
      #:s64.4-permute
      #:s64.4-permute128
-     #:s64.4-aref #:s64.4-row-major-aref
-     #:s64.4-non-temporal-aref #:s64.4-non-temporal-row-major-aref))
+     #:s64.4-aref #:s64.4-row-major-aref #:s64.4-sap-ref
+     #:s64.4-non-temporal-aref #:s64.4-non-temporal-row-major-aref #:s64.4-non-temporal-sap-ref))
 
   (defpackage #:sb-simd-avx2
     (:use #:common-lisp #:sb-simd-internals #:sb-simd-avx)
@@ -1739,26 +1762,26 @@
      #:f64.4-reverse
      #:s64.2-shiftl
      #:s64.2-shiftr
-     #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref
-     #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref
-     #:f32.8-non-temporal-aref #:f32.8-non-temporal-row-major-aref
-     #:f64.4-non-temporal-aref #:f64.4-non-temporal-row-major-aref
-     #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref
-     #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref
-     #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref
-     #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref
-     #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref
-     #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref
-     #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref
-     #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref
-     #:u8.32-non-temporal-aref  #:u8.32-non-temporal-row-major-aref
-     #:u16.16-non-temporal-aref #:u16.16-non-temporal-row-major-aref
-     #:u32.8-non-temporal-aref  #:u32.8-non-temporal-row-major-aref
-     #:u64.4-non-temporal-aref  #:u64.4-non-temporal-row-major-aref
-     #:s8.32-non-temporal-aref  #:s8.32-non-temporal-row-major-aref
-     #:s16.16-non-temporal-aref #:s16.16-non-temporal-row-major-aref
-     #:s32.8-non-temporal-aref  #:s32.8-non-temporal-row-major-aref
-     #:s64.4-non-temporal-aref  #:s64.4-non-temporal-row-major-aref)
+     #:f32.4-non-temporal-aref  #:f32.4-non-temporal-row-major-aref   #:f32.4-non-temporal-sap-ref
+     #:f64.2-non-temporal-aref  #:f64.2-non-temporal-row-major-aref   #:f64.2-non-temporal-sap-ref
+     #:f32.8-non-temporal-aref  #:f32.8-non-temporal-row-major-aref   #:f32.8-non-temporal-sap-ref
+     #:f64.4-non-temporal-aref  #:f64.4-non-temporal-row-major-aref   #:f64.4-non-temporal-sap-ref
+     #:u8.16-non-temporal-aref  #:u8.16-non-temporal-row-major-aref   #:u8.16-non-temporal-sap-ref
+     #:u16.8-non-temporal-aref  #:u16.8-non-temporal-row-major-aref   #:u16.8-non-temporal-sap-ref
+     #:u32.4-non-temporal-aref  #:u32.4-non-temporal-row-major-aref   #:u32.4-non-temporal-sap-ref
+     #:u64.2-non-temporal-aref  #:u64.2-non-temporal-row-major-aref   #:u64.2-non-temporal-sap-ref
+     #:s8.16-non-temporal-aref  #:s8.16-non-temporal-row-major-aref   #:s8.16-non-temporal-sap-ref
+     #:s16.8-non-temporal-aref  #:s16.8-non-temporal-row-major-aref   #:s16.8-non-temporal-sap-ref
+     #:s32.4-non-temporal-aref  #:s32.4-non-temporal-row-major-aref   #:s32.4-non-temporal-sap-ref
+     #:s64.2-non-temporal-aref  #:s64.2-non-temporal-row-major-aref   #:s64.2-non-temporal-sap-ref
+     #:u8.32-non-temporal-aref  #:u8.32-non-temporal-row-major-aref   #:u8.32-non-temporal-sap-ref
+     #:u16.16-non-temporal-aref #:u16.16-non-temporal-row-major-aref #:u16.16-non-temporal-sap-ref
+     #:u32.8-non-temporal-aref  #:u32.8-non-temporal-row-major-aref   #:u32.8-non-temporal-sap-ref
+     #:u64.4-non-temporal-aref  #:u64.4-non-temporal-row-major-aref   #:u64.4-non-temporal-sap-ref
+     #:s8.32-non-temporal-aref  #:s8.32-non-temporal-row-major-aref   #:s8.32-non-temporal-sap-ref
+     #:s16.16-non-temporal-aref #:s16.16-non-temporal-row-major-aref #:s16.16-non-temporal-sap-ref
+     #:s32.8-non-temporal-aref  #:s32.8-non-temporal-row-major-aref   #:s32.8-non-temporal-sap-ref
+     #:s64.4-non-temporal-aref  #:s64.4-non-temporal-row-major-aref   #:s64.4-non-temporal-sap-ref)
     #0#
     #1#
     #8#
diff --git a/contrib/sb-simd/code/record.lisp b/contrib/sb-simd/code/record.lisp
index ab8f7aa3f..0ff6dcb4d 100644
--- a/contrib/sb-simd/code/record.lisp
+++ b/contrib/sb-simd/code/record.lisp
@@ -367,9 +367,29 @@
    (%name :reader aref-record-name)
    (%instruction-set :reader aref-record-instruction-set)))
 
+(defclass sap-ref-record (function-record)
+  ((%result-records
+    :type list
+    :initarg :result-records
+    :initform (required-argument :result-records)
+    :reader function-record-result-records)
+   ;; A function record, denoting the underlying primitive load or store
+   ;; operation of that record.  This primitive always accepts a
+   ;; one-dimensional array and a single row-major index as arguments.
+   (%primitive
+    :type (or function-record null)
+    :initarg :primitive
+    :initform nil
+    :reader reffer-record-primitive)
+   (%name :reader sap-ref-record-name)
+   (%instruction-set :reader sap-ref-record-instruction-set)))
+
 (defun aref-record-p (x)
   (typep x 'aref-record))
 
+(defun sap-ref-record-p (x)
+  (typep x 'sap-ref-record))
+
 (defmethod function-record-required-argument-records
     ((aref-record aref-record))
   (list (reffer-record-array-record aref-record)))
@@ -378,6 +398,11 @@
     ((aref-record aref-record))
   (find-value-record 'sb-simd:index))
 
+(defmethod function-record-required-argument-records
+    ((record sap-ref-record))
+  (list (find-value-record 'sb-alien:system-area-pointer)
+        (find-value-record 'sb-simd:index)))
+
 (defclass row-major-aref-record (reffer-record)
   (;; Define aliases for inherited slots.
    (%name :reader row-major-aref-record-name)
@@ -399,11 +424,39 @@
 (defun setf-aref-record-p (x)
   (typep x 'setf-aref-record))
 
+(defclass setf-sap-ref-record (function-record)
+  (;; Define aliases for inherited slots.
+   (%name :reader setf-sap-ref-record-name)
+   (%instruction-set :reader setf-sap-ref-record-instruction-set)
+   ;; A value record, describing which kinds of objects are loaded or stored.
+   (%result-records
+    :type list
+    :initarg :result-records
+    :initform (required-argument :result-records)
+    :reader function-record-result-records)
+   ;; A function record, denoting the underlying primitive load or store
+   ;; operation of that record.  This primitive always accepts a
+   ;; one-dimensional array and a single row-major index as arguments.
+   (%primitive
+    :type (or function-record null)
+    :initarg :primitive
+    :initform nil
+    :reader reffer-record-primitive)))
+
+(defun setf-sap-ref-record-p (x)
+  (typep x 'setf-sap-ref-record))
+
 (defmethod function-record-required-argument-records
     ((setf-aref-record setf-aref-record))
   (list (function-record-result-record setf-aref-record)
         (reffer-record-array-record setf-aref-record)))
 
+(defmethod function-record-required-argument-records
+    ((setf-sap-ref-record setf-sap-ref-record))
+  (list (function-record-result-record setf-sap-ref-record)
+        (find-value-record 'sb-alien:system-area-pointer)
+        (find-value-record 'sb-simd:index)))
+
 (defmethod function-record-rest-argument-record
     ((setf-aref-record setf-aref-record))
   (find-value-record 'sb-simd:index))
@@ -423,7 +476,7 @@
         (find-value-record 'sb-simd:index)))
 
 (defmethod decode-record-definition ((_ (eql 'reffer-record)) expr)
-  (destructuring-bind (type array-type aref row-major-aref) expr
+  (destructuring-bind (type array-type aref row-major-aref &optional sap-ref) expr
     `(let ((.value-record. (find-value-record ',type))
            (.array-record. (find-value-record ',array-type)))
        (let ((.primitive. (make-instance 'row-major-aref-record
@@ -443,7 +496,14 @@
            :name '(setf ,aref)
            :array-record .array-record.
            :primitive .primitive.
-           :result-records (list .value-record.))))))
+           :result-records (list .value-record.)))
+       ,@(when sap-ref
+           `((make-instance 'sap-ref-record
+                            :name ',sap-ref
+                            :result-records (list .value-record.))
+             (make-instance 'setf-sap-ref-record
+                            :name '(setf ,sap-ref)
+                            :result-records (list .value-record.)))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
@@ -601,7 +661,12 @@
     :type function-name
     :initarg :row-major-aref
     :initform (required-argument :row-major-aref)
-    :reader vref-record-row-major-aref)))
+    :reader vref-record-row-major-aref)
+   (%sap-ref
+    :type function-name
+    :initarg :sap-ref
+    :initform (required-argument :sap-ref)
+    :reader vref-record-sap-ref)))
 
 (defun vref-record-p (x)
   (typep x 'vref-record))
@@ -612,14 +677,15 @@
         :mnemonic (vref-record-mnemonic vref-record)
         :vector-record (vref-record-vector-record vref-record)
         :aref (vref-record-aref vref-record)
-        :row-major-aref (vref-record-row-major-aref vref-record)))
+        :row-major-aref (vref-record-row-major-aref vref-record)
+        :sap-ref (vref-record-sap-ref vref-record)))
 
 (defmethod function-record-result-records ((vref-record vref-record))
   (list
    (vref-record-value-record vref-record)))
 
 (defun decode-vref-record-definition (expr instance)
-  (destructuring-bind (name mnemonic value-type vector-type array-type aref row-major-aref &rest rest) expr
+  (destructuring-bind (name mnemonic value-type vector-type array-type aref row-major-aref sap-ref &rest rest) expr
     `(let* ((.value-record. (find-value-record ',value-type))
             (.vector-record. (find-value-record ',vector-type))
             (.array-record. (find-value-record ',array-type))
@@ -633,6 +699,7 @@
                 :vector-record .vector-record.
                 :aref ',aref
                 :row-major-aref ',row-major-aref
+                :sap-ref ',sap-ref
                 ,@rest)))
        ,(if (eq instance 'load-record)
             `(make-instance 'row-major-aref-record
@@ -655,6 +722,15 @@
                :name '(setf ,aref)
                :array-record .array-record.
                :primitive .primitive.
+               :result-records (list .value-record.)))
+       ,(if (eq instance 'load-record)
+            `(make-instance 'sap-ref-record
+               :name ',sap-ref
+               :primitive .primitive.
+               :result-records (list .value-record.))
+            `(make-instance 'setf-sap-ref-record
+               :name '(setf ,sap-ref)
+               :primitive .primitive.
                :result-records (list .value-record.))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -671,7 +747,8 @@
    (%value-record :reader load-record-value-record)
    (%vector-record :reader load-record-vector-record)
    (%aref :reader load-record-aref)
-   (%row-major-aref :reader load-record-row-major-aref)))
+   (%row-major-aref :reader load-record-row-major-aref)
+   (%sap-ref :reader load-record-sap-ref)))
 
 (defun load-record-p (x)
   (typep x 'load-record))
@@ -697,7 +774,8 @@
    (%value-record :reader store-record-value-record)
    (%vector-record :reader store-record-vector-record)
    (%aref :reader store-record-aref)
-   (%row-major-aref :reader store-record-row-major-aref)))
+   (%row-major-aref :reader store-record-row-major-aref)
+   (%sap-ref :reader store-record-sap-ref)))
 
 (defun store-record-p (x)
   (typep x 'store-record))

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


hooks/post-receive
-- 
SBCL