- (cond ((and (constant-continuation-p offset)
- (eql (continuation-value offset) 0))
- 'sap)
- (t
- (extract-function-args sap 'sap+ 2)
- '(lambda (sap offset1 offset2)
- (sap+ sap (+ offset1 offset2))))))
-
-(dolist (fun '(sap-ref-8 %set-sap-ref-8
- signed-sap-ref-8 %set-signed-sap-ref-8
- sap-ref-16 %set-sap-ref-16
- signed-sap-ref-16 %set-signed-sap-ref-16
- sap-ref-32 %set-sap-ref-32
- signed-sap-ref-32 %set-signed-sap-ref-32
- sap-ref-sap %set-sap-ref-sap
- sap-ref-single %set-sap-ref-single
- sap-ref-double %set-sap-ref-double
- #!+(or x86 long-float) sap-ref-long
- #!+long-float %set-sap-ref-long))
- (deftransform fun ((sap offset) '* '* :eval-name t)
- (extract-function-args sap 'sap+ 2)
- `(lambda (sap offset1 offset2)
- (,fun sap (+ offset1 offset2)))))
+ (cond ((and (constant-lvar-p offset)
+ (eql (lvar-value offset) 0))
+ 'sap)
+ (t
+ (extract-fun-args sap 'sap+ 2)
+ '(lambda (sap offset1 offset2)
+ (sap+ sap (+ offset1 offset2))))))
+
+(macrolet ((def (fun)
+ `(deftransform ,fun ((sap offset) * *)
+ (extract-fun-args sap 'sap+ 2)
+ `(lambda (sap offset1 offset2)
+ (,',fun sap (+ offset1 offset2))))))
+ (def sap-ref-8)
+ (def %set-sap-ref-8)
+ (def signed-sap-ref-8)
+ (def %set-signed-sap-ref-8)
+ (def sap-ref-16)
+ (def %set-sap-ref-16)
+ (def signed-sap-ref-16)
+ (def %set-signed-sap-ref-16)
+ (def sap-ref-32)
+ (def %set-sap-ref-32)
+ (def signed-sap-ref-32)
+ (def %set-signed-sap-ref-32)
+ (def sap-ref-64)
+ (def %set-sap-ref-64)
+ (def signed-sap-ref-64)
+ (def %set-signed-sap-ref-64)
+ (def sap-ref-sap)
+ (def %set-sap-ref-sap)
+ (def sap-ref-single)
+ (def %set-sap-ref-single)
+ (def sap-ref-double)
+ (def %set-sap-ref-double)
+ ;; The original CMUCL code had #!+(and x86 long-float) for this first one,
+ ;; but only #!+long-float for the second. This was redundant, since the
+ ;; LONG-FLOAT target feature only exists on X86. So we removed the
+ ;; redundancy. --njf 2002-01-08
+ #!+long-float (def sap-ref-long)
+ #!+long-float (def %set-sap-ref-long))
+
+(macrolet ((def (fun args 32-bit 64-bit)
+ `(deftransform ,fun (,args)
+ (ecase sb!vm::n-word-bits
+ (32 '(,32-bit ,@args))
+ (64 '(,64-bit ,@args))))))
+ (def sap-ref-word (sap offset) sap-ref-32 sap-ref-64)
+ (def signed-sap-ref-word (sap offset) signed-sap-ref-32 signed-sap-ref-64)
+ (def %set-sap-ref-word (sap offset value)
+ %set-sap-ref-32 %set-sap-ref-64)
+ (def %set-signed-sap-ref-word (sap offset value)
+ %set-signed-sap-ref-32 %set-signed-sap-ref-64))