source: branches/acode-rewrite/source/level-0/X86/X8632/x8632-array.lisp

Last change on this file was 16078, checked in by Gary Byers, 11 years ago

Pass the test suite on x8632/x8664 on this branch.

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