1 ;;;; various array operations that are too expensive (in space) to do
4 ;;;; This software is part of the SBCL system. See the README file for
7 ;;;; This software is derived from the CMU CL system, which was
8 ;;;; written at Carnegie Mellon University and released into the
9 ;;;; public domain. The software is in the public domain and is
10 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
11 ;;;; files for more information.
15 (define-assembly-routine (allocate-vector
17 (:translate allocate-vector)
18 (:arg-types positive-fixnum
21 ((:arg type any-reg a0-offset)
22 (:arg length any-reg a1-offset)
23 (:arg words any-reg a2-offset)
24 (:res result descriptor-reg a0-offset)
26 (:temp ndescr non-descriptor-reg nl0-offset)
27 (:temp pa-flag non-descriptor-reg nl4-offset))
28 ;; This is kinda sleezy, changing words like this. But we can because
29 ;; the vop thinks it is temporary.
30 (inst addu words (+ (1- (ash 1 n-lowtag-bits))
31 (* vector-data-offset n-word-bytes)))
32 (inst li ndescr (lognot lowtag-mask))
33 (inst and words ndescr)
34 (inst srl ndescr type word-shift)
36 (pseudo-atomic (pa-flag)
37 (inst or result alloc-tn other-pointer-lowtag)
38 (inst addu alloc-tn words)
39 (storew ndescr result 0 other-pointer-lowtag)
40 (storew length result vector-length-slot other-pointer-lowtag)))