64f067b166557a4280bc3fbba8a3da30cd453b59
[sbcl.git] / src / compiler / saptran.lisp
1 ;;;; optimizations for SAP operations
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
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.
11
12 (in-package "SB!C")
13 \f
14 ;;;; DEFKNOWNs
15
16 #!+linkage-table
17 (deftransform foreign-symbol-address-as-integer ((symbol &optional datap)
18                                                  (simple-string boolean))
19   (if (and (constant-lvar-p symbol) (constant-lvar-p datap))
20       `(sap-int (foreign-symbol-address symbol datap))
21       (give-up-ir1-transform)))
22
23 (deftransform foreign-symbol-address ((symbol &optional datap)
24                                       (simple-string &optional boolean))
25     #!-linkage-table
26     (if (null datap)
27         (give-up-ir1-transform)
28         `(foreign-symbol-address symbol))
29     #!+linkage-table
30     (if (and (constant-lvar-p symbol) (constant-lvar-p datap))
31         (let ((name (lvar-value symbol))
32               (datap (lvar-value datap)))
33           (if (or #+sb-xc-host t ; only static symbols on host
34                   (not datap)
35                   (find-foreign-symbol-in-table name *static-foreign-symbols*))
36               `(foreign-symbol-address ,name) ; VOP
37               `(foreign-symbol-dataref-address ,name))) ; VOP
38         (give-up-ir1-transform)))
39
40 (defknown (sap< sap<= sap= sap>= sap>)
41           (system-area-pointer system-area-pointer) boolean
42   (movable flushable))
43
44 (defknown sap+ (system-area-pointer integer) system-area-pointer
45   (movable flushable))
46 (defknown sap- (system-area-pointer system-area-pointer) (signed-byte 32)
47   (movable flushable))
48
49 (defknown sap-int (system-area-pointer) (unsigned-byte #!-alpha 32 #!+alpha 64)
50   (movable flushable))
51 (defknown int-sap ((unsigned-byte #!-alpha 32 #!+alpha 64))
52   system-area-pointer (movable))
53
54 (defknown sap-ref-8 (system-area-pointer fixnum) (unsigned-byte 8)
55   (flushable))
56 (defknown %set-sap-ref-8 (system-area-pointer fixnum (unsigned-byte 8))
57   (unsigned-byte 8)
58   ())
59
60 (defknown sap-ref-16 (system-area-pointer fixnum) (unsigned-byte 16)
61   (flushable))
62 (defknown %set-sap-ref-16 (system-area-pointer fixnum (unsigned-byte 16))
63   (unsigned-byte 16)
64   ())
65
66 (defknown sap-ref-32 (system-area-pointer fixnum) (unsigned-byte 32)
67   (flushable))
68 (defknown %set-sap-ref-32 (system-area-pointer fixnum (unsigned-byte 32))
69   (unsigned-byte 32)
70   ())
71
72 ;; FIXME These are supported natively on alpha and using deftransforms
73 ;; in compiler/x86/sap.lisp, which in OAO$n$ style need copying to
74 ;; other 32 bit systems
75 (defknown sap-ref-64 (system-area-pointer fixnum) (unsigned-byte 64)
76   (flushable))
77 (defknown %set-sap-ref-64 (system-area-pointer fixnum (unsigned-byte 64))
78   (unsigned-byte 64)
79   ())
80
81 (defknown signed-sap-ref-8 (system-area-pointer fixnum) (signed-byte 8)
82   (flushable))
83 (defknown %set-signed-sap-ref-8 (system-area-pointer fixnum (signed-byte 8))
84   (signed-byte 8)
85   ())
86
87 (defknown signed-sap-ref-16 (system-area-pointer fixnum) (signed-byte 16)
88   (flushable))
89 (defknown %set-signed-sap-ref-16 (system-area-pointer fixnum (signed-byte 16))
90   (signed-byte 16)
91   ())
92
93 (defknown signed-sap-ref-32 (system-area-pointer fixnum) (signed-byte 32)
94   (flushable))
95 (defknown %set-signed-sap-ref-32 (system-area-pointer fixnum (signed-byte 32))
96   (signed-byte 32)
97   ())
98
99 (defknown signed-sap-ref-64 (system-area-pointer fixnum) (signed-byte 64)
100   (flushable))
101 (defknown %set-signed-sap-ref-64 (system-area-pointer fixnum (signed-byte 64))
102   (signed-byte 64)
103   ())
104
105 (defknown sap-ref-sap (system-area-pointer fixnum) system-area-pointer
106   (flushable))
107 (defknown %set-sap-ref-sap (system-area-pointer fixnum system-area-pointer)
108   system-area-pointer
109   ())
110
111 (defknown sap-ref-single (system-area-pointer fixnum) single-float
112   (flushable))
113 (defknown sap-ref-double (system-area-pointer fixnum) double-float
114   (flushable))
115 #!+(or x86 long-float)
116 (defknown sap-ref-long (system-area-pointer fixnum) long-float
117   (flushable))
118
119 (defknown %set-sap-ref-single
120           (system-area-pointer fixnum single-float) single-float
121   ())
122 (defknown %set-sap-ref-double
123           (system-area-pointer fixnum double-float) double-float
124   ())
125 #!+long-float
126 (defknown %set-sap-ref-long
127           (system-area-pointer fixnum long-float) long-float
128   ())
129 \f
130 ;;;; transforms for converting sap relation operators
131
132 (macrolet ((def (sap-fun int-fun)
133              `(deftransform ,sap-fun ((x y) * *)
134                 `(,',int-fun (sap-int x) (sap-int y)))))
135   (def sap< <)
136   (def sap<= <=)
137   (def sap= =)
138   (def sap>= >=)
139   (def sap> >))
140 \f
141 ;;;; transforms for optimizing SAP+
142
143 (deftransform sap+ ((sap offset))
144   (cond ((and (constant-lvar-p offset)
145               (eql (lvar-value offset) 0))
146          'sap)
147         (t
148          (extract-fun-args sap 'sap+ 2)
149          '(lambda (sap offset1 offset2)
150             (sap+ sap (+ offset1 offset2))))))
151
152 (macrolet ((def (fun)
153              `(deftransform ,fun ((sap offset) * *)
154                 (extract-fun-args sap 'sap+ 2)
155                  `(lambda (sap offset1 offset2)
156                    (,',fun sap (+ offset1 offset2))))))
157   (def sap-ref-8)
158   (def %set-sap-ref-8)
159   (def signed-sap-ref-8)
160   (def %set-signed-sap-ref-8)
161   (def sap-ref-16)
162   (def %set-sap-ref-16)
163   (def signed-sap-ref-16)
164   (def %set-signed-sap-ref-16)
165   (def sap-ref-32)
166   (def %set-sap-ref-32)
167   (def signed-sap-ref-32)
168   (def %set-signed-sap-ref-32)
169   (def sap-ref-64)
170   (def %set-sap-ref-64)
171   (def signed-sap-ref-64)
172   (def %set-signed-sap-ref-64)
173   (def sap-ref-sap)
174   (def %set-sap-ref-sap)
175   (def sap-ref-single)
176   (def %set-sap-ref-single)
177   (def sap-ref-double)
178   (def %set-sap-ref-double)
179   ;; The original CMUCL code had #!+(and x86 long-float) for this first one,
180   ;; but only #!+long-float for the second.  This was redundant, since the
181   ;; LONG-FLOAT target feature only exists on X86.  So we removed the
182   ;; redundancy.  --njf 2002-01-08
183   #!+long-float (def sap-ref-long)
184   #!+long-float (def %set-sap-ref-long))