1 ;;;; support routines for arrays and vectors
3 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; 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 ;; This is kinda sleezy, changing words like this. But we can because
28 ;; the vop thinks it is temporary.
29 (inst addq words
(+ (1- (ash 1 n-lowtag-bits
))
30 (* vector-data-offset n-word-bytes
))
32 (inst li
(lognot lowtag-mask
) ndescr
)
33 (inst and words ndescr words
)
34 (inst srl type word-shift ndescr
)
37 (inst bis alloc-tn other-pointer-lowtag result
)
38 (inst addq alloc-tn words alloc-tn
)
39 (storew ndescr result
0 other-pointer-lowtag
)
40 (storew length result vector-length-slot other-pointer-lowtag
)))
44 (define-assembly-routine (sxhash-simple-string
45 (:translate %sxhash-simple-string
)
47 (:result-types positive-fixnum
))
48 ((:arg string descriptor-reg a0-offset
)
49 (:res result any-reg a0-offset
)
51 (:temp length any-reg a1-offset
)
53 (:temp lip interior-reg lip-offset
)
54 (:temp accum non-descriptor-reg nl0-offset
)
55 (:temp data non-descriptor-reg nl1-offset
)
56 (:temp byte non-descriptor-reg nl2-offset
)
57 (:temp retaddr non-descriptor-reg nl3-offset
)
58 (:temp temp1 non-descriptor-reg nl4-offset
))
60 ;; These are needed after we jump into sxhash-simple-substring.
61 (progn result lip accum data byte retaddr
)
63 (inst li
(make-fixup 'sxhash-simple-substring
:assembly-routine
) temp1
)
64 (loadw length string vector-length-slot other-pointer-lowtag
)
65 (inst jmp zero-tn temp1
66 (make-fixup 'sxhash-simple-substring
:assembly-routine
)))
68 (define-assembly-routine (sxhash-simple-substring
69 (:translate %sxhash-simple-substring
)
71 (:arg-types
* positive-fixnum
)
72 (:result-types positive-fixnum
))
73 ((:arg string descriptor-reg a0-offset
)
74 (:arg length any-reg a1-offset
)
75 (:res result any-reg a0-offset
)
77 (:temp lip interior-reg lip-offset
)
78 (:temp accum non-descriptor-reg nl0-offset
)
79 (:temp data non-descriptor-reg nl1-offset
)
80 (:temp byte non-descriptor-reg nl2-offset
)
81 (:temp retaddr non-descriptor-reg nl3-offset
))
83 ;; Save the return address
84 (inst subq lip code-tn retaddr
)
86 ;; Get a pointer to the data.
88 (- (* vector-data-offset n-word-bytes
) other-pointer-lowtag
)
91 (inst br zero-tn test
)
95 (inst and data
#xff byte
)
96 (inst xor accum byte accum
)
97 (inst sll accum
5 byte
)
98 (inst srl accum
27 accum
)
99 (inst mskll accum
4 accum
)
100 (inst bis accum byte accum
)
102 (inst srl data
8 byte
)
103 (inst and byte
#xff byte
)
104 (inst xor accum byte accum
)
105 (inst sll accum
5 byte
)
106 (inst srl accum
27 accum
)
107 (inst mskll accum
4 accum
)
108 (inst bis accum byte accum
)
110 (inst srl data
16 byte
)
111 (inst and byte
#xff byte
)
112 (inst xor accum byte accum
)
113 (inst sll accum
5 byte
)
114 (inst srl accum
27 accum
)
115 (inst mskll accum
4 accum
)
116 (inst bis accum byte accum
)
118 (inst srl data
24 byte
)
119 (inst xor accum byte accum
)
120 (inst sll accum
5 byte
)
121 (inst srl accum
27 accum
)
122 (inst mskll accum
4 accum
)
123 (inst bis accum byte accum
)
125 (inst addq lip
4 lip
)
129 (inst subq length
(fixnum 4) length
)
130 (inst ldl data
0 lip
)
131 (inst bge length loop
)
133 (inst addq length
(fixnum 3) length
)
134 (inst beq length one-more
)
135 (inst subq length
(fixnum 1) length
)
136 (inst beq length two-more
)
137 (inst bne length done
)
139 (inst srl data
16 byte
)
140 (inst and byte
#xff byte
)
141 (inst xor accum byte accum
)
142 (inst sll accum
5 byte
)
143 (inst srl accum
27 accum
)
144 (inst mskll accum
4 accum
)
145 (inst bis accum byte accum
)
146 (inst addq length
(fixnum 1) length
)
150 (inst subq length
(fixnum 1) length
)
151 (inst srl data
8 byte
)
152 (inst and byte
#xff byte
)
153 (inst xor accum byte accum
)
154 (inst sll accum
5 byte
)
155 (inst srl accum
27 accum
)
156 (inst mskll accum
4 accum
)
157 (inst bis accum byte accum
)
158 (inst addq length
(fixnum 1) length
)
162 (inst subq length
(fixnum 1) length
)
163 (inst and data
#xff byte
)
164 (inst xor accum byte accum
)
165 (inst sll accum
5 byte
)
166 (inst srl accum
27 accum
)
167 (inst mskll accum
4 accum
)
168 (inst bis accum byte accum
)
172 (inst sll accum
5 result
)
173 (inst mskll result
4 result
)
174 (inst srl result
3 result
)
176 ;; Restore the return address.
177 (inst addq code-tn retaddr lip
))