source: release/1.11/source/level-0/X86/X8632/x8632-array.lisp

Last change on this file was 16688, checked in by R. Matthew Emerson, 9 years ago

Merge copyright/license header changes to 1.11 release branch.

File size: 9.7 KB
RevLine 
[16688]1;;;
[13067]2;;; Copyright 2009 Clozure Associates
3;;;
[16688]4;;; Licensed under the Apache License, Version 2.0 (the "License");
5;;; you may not use this file except in compliance with the License.
6;;; You may obtain a copy of the License at
[13067]7;;;
[16688]8;;; http://www.apache.org/licenses/LICENSE-2.0
[13067]9;;;
[16688]10;;; Unless required by applicable law or agreed to in writing, software
11;;; distributed under the License is distributed on an "AS IS" BASIS,
12;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13;;; See the License for the specific language governing permissions and
14;;; limitations under the License.
[13067]15
[7332]16(in-package "CCL")
17
18(eval-when (:compile-toplevel :execute)
19 (require "X8632-ARCH")
20 (require "X86-LAPMACROS"))
21
[7910]22;; rewrite in LAP someday (soon).
23(defun %init-misc (val uvector)
24 (dotimes (i (uvsize uvector) uvector)
25 (setf (uvref uvector i) val)))
26
27;;; Make a new vector of size newsize whose subtag matches that of oldv-arg.
28;;; Blast the contents of the old vector into the new one as quickly as
29;;; possible; leave remaining elements of new vector undefined (0).
30;;; Return new-vector.
[15165]31
[7910]32
[7349]33;;; argument is a vector header or an array header. Or else.
[7910]34(defx8632lapfunction %array-header-data-and-offset ((a arg_z))
[7349]35 (let ((offset arg_y)
36 (temp temp1))
37 (movl (% esp) (% temp0))
38 (movl ($ '0) (%l offset))
39 (movl (% a) (% temp))
40 @loop
41 (movl (@ target::arrayH.data-vector (% temp)) (% a))
42 (extract-subtag a imm0)
43 (addl (@ target::arrayH.displacement (% temp)) (% offset))
[16085]44 (movl (% a) (% temp))
[16659]45 (cmpb ($ target::subtag-vectorH) (% imm0.b))
[16085]46 (je @loop)
[16659]47 (cmpb ($ target::subtag-arrayH) (% imm0.b))
[16085]48 (je @loop)
[7349]49 (push (% a))
50 (push (% offset))
51 (set-nargs 2)
52 (jmp-subprim .SPvalues)))
53
[13412]54(defx8632lapfunction %boole-clr ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
55 (movl (@ len (% esp)) (% temp0))
56 (jmp @test)
57 @loop
[7349]58 (movl ($ 0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]59 @test
60 (subl ($ '1) (% temp0))
61 (jge @loop)
[7349]62 (single-value-return 4))
63
[13412]64(defx8632lapfunction %boole-set ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
65 (movl (@ len (% esp)) (% temp0))
66 (jmp @test)
67 @loop
[7349]68 (movl ($ -1) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]69 @test
70 (subl ($ '1) (% temp0))
71 (jge @loop)
[7349]72 (single-value-return 4))
73
[13412]74(defx8632lapfunction %boole-1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
75 (movl (@ len (% esp)) (% temp0))
76 (jmp @test)
77 @loop
[7349]78 (movl (@ b0 (% esp)) (% temp1))
79 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
80 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]81 @test
82 (subl ($ '1) (% temp0))
83 (jge @loop)
[7349]84 (single-value-return 4))
85
[13412]86(defx8632lapfunction %boole-2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
87 (movl (@ len (% esp)) (% temp0))
88 (jmp @test)
89 @loop
[7349]90 (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
91 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]92 @test
93 (subl ($ '1) (% temp0))
94 (jge @loop)
[7349]95 (single-value-return 4))
96
[13412]97(defx8632lapfunction %boole-c1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
98 (movl (@ len (% esp)) (% temp0))
99 (jmp @test)
100 @loop
[7349]101 (movl (@ b0 (% esp)) (% temp1))
102 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
103 (notl (% imm0))
104 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]105 @test
106 (subl ($ '1) (% temp0))
107 (jge @loop)
[7349]108 (single-value-return 4))
109
[13412]110(defx8632lapfunction %boole-c2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
111 (movl (@ len (% esp)) (% temp0))
112 (jmp @test)
113 @loop
[7349]114 (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
115 (notl (% imm0))
116 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]117 @test
118 (subl ($ '1) (% temp0))
119 (jge @loop)
[7349]120 (single-value-return 4))
121
[13412]122(defx8632lapfunction %boole-and ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
123 (movl (@ len (% esp)) (% temp0))
124 (jmp @test)
125 @loop
[7349]126 (movl (@ b0 (% esp)) (% temp1))
127 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
128 (andl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
129 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]130 @test
131 (subl ($ '1) (% temp0))
132 (jge @loop)
[7349]133 (single-value-return 4))
134
[13412]135(defx8632lapfunction %boole-ior ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
136 (movl (@ len (% esp)) (% temp0))
137 (jmp @test)
138 @loop
[7349]139 (movl (@ b0 (% esp)) (% temp1))
140 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
141 (orl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
142 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]143 @test
144 (subl ($ '1) (% temp0))
145 (jge @loop)
[7349]146 (single-value-return 4))
147
[13412]148(defx8632lapfunction %boole-xor ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
149 (movl (@ len (% esp)) (% temp0))
150 (jmp @test)
151 @loop
[7349]152 (movl (@ b0 (% esp)) (% temp1))
153 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
154 (xorl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
155 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]156 @test
157 (subl ($ '1) (% temp0))
158 (jge @loop)
[7349]159 (single-value-return 4))
160
[13412]161(defx8632lapfunction %boole-eqv ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
162 (movl (@ len (% esp)) (% temp0))
163 (jmp @test)
164 @loop
[7349]165 (movl (@ b0 (% esp)) (% temp1))
166 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
167 (xorl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
168 (notl (% imm0))
169 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]170 @test
171 (subl ($ '1) (% temp0))
172 (jge @loop)
[7349]173 (single-value-return 4))
174
[13412]175(defx8632lapfunction %boole-nand ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
176 (movl (@ len (% esp)) (% temp0))
177 (jmp @test)
178 @loop
[7349]179 (movl (@ b0 (% esp)) (% temp1))
180 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
181 (andl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
182 (notl (% imm0))
183 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]184 @test
185 (subl ($ '1) (% temp0))
186 (jge @loop)
[7349]187 (single-value-return 4))
188
[13412]189(defx8632lapfunction %boole-nor ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
190 (movl (@ len (% esp)) (% temp0))
191 (jmp @test)
192 @loop
[7349]193 (movl (@ b0 (% esp)) (% temp1))
194 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
195 (orl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
196 (notl (% imm0))
197 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]198 @test
199 (subl ($ '1) (% temp0))
200 (jge @loop)
[7349]201 (single-value-return 4))
202
[13412]203(defx8632lapfunction %boole-andc1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
204 (movl (@ len (% esp)) (% temp0))
205 (jmp @test)
206 @loop
[7349]207 (movl (@ b0 (% esp)) (% temp1))
208 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
209 (notl (% imm0))
210 (andl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
211 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]212 @test
213 (subl ($ '1) (% temp0))
214 (jge @loop)
[7349]215 (single-value-return 4))
216
[13412]217(defx8632lapfunction %boole-andc2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
218 (movl (@ len (% esp)) (% temp0))
219 (jmp @test)
220 @loop
[7349]221 (movl (@ b0 (% esp)) (% temp1))
222 (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
223 (notl (% imm0))
224 (andl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
225 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]226 @test
227 (subl ($ '1) (% temp0))
228 (jge @loop)
[7349]229 (single-value-return 4))
230
[13412]231(defx8632lapfunction %boole-orc1 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
232 (movl (@ len (% esp)) (% temp0))
233 (jmp @test)
234 @loop
[7349]235 (movl (@ b0 (% esp)) (% temp1))
236 (movl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
237 (notl (% imm0))
238 (orl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
239 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]240 @test
241 (subl ($ '1) (% temp0))
242 (jge @loop)
[7349]243 (single-value-return 4))
244
[13412]245(defx8632lapfunction %boole-orc2 ((len 8) (b0 4) #|(ra 0)|# (b1 arg_y) (dest arg_z))
246 (movl (@ len (% esp)) (% temp0))
247 (jmp @test)
248 @loop
[7349]249 (movl (@ b0 (% esp)) (% temp1))
250 (movl (@ x8632::misc-data-offset (% b1) (% temp0)) (% imm0))
251 (notl (% imm0))
252 (orl (@ x8632::misc-data-offset (% temp1) (% temp0)) (% imm0))
253 (movl (% imm0) (@ x8632::misc-data-offset (% dest) (% temp0)))
[13412]254 @test
255 (subl ($ '1) (% temp0))
256 (jge @loop)
[7349]257 (single-value-return 4))
258
[7910]259(defparameter *simple-bit-boole-functions* ())
260
261(setq *simple-bit-boole-functions*
262 (vector
263 #'%boole-clr
264 #'%boole-set
265 #'%boole-1
266 #'%boole-2
267 #'%boole-c1
268 #'%boole-c2
269 #'%boole-and
270 #'%boole-ior
271 #'%boole-xor
272 #'%boole-eqv
273 #'%boole-nand
274 #'%boole-nor
275 #'%boole-andc1
276 #'%boole-andc2
277 #'%boole-orc1
278 #'%boole-orc2))
279
280(defun %simple-bit-boole (op b1 b2 result)
[13412]281 (funcall (svref *simple-bit-boole-functions* op)
282 (ash (the fixnum (+ (length result) 31)) -5)
283 b1
284 b2
285 result))
[7910]286
[9673]287(defx8632lapfunction %aref2 ((array 4) #|(ra 0)|# (i arg_y) (j arg_z))
288 (check-nargs 3)
289 (popl (@ 8 (% esp))) ;ra to first word of reserved frame
290 (pop (% temp0))
291 (addl ($ '1) (% esp)) ;discard other word of reserved frame
292 (jmp-subprim .SParef2))
[7332]293
[9673]294(defx8632lapfunction %aref3 ((array 8) (i 4) #|(ra 0)|# (j arg_y) (k arg_z))
295 (check-nargs 4)
296 (popl (@ 12 (% esp)))
297 (pop (% temp0))
298 (pop (% temp1))
299 (addl ($ '1) (% esp))
300 (jmp-subprim .SParef3))
[7332]301
[9673]302(defx8632lapfunction %aset2 ((array 8) (i 4) #|(ra 0)|# (j arg_y) (newval arg_z))
303 (check-nargs 4)
304 (popl (@ 12 (% esp)))
305 (pop (% temp0))
306 (pop (% temp1))
307 (addl ($ '1) (% esp))
308 (jmp-subprim .SPaset2))
[7332]309
[11238]310;;; We're out of registers. Put i on the stack.
[11222]311(defx8632lapfunction %aset3 ((array 12) (i 8) (j 4) #|(ra 0)|# (k arg_y) (newval arg_z))
[9673]312 (check-nargs 5)
313 (popl (@ 16 (% esp)))
314 (pop (% temp0))
[11238]315 (popl (@ 4 (% esp)))
[9673]316 (pop (% temp1))
317 (jmp-subprim .SPaset3))
[7332]318
Note: See TracBrowser for help on using the repository browser.