1 ;;;; optimizations for SAP operations
3 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
19 (defknown foreign-symbol-address (simple-string) system-area-pointer
22 (defknown (sap< sap<= sap= sap>= sap>)
23 (system-area-pointer system-area-pointer) boolean
26 (defknown sap+ (system-area-pointer integer) system-area-pointer
28 (defknown sap- (system-area-pointer system-area-pointer) (signed-byte 32)
31 (defknown sap-int (system-area-pointer) (unsigned-byte #!-alpha 32 #!+alpha 64)
33 (defknown int-sap ((unsigned-byte #!-alpha 32 #!+alpha 64))
34 system-area-pointer (movable))
36 (defknown sap-ref-8 (system-area-pointer fixnum) (unsigned-byte 8)
38 (defknown %set-sap-ref-8 (system-area-pointer fixnum (unsigned-byte 8))
42 (defknown sap-ref-16 (system-area-pointer fixnum) (unsigned-byte 16)
44 (defknown %set-sap-ref-16 (system-area-pointer fixnum (unsigned-byte 16))
48 (defknown sap-ref-32 (system-area-pointer fixnum) (unsigned-byte 32)
50 (defknown %set-sap-ref-32 (system-area-pointer fixnum (unsigned-byte 32))
55 (defknown sap-ref-64 (system-area-pointer fixnum) (unsigned-byte 64)
58 (defknown %set-sap-ref-64 (system-area-pointer fixnum (unsigned-byte 64))
62 (defknown signed-sap-ref-8 (system-area-pointer fixnum) (signed-byte 8)
64 (defknown %set-signed-sap-ref-8 (system-area-pointer fixnum (signed-byte 8))
68 (defknown signed-sap-ref-16 (system-area-pointer fixnum) (signed-byte 16)
70 (defknown %set-signed-sap-ref-16 (system-area-pointer fixnum (signed-byte 16))
74 (defknown signed-sap-ref-32 (system-area-pointer fixnum) (signed-byte 32)
76 (defknown %set-signed-sap-ref-32 (system-area-pointer fixnum (signed-byte 32))
81 (defknown signed-sap-ref-64 (system-area-pointer fixnum) (signed-byte 64)
84 (defknown %set-signed-sap-ref-64 (system-area-pointer fixnum (signed-byte 64))
88 (defknown sap-ref-sap (system-area-pointer fixnum) system-area-pointer
90 (defknown %set-sap-ref-sap (system-area-pointer fixnum system-area-pointer)
94 (defknown sap-ref-single (system-area-pointer fixnum) single-float
96 (defknown sap-ref-double (system-area-pointer fixnum) double-float
98 #!+(or x86 long-float)
99 (defknown sap-ref-long (system-area-pointer fixnum) long-float
102 (defknown %set-sap-ref-single
103 (system-area-pointer fixnum single-float) single-float
105 (defknown %set-sap-ref-double
106 (system-area-pointer fixnum double-float) double-float
109 (defknown %set-sap-ref-long
110 (system-area-pointer fixnum long-float) long-float
113 ;;;; transforms for converting sap relation operators
115 (dolist (info '((sap< <) (sap<= <=) (sap= =) (sap>= >=) (sap> >)))
116 (destructuring-bind (sap-fun int-fun) info
117 (deftransform sap-fun ((x y) '* '* :eval-name t)
118 `(,int-fun (sap-int x) (sap-int y)))))
120 ;;;; transforms for optimizing SAP+
122 (deftransform sap+ ((sap offset))
123 (cond ((and (constant-continuation-p offset)
124 (eql (continuation-value offset) 0))
127 (extract-function-args sap 'sap+ 2)
128 '(lambda (sap offset1 offset2)
129 (sap+ sap (+ offset1 offset2))))))
131 (dolist (fun '(sap-ref-8 %set-sap-ref-8
132 signed-sap-ref-8 %set-signed-sap-ref-8
133 sap-ref-16 %set-sap-ref-16
134 signed-sap-ref-16 %set-signed-sap-ref-16
135 sap-ref-32 %set-sap-ref-32
136 signed-sap-ref-32 %set-signed-sap-ref-32
137 sap-ref-sap %set-sap-ref-sap
138 sap-ref-single %set-sap-ref-single
139 sap-ref-double %set-sap-ref-double
140 #!+(or x86 long-float) sap-ref-long
141 #!+long-float %set-sap-ref-long))
142 (deftransform fun ((sap offset) '* '* :eval-name t)
143 (extract-function-args sap 'sap+ 2)
144 `(lambda (sap offset1 offset2)
145 (,fun sap (+ offset1 offset2)))))