* This is for those cases where you know that you are trying to
read valid boxed data, the address of the data you want to read
is in some sense "stable" (meaning, won't be moved by the GC),
and you don't want to deal with the requirements for calling
SB-KERNEL:MAKE-LISP-OBJ.
* Implemented across the board, but only tested on PPC. What
could possibly go wrong?
"%SET-VECTOR-RAW-BITS"
"%SET-SAP-REF-16" "%SET-SAP-REF-32" "%SET-SAP-REF-64"
"%SET-SAP-REF-WORD" "%SET-SAP-REF-8" "%SET-SAP-REF-DOUBLE"
"%SET-VECTOR-RAW-BITS"
"%SET-SAP-REF-16" "%SET-SAP-REF-32" "%SET-SAP-REF-64"
"%SET-SAP-REF-WORD" "%SET-SAP-REF-8" "%SET-SAP-REF-DOUBLE"
- "%SET-SAP-REF-LONG" "%SET-SAP-REF-SAP"
+ "%SET-SAP-REF-LISPOBJ" "%SET-SAP-REF-LONG" "%SET-SAP-REF-SAP"
"%SET-SAP-REF-SINGLE" "%SET-SIGNED-SAP-REF-16"
"%SET-SIGNED-SAP-REF-32" "%SET-SIGNED-SAP-REF-64"
"%SET-SIGNED-SAP-REF-WORD"
"%SET-SAP-REF-SINGLE" "%SET-SIGNED-SAP-REF-16"
"%SET-SIGNED-SAP-REF-32" "%SET-SIGNED-SAP-REF-64"
"%SET-SIGNED-SAP-REF-WORD"
"SAP-INT"
"SAP-REF-16" "SAP-REF-32" "SAP-REF-64" "SAP-REF-WORD"
"SAP-REF-8"
"SAP-INT"
"SAP-REF-16" "SAP-REF-32" "SAP-REF-64" "SAP-REF-WORD"
"SAP-REF-8"
- "SAP-REF-DOUBLE" "SAP-REF-LONG"
+ "SAP-REF-DOUBLE" "SAP-REF-LISPOBJ" "SAP-REF-LONG"
"SAP-REF-SAP" "SAP-REF-SINGLE"
"SAP<" "SAP<=" "SAP=" "SAP>" "SAP>="
"SCRUB-CONTROL-STACK" "SERVE-ALL-EVENTS"
"SAP-REF-SAP" "SAP-REF-SINGLE"
"SAP<" "SAP<=" "SAP=" "SAP>" "SAP>="
"SCRUB-CONTROL-STACK" "SERVE-ALL-EVENTS"
(defsetf sap-ref-word %set-sap-ref-word)
(defsetf signed-sap-ref-word %set-signed-sap-ref-word)
(defsetf sap-ref-sap %set-sap-ref-sap)
(defsetf sap-ref-word %set-sap-ref-word)
(defsetf signed-sap-ref-word %set-signed-sap-ref-word)
(defsetf sap-ref-sap %set-sap-ref-sap)
+(defsetf sap-ref-lispobj %set-sap-ref-lispobj)
(defsetf sap-ref-single %set-sap-ref-single)
(defsetf sap-ref-double %set-sap-ref-double)
#!+long-float (defsetf sap-ref-long %set-sap-ref-long)
(defsetf sap-ref-single %set-sap-ref-single)
(defsetf sap-ref-double %set-sap-ref-double)
#!+long-float (defsetf sap-ref-long %set-sap-ref-long)
(fixnum offset))
(sap-ref-sap sap offset))
(fixnum offset))
(sap-ref-sap sap offset))
+;; Return the LISPOBJ at OFFSET bytes from SAP.
+(defun sap-ref-lispobj (sap offset)
+ (declare (type system-area-pointer sap)
+ (fixnum offset))
+ (sap-ref-lispobj sap offset))
+
;;; Return the 32-bit SINGLE-FLOAT at OFFSET bytes from SAP.
(defun sap-ref-single (sap offset)
(declare (type system-area-pointer sap)
;;; Return the 32-bit SINGLE-FLOAT at OFFSET bytes from SAP.
(defun sap-ref-single (sap offset)
(declare (type system-area-pointer sap)
(fixnum offset))
(setf (sap-ref-sap sap offset) new-value))
(fixnum offset))
(setf (sap-ref-sap sap offset) new-value))
+(defun %set-sap-ref-lispobj (sap offset new-value)
+ (declare (type system-area-pointer sap)
+ (fixnum offset)
+ (t new-value))
+ (setf (sap-ref-lispobj sap offset) new-value))
+
(defun %set-sap-ref-single (sap offset new-value)
(declare (type system-area-pointer sap)
(fixnum offset)
(defun %set-sap-ref-single (sap offset new-value)
(declare (type system-area-pointer sap)
(fixnum offset)
signed-reg signed-num :quad t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :quad)
signed-reg signed-num :quad t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :quad)
+ (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj
+ descriptor-reg * :long)
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
+ (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj
+ descriptor-reg * :long)
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :float)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :float)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
+ (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj
+ descriptor-reg * :long)
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
+ (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj
+ descriptor-reg * :long)
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
(defsapref signed-sap-ref-64 (signed-byte 64))
(defsapref signed-sap-ref-word (signed-byte #.sb!vm:n-word-bits))
(defsapref sap-ref-sap system-area-pointer)
(defsapref signed-sap-ref-64 (signed-byte 64))
(defsapref signed-sap-ref-word (signed-byte #.sb!vm:n-word-bits))
(defsapref sap-ref-sap system-area-pointer)
+ (defsapref sap-ref-lispobj t)
(defsapref sap-ref-single single-float)
(defsapref sap-ref-double double-float)
(defsapref sap-ref-long long-float)
(defsapref sap-ref-single single-float)
(defsapref sap-ref-double double-float)
(defsapref sap-ref-long long-float)
(def %set-signed-sap-ref-64 t (signed-byte 64))
(def sap-ref-sap)
(def %set-sap-ref-sap t system-area-pointer)
(def %set-signed-sap-ref-64 t (signed-byte 64))
(def sap-ref-sap)
(def %set-sap-ref-sap t system-area-pointer)
+ (def sap-ref-lispobj)
+ (def %set-sap-ref-lispobj t t)
(def sap-ref-single)
(def %set-sap-ref-single t single-float)
(def sap-ref-double)
(def sap-ref-single)
(def %set-sap-ref-single t single-float)
(def sap-ref-double)
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
signed-reg signed-num :long t)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap
sap-reg system-area-pointer :long)
+ (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj
+ descriptor-reg * :long)
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
(def-system-ref-and-set sap-ref-single %set-sap-ref-single
single-reg single-float :single)
(def-system-ref-and-set sap-ref-double %set-sap-ref-double
(def-system-ref-and-set signed-sap-ref-64 %set-signed-sap-ref-64 mov
signed-reg signed-num :qword)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap mov
(def-system-ref-and-set signed-sap-ref-64 %set-signed-sap-ref-64 mov
signed-reg signed-num :qword)
(def-system-ref-and-set sap-ref-sap %set-sap-ref-sap mov
- sap-reg system-area-pointer :qword))
+ sap-reg system-area-pointer :qword)
+ (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj mov
+ descriptor-reg * :qword))
(def-system-ref-and-set sb!c::signed-sap-ref-32-with-offset sb!c::%set-signed-sap-ref-32-with-offset
signed-reg signed-num :dword t)
(def-system-ref-and-set sb!c::sap-ref-sap-with-offset sb!c::%set-sap-ref-sap-with-offset
(def-system-ref-and-set sb!c::signed-sap-ref-32-with-offset sb!c::%set-signed-sap-ref-32-with-offset
signed-reg signed-num :dword t)
(def-system-ref-and-set sb!c::sap-ref-sap-with-offset sb!c::%set-sap-ref-sap-with-offset
- sap-reg system-area-pointer :dword))
+ sap-reg system-area-pointer :dword)
+ (def-system-ref-and-set sb!c::sap-ref-lispobj-with-offset sb!c::%set-sap-ref-lispobj-with-offset
+ descriptor-reg * :dword))