source: branches/working-0711/ccl/level-0/X86/x86-array.lisp @ 7847

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

In %INIT-MISC, the number of 64-bit words is (ash (+ 63 number-of-bits) -6),
not (... (+ 64 ...)).

That fencepost could cause 1 too many words to be initialized, and could
therefore clobber some nearby object in memory or (in at least one
scenario) write to unmapped memory.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.6 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             (if (eql 0 val)
167               uvector
168               (let* ((v0 (case val
169                            (1 -1)
170                            (t (report-bad-arg val 'bit))))
171                      (l0 (ash (the fixnum (+ len 63)) -6)))
172                 (declare (type (unsigned-byte 8) v0)
173                          (type index l0))
174                 (%%init-ivector64  l0 v0 uvector))))
175            (t (report-bad-arg uvector
176                               '(or simple-bit-vector
177                                   (simple-array (signed-byte 8) (*))
178                                   (simple-array (unsigned-byte 8) (*))
179                                   (simple-array (signed-byte 16) (*))
180                                   (simple-array (unsigned-byte 16) (*)))))))))))
181             
182
183)
184
185#-x8664-target
186(defun %init-misc (val uvector)
187  (dotimes (i (uvsize uvector) uvector)
188    (setf (uvref uvector i) val)))
189         
190
191;;; Make a new vector of size newsize whose subtag matches that of oldv-arg.
192;;; Blast the contents of the old vector into the new one as quickly as
193;;; possible; leave remaining elements of new vector undefined (0).
194;;; Return new-vector.
195(defun %extend-vector (start oldv newsize)
196  (declare (fixnum start))
197  (let* ((new (%alloc-misc newsize (typecode oldv)))
198         (oldsize (uvsize oldv)))
199    (declare (fixnum oldsize))
200    (do* ((i 0 (1+ i))
201          (j start (1+ j)))
202         ((= i oldsize) new)
203      (declare (fixnum i j))
204      (setf (uvref new j) (uvref oldv i)))))
205   
206
207
208
209
210;;; argument is a vector header or an array header.  Or else.
211(defx86lapfunction %array-header-data-and-offset ((a arg_z))
212  (let ((offset arg_y)
213        (temp temp1))
214    (movq (% rsp) (% temp0))
215    (movl ($ '0) (%l offset))
216    (movq (% a) (% temp))
217    @loop
218    (movq (@ target::arrayH.data-vector (% temp)) (% a))
219    (extract-subtag a imm0)
220    (addq (@ target::arrayH.displacement (% temp)) (% offset))
221    (rcmp (% imm0) ($ target::subtag-vectorH))
222    (movq (% a) (% temp))
223    (jle @loop)
224    (push (% a))
225    (push (% offset))
226    (set-nargs 2)
227    (jmp-subprim  .SPvalues)))
228
229
230
231(defx86lapfunction %boole-clr ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
232  (movq (@ idx (% rsp)) (% temp0))
233  (movq ($ 0) (@ x8664::misc-data-offset (% dest) (% temp0)))
234  (single-value-return 3))
235
236(defx86lapfunction %boole-set ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
237  (movq (@ idx (% rsp)) (% temp0))
238  (movq ($ -1) (@ x8664::misc-data-offset (% dest) (% temp0)))
239  (single-value-return 3))
240
241(defx86lapfunction %boole-1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
242  (movq (@ idx (% rsp)) (% temp0))
243  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
244  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
245  (single-value-return 3))
246
247(defx86lapfunction %boole-2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
248  (movq (@ idx (% rsp)) (% temp0))
249  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
250  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
251  (single-value-return 3))
252
253(defx86lapfunction %boole-c1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
254  (movq (@ idx (% rsp)) (% temp0))
255  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
256  (notq (% imm0))
257  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
258  (single-value-return 3))
259
260(defx86lapfunction %boole-c2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
261  (movq (@ idx (% rsp)) (% temp0))
262  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
263  (notq (% imm0))
264  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
265  (single-value-return 3))
266
267(defx86lapfunction %boole-and ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
268  (movq (@ idx (% rsp)) (% temp0))
269  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
270  (andq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
271  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
272  (single-value-return 3))
273
274(defx86lapfunction %boole-ior ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
275  (movq (@ idx (% rsp)) (% temp0))
276  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
277  (orq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
278  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
279  (single-value-return 3))
280
281(defx86lapfunction %boole-xor ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
282  (movq (@ idx (% rsp)) (% temp0))
283n  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
284  (xorq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
285  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
286  (single-value-return 3))
287
288(defx86lapfunction %boole-eqv ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
289  (movq (@ idx (% rsp)) (% temp0))
290  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
291  (xorq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
292  (notq (% imm0))
293  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
294  (single-value-return 3))
295
296(defx86lapfunction %boole-nand ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
297  (movq (@ idx (% rsp)) (% temp0))
298  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
299  (andq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
300  (notq (% imm0))
301  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
302  (single-value-return 3))
303
304(defx86lapfunction %boole-nor ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
305  (movq (@ idx (% rsp)) (% temp0))
306  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
307  (orq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
308  (notq (% imm0))
309  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
310  (single-value-return 3))
311
312(defx86lapfunction %boole-andc1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
313  (movq (@ idx (% rsp)) (% temp0))
314  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
315  (notq (% imm0))
316  (andq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
317  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
318  (single-value-return 3))
319
320(defx86lapfunction %boole-andc2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
321  (movq (@ idx (% rsp)) (% temp0))
322  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
323  (notq (% imm0))
324  (andq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
325  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
326  (single-value-return 3))
327
328(defx86lapfunction %boole-orc1 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
329  (movq (@ idx (% rsp)) (% temp0))
330  (movq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
331  (notq (% imm0))
332  (orq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
333  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
334  (single-value-return 3))
335
336(defx86lapfunction %boole-orc2 ((idx 8) #|(ra 0)|# (b0 arg_x) (b1 arg_y) (dest arg_z))
337  (movq (@ idx (% rsp)) (% temp0))
338  (movq (@ x8664::misc-data-offset (% b1) (% temp0)) (% imm0))
339  (notq (% imm0))
340  (orq (@ x8664::misc-data-offset (% b0) (% temp0)) (% imm0))
341  (movq (% imm0) (@ x8664::misc-data-offset (% dest) (% temp0)))
342  (single-value-return 3))
343
344(defparameter *simple-bit-boole-functions* ())
345
346(setq *simple-bit-boole-functions*
347      (vector
348       #'%boole-clr
349       #'%boole-set
350       #'%boole-1
351       #'%boole-2
352       #'%boole-c1
353       #'%boole-c2
354       #'%boole-and
355       #'%boole-ior
356       #'%boole-xor
357       #'%boole-eqv
358       #'%boole-nand
359       #'%boole-nor
360       #'%boole-andc1
361       #'%boole-andc2
362       #'%boole-orc1
363       #'%boole-orc2))
364
365(defun %simple-bit-boole (op b1 b2 result)
366  (let* ((f (svref *simple-bit-boole-functions* op)))
367    (dotimes (i (ash (the fixnum (+ (length result) 63)) -6) result)
368      (funcall f i b1 b2 result))))
369
370(defx86lapfunction %aref2 ((array arg_x) (i arg_y) (j arg_z))
371  (check-nargs 3)
372  (jmp-subprim .SParef2))
373
374(defx86lapfunction %aref3 ((array 0) (i arg_x) (j arg_y) (k arg_z))
375  (check-nargs 4)
376  (pop (% temp0))
377  (discard-reserved-frame)
378  (jmp-subprim .SParef3))
379
380(defx86lapfunction %aset2 ((array 0) (i arg_x) (j arg_y) (newval arg_z))
381  (check-nargs 4)
382  (pop (% temp0))
383  (discard-reserved-frame)
384  (jmp-subprim .SPaset2))
385
386(defx86lapfunction %aset3 ((array 8) (i 0) (j arg_x) (k arg_y) (newval arg_z))
387  (check-nargs 5)
388  (pop (% temp0))
389  (pop (% temp1))
390  (discard-reserved-frame)
391  (jmp-subprim .SPaset3))
392
393
394
395
396
397 
398
Note: See TracBrowser for help on using the repository browser.