source: trunk/source/level-0/X86/x86-array.lisp @ 8483

Last change on this file since 8483 was 8483, checked in by gb, 13 years ago

%INIT-MISC of bitvector: set value even if 0.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.7 KB
Line 
1;;;-*- Mode: Lisp; Package: CCL -*-
2;;;
3;;;   Copyright (C) 1994-2001 Digitool, Inc
4;;;   This file is part of OpenMCL. 
5;;;
6;;;   OpenMCL is licensed under the terms of the Lisp Lesser GNU Public
7;;;   License , known as the LLGPL and distributed with OpenMCL as the
8;;;   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
9;;;   which is distributed with OpenMCL as the file "LGPL".  Where these
10;;;   conflict, the preamble takes precedence. 
11;;;
12;;;   OpenMCL is referenced in the preamble as the "LIBRARY."
13;;;
14;;;   The LLGPL is also available online at
15;;;   http://opensource.franz.com/preamble.html
16
17(in-package "CCL")
18
19(eval-when (:compile-toplevel :execute)
20  #+x8632-target
21  (require "X8632-ARCH")
22  #+x8664-target
23  (require "X8664-ARCH")
24  (require "X86-LAPMACROS"))
25
26
27
28#+x8664-target
29(progn
30;;; None of the stores in here can be intergenerational; the vector
31;;; is known to be younger than the initial value
32(defx86lapfunction %init-gvector ((len arg_x) (value arg_y) (vector arg_z))
33  (jmp @test)
34  @loop
35  (movq (% value) (@ x8664::misc-data-offset (% vector) (% len)))
36  @test
37  (subq ($ x8664::fixnumone) (% len))
38  (jns @loop)
39  (single-value-return))
40
41;;; "val" is either a fixnum or a uvector with 64-bits of data
42;;; (small bignum, DOUBLE-FLOAT).
43(defx86lapfunction %%init-ivector64 ((len arg_x) (value arg_y) (vector arg_z))
44  (unbox-fixnum value imm0)
45  (testb ($ x8664::fixnummask) (%b value))
46  (je @test)
47  (movq (@ x8664::misc-data-offset (% value)) (% imm0))
48  (jmp @test)
49  @loop
50  (movq (% imm0) (@ x8664::misc-data-offset (% vector) (% len)))
51  @test
52  (subq ($ x8664::fixnumone) (% len))
53  (jns @loop)
54  (single-value-return))
55
56(defun %init-ivector64 (typecode len val uvector)
57  (declare (type (mod 256) typecode))
58  (%%init-ivector64 len
59                    (case typecode
60                      (#.x8664::subtag-fixnum-vector
61                       (require-type val 'fixnum))
62                      (#.x8664::subtag-double-float-vector
63                       (if (typep val 'double-float)
64                         val
65                         (require-type val 'double-float)))
66                      (#.x8664::subtag-s64-vector
67                       (require-type val '(signed-byte 64)))
68                      (#.x8664::subtag-u64-vector
69                       (require-type val '(unsigned-byte 64)))
70                      (t (report-bad-arg uvector
71                                         '(or (simple-array fixnum (*))
72                                           (simple-array double-float (*))
73                                           (simple-array (signed-byte 64) (*))
74                                           (simple-array (unsigned-byte 64) (*))))))
75                    uvector))
76 
77
78(eval-when (:compile-toplevel :execute)
79  (declaim (inline %init-ivector-u32)))
80
81(defun %init-ivector-u32 (len u32val uvector)
82  (declare (type index len)
83           (type (unsigned-byte 32) u32val)
84           (type (simple-array (unsigned-byte 32) (*)) uvector)
85           (optimize (speed 3) (safety 0)))
86  (dotimes (i len uvector)
87    (setf (aref uvector i) u32val)))
88
89(eval-when (:compile-toplevel :execute)
90  (declaim (inline %init-ivector-u16)))
91
92(defun %init-ivector-u16 (len val uvector)
93  (declare (type index len)
94           (type (unsigned-byte 16) val)
95           (type (simple-array (unsigned-byte 16) (*)) uvector)
96           (optimize (speed 3) (safety 0)))
97  (dotimes (i len uvector)
98    (setf (aref uvector i) val)))
99
100                             
101
102(defun %init-ivector32 (typecode len val uvector)
103  (declare (type (unsigned-byte 32) typecode)
104           (type index len))
105  (let* ((u32val (case typecode
106                   (#.x8664::subtag-s32-vector
107                    (logand (the (signed-byte 32)
108                              (require-type val '(signed-byte 32)))
109                            #xffffffff))
110                   (#.x8664::subtag-single-float-vector
111                    (single-float-bits (require-type val 'single-float)))
112                   (#.x8664::subtag-simple-base-string
113                    (char-code val))
114                   (t
115                    (require-type val '(unsigned-byte 32))))))
116    (declare (type (unsigned-byte 32) u32val))
117    (%init-ivector-u32 len u32val uvector)))
118
119(defun %init-misc (val uvector)
120  (let* ((len (uvsize uvector))
121         (typecode (typecode uvector))
122         (fulltag (logand x8664::fulltagmask typecode)))
123    (declare (type index len)
124             (type (unsigned-byte 8) typecode)
125             (type (mod 16) fulltag))
126    (if (or (= fulltag x8664::fulltag-nodeheader-0)
127            (= fulltag x8664::fulltag-nodeheader-1))
128      (%init-gvector len val uvector)
129      (if (= fulltag x8664::ivector-class-64-bit)
130        (%init-ivector64 typecode len val uvector)
131        (if (= fulltag x8664::ivector-class-32-bit)
132          (%init-ivector32 typecode len val uvector)
133          ;; Value must be a fixnum, 1, 8, 16 bits
134          (case typecode
135            (#.x8664::subtag-u16-vector
136             (%init-ivector-u16 len
137                                (require-type val '(unsigned-byte 16))
138                                uvector))
139            (#.x8664::subtag-s16-vector
140             (%init-ivector-u16 len
141                                (logand (the (signed-byte 16)
142                                          (require-type val '(unsigned-byte 16)))
143                                        #xffff)
144                                uvector))
145            (#.x8664::subtag-u8-vector
146             (let* ((v0 (require-type val '(unsigned-byte 8)))
147                    (l0 (ash (the fixnum (1+ len)) -1)))
148               (declare (type (unsigned-byte 8) v0)
149                        (type index l0))
150               (%init-ivector-u16 l0
151                                  (logior (the (unsigned-byte 16) (ash v0 8))
152                                          v0)
153                                  uvector)))
154            (#.x8664::subtag-s8-vector
155             (let* ((v0 (logand #xff
156                                (the (signed-byte 8)
157                                  (require-type val '(signed-byte 8)))))
158                    (l0 (ash (the fixnum (1+ len)) -1)))
159               (declare (type (unsigned-byte 8) v0)
160                        (type index l0))
161               (%init-ivector-u16 l0
162                                  (logior (the (unsigned-byte 16) (ash v0 8))
163                                          v0)
164                                  uvector)))
165            (#.x8664::subtag-bit-vector
166               (let* ((v0 (case val
167                            (1 -1)
168                            (0 0)
169                            (t (report-bad-arg val 'bit))))
170                      (l0 (ash (the fixnum (+ len 63)) -6)))
171                 (declare (type (unsigned-byte 8) v0)
172                          (type index l0))
173                 (%%init-ivector64  l0 v0 uvector)))
174            (t (report-bad-arg uvector
175                               '(or simple-bit-vector
176                                   (simple-array (signed-byte 8) (*))
177                                   (simple-array (unsigned-byte 8) (*))
178                                   (simple-array (signed-byte 16) (*))
179                                   (simple-array (unsigned-byte 16) (*)))))))))))
180             
181
182)
183
184#-x8664-target
185(defun %init-misc (val uvector)
186  (dotimes (i (uvsize uvector) uvector)
187    (setf (uvref uvector i) val)))
188         
189
190;;; Make a new vector of size newsize whose subtag matches that of oldv-arg.
191;;; Blast the contents of the old vector into the new one as quickly as
192;;; possible; leave remaining elements of new vector undefined (0).
193;;; Return new-vector.
194(defun %extend-vector (start oldv newsize)
195  (declare (fixnum start))
196  (let* ((new (%alloc-misc newsize (typecode oldv)))
197         (oldsize (uvsize oldv)))
198    (declare (fixnum oldsize))
199    (do* ((i 0 (1+ i))
200          (j start (1+ j)))
201         ((= i oldsize) new)
202      (declare (fixnum i j))
203      (setf (uvref new j) (uvref oldv i)))))
204   
205
206
207
208
209;;; argument is a vector header or an array header.  Or else.
210(defx86lapfunction %array-header-data-and-offset ((a arg_z))
211  (let ((offset arg_y)
212        (temp temp1))
213    (movq (% rsp) (% temp0))
214    (movl ($ '0) (%l offset))
215    (movq (% a) (% temp))
216    @loop
217    (movq (@ target::arrayH.data-vector (% temp)) (% a))
218    (extract-subtag a imm0)
219    (addq (@ target::arrayH.displacement (% temp)) (% offset))
220    (rcmp (% imm0) ($ target::subtag-vectorH))
221    (movq (% a) (% temp))
222    (jle @loop)
223    (push (% a))
224    (push (% offset))
225    (set-nargs 2)
226    (jmp-subprim  .SPvalues)))
227
228
229
230(defx86lapfunction %boole-clr ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
231  (movq (@ idx (% rsp)) (% temp0))
232  (movq ($ 0) (@ x8664::misc-data-offset (% dest) (% temp0)))
233  (single-value-return 3))
234
235(defx86lapfunction %boole-set ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
236  (movq (@ idx (% rsp)) (% temp0))
237  (movq ($ -1) (@ x8664::misc-data-offset (% dest) (% temp0)))
238  (single-value-return 3))
239
240(defx86lapfunction %boole-1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
241  (movq (@ idx (% rsp)) (% temp0))
242  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
243  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
244  (single-value-return 3))
245
246(defx86lapfunction %boole-2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
247  (movq (@ idx (% rsp)) (% temp0))
248  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
249  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
250  (single-value-return 3))
251
252(defx86lapfunction %boole-c1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
253  (movq (@ idx (% rsp)) (% temp0))
254  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
255  (notq (% imm0))
256  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
257  (single-value-return 3))
258
259(defx86lapfunction %boole-c2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
260  (movq (@ idx (% rsp)) (% temp0))
261  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
262  (notq (% imm0))
263  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
264  (single-value-return 3))
265
266(defx86lapfunction %boole-and ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
267  (movq (@ idx (% rsp)) (% temp0))
268  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
269  (andq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
270  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
271  (single-value-return 3))
272
273(defx86lapfunction %boole-ior ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
274  (movq (@ idx (% rsp)) (% temp0))
275  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
276  (orq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
277  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
278  (single-value-return 3))
279
280(defx86lapfunction %boole-xor ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
281  (movq (@ idx (% rsp)) (% temp0))
282n  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
283  (xorq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
284  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
285  (single-value-return 3))
286
287(defx86lapfunction %boole-eqv ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
288  (movq (@ idx (% rsp)) (% temp0))
289  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
290  (xorq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
291  (notq (% imm0))
292  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
293  (single-value-return 3))
294
295(defx86lapfunction %boole-nand ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
296  (movq (@ idx (% rsp)) (% temp0))
297  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
298  (andq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
299  (notq (% imm0))
300  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
301  (single-value-return 3))
302
303(defx86lapfunction %boole-nor ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
304  (movq (@ idx (% rsp)) (% temp0))
305  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
306  (orq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
307  (notq (% imm0))
308  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
309  (single-value-return 3))
310
311(defx86lapfunction %boole-andc1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
312  (movq (@ idx (% rsp)) (% temp0))
313  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
314  (notq (% imm0))
315  (andq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
316  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
317  (single-value-return 3))
318
319(defx86lapfunction %boole-andc2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
320  (movq (@ idx (% rsp)) (% temp0))
321  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
322  (notq (% imm0))
323  (andq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
324  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
325  (single-value-return 3))
326
327(defx86lapfunction %boole-orc1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
328  (movq (@ idx (% rsp)) (% temp0))
329  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
330  (notq (% imm0))
331  (orq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
332  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
333  (single-value-return 3))
334
335(defx86lapfunction %boole-orc2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
336  (movq (@ idx (% rsp)) (% temp0))
337  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
338  (notq (% imm0))
339  (orq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
340  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
341  (single-value-return 3))
342
343(defparameter *simple-bit-boole-functions* ())
344
345(setq *simple-bit-boole-functions*
346      (vector
347       #'%boole-clr
348       #'%boole-set
349       #'%boole-1
350       #'%boole-2
351       #'%boole-c1
352       #'%boole-c2
353       #'%boole-and
354       #'%boole-ior
355       #'%boole-xor
356       #'%boole-eqv
357       #'%boole-nand
358       #'%boole-nor
359       #'%boole-andc1
360       #'%boole-andc2
361       #'%boole-orc1
362       #'%boole-orc2))
363
364(defun %simple-bit-boole (op b1 b2 result)
365  (let* ((f (svref *simple-bit-boole-functions* op)))
366    (dotimes (i (ash (the fixnum (+ (length result) 63)) -6) result)
367      (funcall f i b1 b2 result))))
368
369(defx86lapfunction %aref2 ((array arg_x) (i arg_y) (j arg_z))
370  (check-nargs 3)
371  (jmp-subprim .SParef2))
372
373(defx86lapfunction %aref3 ((array 8) #|(ra 0)|# (i arg_x) (j arg_y) (k arg_z))
374  (check-nargs 4)
375  (pop (% ra0))
376  (pop (% temp0))
377  (discard-reserved-frame)
378  (push (% ra0))
379  (jmp-subprim .SParef3))
380
381(defx86lapfunction %aset2 ((array 8) #|(ra 0)|# (i arg_x) (j arg_y) (newval arg_z))
382  (check-nargs 4)
383  (pop (% ra0))
384  (pop (% temp0))
385  (discard-reserved-frame)
386  (push (% ra0))
387  (jmp-subprim .SPaset2))
388
389(defx86lapfunction %aset3 ((array 16) (i 8) #|(ra 0)|# (j arg_x) (k arg_y) (newval arg_z))
390  (check-nargs 5)
391  (pop (% ra0))
392  (pop (% temp0))
393  (pop (% temp1))
394  (discard-reserved-frame)
395  (push (% ra0))
396  (jmp-subprim .SPaset3))
397
Note: See TracBrowser for help on using the repository browser.