source: release/1.9/source/compiler/X86/X8632/x8632-vinsns.lisp

Last change on this file was 16004, checked in by R. Matthew Emerson, 11 years ago

Merge a couple of bug fixes from trunk.

File size: 157.3 KB
RevLine 
[7009]1;;;-*- Mode: Lisp; Package: (CCL :use CL) -*-
2
[13067]3;;; Copyright 2009 Clozure Associates
4;;; This file is part of Clozure CL.
5;;;
6;;; Clozure CL is licensed under the terms of the Lisp Lesser GNU
7;;; Public License , known as the LLGPL and distributed with Clozure
8;;; CL as the file "LICENSE". The LLGPL consists of a preamble and
9;;; the LGPL, which is distributed with Clozure CL as the file "LGPL".
10;;; Where these conflict, the preamble takes precedence.
11;;;
12;;; Clozure CL 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
[7009]17(in-package "CCL")
18
[10497]19
[7009]20(eval-when (:compile-toplevel :load-toplevel :execute)
21 (require "VINSN")
22 (require "X8632-BACKEND"))
23
24(eval-when (:compile-toplevel :execute)
25 (require "X8632ENV"))
26
[9802]27(defun unsigned-to-signed (u nbits)
28 (if (logbitp (1- nbits) u)
29 (- u (ash 1 nbits))
30 u))
31
[7009]32(defmacro define-x8632-vinsn (vinsn-name (results args &optional temps) &body body)
33 (%define-vinsn *x8632-backend* vinsn-name results args temps body))
34
[7428]35(define-x8632-vinsn scale-32bit-misc-index (((dest :u32))
36 ((idx :imm) ; A fixnum
37 )
38 ())
39 (movl (:%l idx) (:%l dest)))
[7009]40
41(define-x8632-vinsn scale-16bit-misc-index (((dest :u32))
42 ((idx :imm))) ; A fixnum
43 (movl (:%l idx) (:%l dest))
44 (shrl (:$ub 1) (:%l dest)))
45
46(define-x8632-vinsn scale-8bit-misc-index (((dest :u32))
47 ((idx :imm))) ; A fixnum
48 (movl (:%l idx) (:%l dest))
49 (shrl (:$ub 2) (:%l dest)))
50
[8629]51;;; same as above, but looks better in bit vector contexts
52(define-x8632-vinsn scale-1bit-misc-index (((dest :u32))
53 ((idx :imm))) ; A fixnum
54 (movl (:%l idx) (:%l dest))
55 (shrl (:$ub 2) (:%l dest)))
56
[7009]57(define-x8632-vinsn misc-ref-u32 (((dest :u32))
58 ((v :lisp)
59 (scaled-idx :u32)))
[7037]60 (movl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
[7009]61
62(define-x8632-vinsn misc-ref-double-float (((dest :double-float))
63 ((v :lisp)
64 (scaled-idx :imm)))
[11290]65 (movsd (:@ x8632::misc-dfloat-offset (:%l v) (:%l scaled-idx) 2) (:%xmm dest)))
[7009]66
[7112]67(define-x8632-vinsn misc-ref-c-double-float (((dest :double-float))
68 ((v :lisp)
69 (idx :s32const)))
[11861]70 (movsd (:@ (:apply + x8632::misc-dfloat-offset (:apply ash idx 3)) (:%l v)) (:%xmm dest)))
[7112]71
[7009]72(define-x8632-vinsn misc-ref-node (((dest :lisp))
73 ((v :lisp)
74 (scaled-idx :imm)))
[7037]75 (movl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
[7009]76
[7114]77(define-x8632-vinsn (push-misc-ref-node :push :node :vsp) (()
78 ((v :lisp)
79 (scaled-idx :imm)))
[7112]80 (pushl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
[7009]81
[7112]82(define-x8632-vinsn misc-set-node (()
83 ((val :lisp)
84 (v :lisp)
85 (unscaled-idx :imm))
86 ())
[7659]87 (movl (:%l val) (:@ x8632::misc-data-offset (:%l v) (:%l unscaled-idx))))
[7112]88
89(define-x8632-vinsn misc-set-immediate-node (()
90 ((val :s32const)
91 (v :lisp)
92 (unscaled-idx :imm))
93 ())
94 (movl (:$l val) (:@ x8632::misc-data-offset (:%l v) (:%l unscaled-idx))))
95
[11072]96(define-x8632-vinsn misc-set-single-float (()
97 ((val :single-float)
98 (v :lisp)
99 (scaled-idx :u32))
100 ())
101 (movss (:%xmm val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
102
[7112]103(define-x8632-vinsn misc-set-double-float (()
104 ((val :double-float)
105 (v :lisp)
106 (unscaled-idx :imm))
107 ())
[11290]108 (movsd (:%xmm val) (:@ x8632::misc-dfloat-offset (:%l v) (:%l unscaled-idx) 2)))
[7112]109
110(define-x8632-vinsn misc-ref-u8 (((dest :u8))
111 ((v :lisp)
112 (scaled-idx :s32)))
113 (movzbl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
114
115(define-x8632-vinsn misc-ref-s8 (((dest :s8))
116 ((v :lisp)
117 (scaled-idx :s32)))
118 (movsbl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
119
[9802]120(define-x8632-vinsn misc-ref-c-u16 (((dest :u16))
121 ((v :lisp)
122 (idx :u32const)))
123 (movzwl (:@ (:apply + x8632::misc-data-offset (:apply ash idx 1)) (:%l v)) (:%l dest)))
124
125(define-x8632-vinsn misc-ref-c-s16 (((dest :s16))
126 ((v :lisp)
127 (idx :u32const)))
128 (movswl (:@ (:apply + x8632::misc-data-offset (:apply ash idx 1)) (:%l v)) (:%l dest)))
129
[7112]130(define-x8632-vinsn misc-ref-u16 (((dest :u16))
131 ((v :lisp)
132 (scaled-idx :s32)))
133 (movzwl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
134
135(define-x8632-vinsn misc-ref-u32 (((dest :u32))
136 ((v :lisp)
137 (scaled-idx :s32)))
138 (movl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
139
140(define-x8632-vinsn misc-ref-single-float (((dest :single-float))
141 ((v :lisp)
142 (scaled-idx :s32)))
143 (movss (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%xmm dest)))
144
145(define-x8632-vinsn misc-ref-s32 (((dest :s32))
146 ((v :lisp)
147 (scaled-idx :s32)))
148 (movl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
149
150(define-x8632-vinsn misc-ref-s16 (((dest :s16))
151 ((v :lisp)
152 (scaled-idx :s32)))
153 (movswl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
154
155(define-x8632-vinsn misc-ref-c-node (((dest :lisp))
156 ((v :lisp)
157 (idx :u32const)) ; sic
158 ())
159 (movl (:@ (:apply + x8632::misc-data-offset (:apply ash idx x8632::word-shift)) (:%l v)) (:%l dest)))
160
161(define-x8632-vinsn (push-misc-ref-c-node :push :node :vsp)
162 (()
163 ((v :lisp)
164 (idx :u32const)) ; sic
165 ())
166 (pushl (:@ (:apply + x8632::misc-data-offset (:apply ash idx x8632::word-shift)) (:%l v))))
167
168(define-x8632-vinsn misc-ref-c-u32 (((dest :u32))
169 ((v :lisp)
170 (idx :u32const)) ; sic
171 ())
172 ;; xxx - should the 2 be x8632::word-shift?
173 (movl (:@ (:apply + x8632::misc-data-offset (:apply ash idx 2)) (:%l v)) (:%l dest)))
174
175(define-x8632-vinsn misc-ref-c-s32 (((dest :s32))
176 ((v :lisp)
177 (idx :s32const)) ; sic
178 ())
179 (movl (:@ (:apply + x8632::misc-data-offset (:apply ash idx x8632::word-shift)) (:%l v)) (:%l dest)))
180
181(define-x8632-vinsn misc-ref-c-single-float (((dest :single-float))
182 ((v :lisp)
183 (idx :s32const)) ; sic
184 ())
185 (movss (:@ (:apply + x8632::misc-data-offset (:apply ash idx x8632::word-shift)) (:%l v)) (:%xmm dest)))
186
187(define-x8632-vinsn misc-ref-c-u8 (((dest :u32))
188 ((v :lisp)
189 (idx :s32const)) ; sic
190 ())
191 (movzbl (:@ (:apply + x8632::misc-data-offset idx) (:%l v)) (:%l dest)))
192
193(define-x8632-vinsn misc-ref-c-s8 (((dest :s32))
194 ((v :lisp)
195 (idx :s32const)) ; sic
196 ())
197 (movsbl (:@ (:apply + x8632::misc-data-offset idx) (:%l v)) (:%l dest)))
198
[7765]199(define-x8632-vinsn misc-set-c-s8 (((val :s8))
200 ((v :lisp)
201 (idx :u32const))
202 ())
203 (movb (:%b val) (:@ (:apply + x8632::misc-data-offset idx) (:%l v))))
204
205(define-x8632-vinsn misc-set-s8 (((val :s8))
206 ((v :lisp)
207 (scaled-idx :s32))
208 ())
209 (movb (:%b val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
210
211(define-x8632-vinsn mem-ref-s8 (((dest :s8))
212 ((src :address)
213 (index :s32)))
214 (movsbl (:@ (:%l src) (:%l index)) (:%l dest)))
215
[7112]216(define-x8632-vinsn misc-set-c-node (()
217 ((val :lisp)
218 (v :lisp)
219 (idx :s32const)))
220 (movl (:%l val) (:@ (:apply + x8632::misc-data-offset (:apply ash idx 2)) (:%l v))))
221
222(define-x8632-vinsn misc-set-immediate-c-node (()
223 ((val :s32const)
224 (v :lisp)
225 (idx :s32const)))
226 (movl (:$l val) (:@ (:apply + x8632::misc-data-offset (:apply ash idx 2)) (:%l v))))
227
228;;; xxx don't know if this is right
229(define-x8632-vinsn set-closure-forward-reference (()
230 ((val :lisp)
231 (closure :lisp)
232 (idx :s32const)))
233 (movl (:%l val) (:@ (:apply + x8632::misc-data-offset (:apply ash idx x8632::word-shift)) (:%l closure))))
234
235(define-x8632-vinsn misc-set-c-double-float (()
236 ((val :double-float)
237 (v :lisp)
238 (idx :s32const)))
239 (movsd (:%xmm val) (:@ (:apply + x8632::misc-dfloat-offset (:apply ash idx 3)) (:%l v))))
240
241(define-x8632-vinsn (call-known-symbol :call) (((result (:lisp x8632::arg_z)))
242 ()
243 ((entry (:label 1))))
244 (:talign x8632::fulltag-tra)
245 (call (:@ x8632::symbol.fcell (:% x8632::fname)))
[7222]246 (movl (:$self 0) (:%l x8632::fn)))
[7112]247
[7222]248(define-x8632-vinsn (jump-known-symbol :jumplr) (()
249 ())
250
251 (jmp (:@ x8632::symbol.fcell (:% x8632::fname))))
252
[7009]253(define-x8632-vinsn set-nargs (()
[15022]254 ((n :u16const))
255 ((casualty (:lisp #.x8632::nargs))))
[10363]256 ((:pred = n 0)
257 (xorl (:%l x8632::nargs) (:%l x8632::nargs)))
258 ((:not (:pred = n 0))
[8367]259 (movl (:$l (:apply ash n x8632::fixnumshift)) (:%l x8632::nargs))))
[7009]260
261(define-x8632-vinsn check-exact-nargs (()
262 ((n :u16const)))
[10495]263 :resume
[7009]264 ((:pred = n 0)
[8367]265 (testl (:%l x8632::nargs) (:%l x8632::nargs)))
266 ((:and (:pred > n 0) (:pred < n 32))
267 (cmpl (:$b (:apply ash n x8632::fixnumshift)) (:%l x8632::nargs)))
[8629]268 ((:pred >= n 32)
269 (cmpl (:$l (:apply ash n x8632::fixnumshift)) (:%l x8632::nargs)))
[10495]270 (jne :bad)
271 (:anchored-uuo-section :resume)
272 :bad
273 (:anchored-uuo (uuo-error-wrong-number-of-args)))
[7009]274
275(define-x8632-vinsn check-min-nargs (()
[8367]276 ((min :u16const)))
[10495]277 :resume
[8367]278 ((:pred = min 1)
279 (testl (:%l x8632::nargs) (:%l x8632::nargs))
[10495]280 (je :toofew))
[8629]281 ((:not (:pred = min 1))
282 ((:and (:pred > min 1) (:pred < min 32))
283 (rcmpl (:%l x8632::nargs) (:$b (:apply ash min x8632::fixnumshift))))
284 ((:pred >= min 32)
285 (rcmpl (:%l x8632::nargs) (:$l (:apply ash min x8632::fixnumshift))))
[10495]286 (jb :toofew))
287 (:anchored-uuo-section :resume)
288 :toofew
289 (:anchored-uuo (uuo-error-too-few-args)))
[7009]290
291(define-x8632-vinsn check-max-nargs (()
[8367]292 ((n :u16const)))
[10495]293 :resume
[8367]294 ((:pred < n 32)
295 (rcmpl (:%l x8632::nargs) (:$b (:apply ash n x8632::fixnumshift))))
296 ((:pred >= n 32)
297 (rcmpl (:%l x8632::nargs) (:$l (:apply ash n x8632::fixnumshift))))
[10495]298 (ja :bad)
299 (:anchored-uuo-section :resume)
300 :bad
301 (:anchored-uuo (uuo-error-too-many-args)))
[7009]302
[10234]303(define-x8632-vinsn check-min-max-nargs (()
304 ((min :u16const)
[14959]305 (max :u16const)))
[10234]306 :resume
307 ((:pred = min 1)
308 (testl (:%l x8632::nargs) (:%l x8632::nargs))
309 (je :toofew))
310 ((:not (:pred = min 1))
311 ((:pred < min 32)
312 (rcmpl (:%l x8632::nargs) (:$b (:apply ash min x8632::word-shift))))
313 ((:pred >= min 32)
314 (rcmpl (:%l x8632::nargs) (:$l (:apply ash min x8632::word-shift))))
315 (jb :toofew))
316 ((:pred < max 32)
317 (rcmpl (:%l x8632::nargs) (:$b (:apply ash max x8632::word-shift))))
318 ((:pred >= max 32)
319 (rcmpl (:%l x8632::nargs) (:$l (:apply ash max x8632::word-shift))))
320 (ja :toomany)
321
322 (:anchored-uuo-section :resume)
323 :toofew
324 (:anchored-uuo (uuo-error-too-few-args))
325 (:anchored-uuo-section :resume)
326 :toomany
327 (:anchored-uuo (uuo-error-too-many-args)))
328
[7112]329(define-x8632-vinsn default-1-arg (()
330 ((min :u16const)))
[8367]331 ((:pred < min 32)
332 (rcmpl (:%l x8632::nargs) (:$b (:apply ash min x8632::fixnumshift))))
333 ((:pred >= min 32)
334 (rcmpl (:%l x8632::nargs) (:$l (:apply ash min x8632::fixnumshift))))
[7112]335 (jne :done)
336 ((:pred >= min 2)
337 (pushl (:%l x8632::arg_y)))
338 ((:pred >= min 1)
339 (movl (:%l x8632::arg_z) (:%l x8632::arg_y)))
[10984]340 (movl (:$l (:apply target-nil-value)) (:%l x8632::arg_z))
[7112]341 :done)
[7009]342
[7112]343(define-x8632-vinsn default-2-args (()
344 ((min :u16const)))
[8367]345 ((:pred < (:apply 1+ min) 32)
346 (rcmpl (:%l x8632::nargs) (:$b (:apply ash (:apply 1+ min) x8632::fixnumshift))))
347 ((:pred >= (:apply 1+ min) 32)
348 (rcmpl (:%l x8632::nargs) (:$l (:apply ash (:apply 1+ min) x8632::fixnumshift))))
[7112]349 (ja :done)
350 (je :one)
351 ;; We got "min" args; arg_y & arg_z default to nil
352 ((:pred >= min 2)
353 (pushl (:%l x8632::arg_y)))
354 ((:pred >= min 1)
[7114]355 (pushl (:%l x8632::arg_z)))
[10984]356 (movl (:$l (:apply target-nil-value)) (:%l x8632::arg_y))
[7112]357 (jmp :last)
358 :one
359 ;; We got min+1 args: arg_y was supplied, arg_z defaults to nil.
360 ((:pred >= min 1)
361 (pushl (:%l x8632::arg_y)))
362 (movl (:%l x8632::arg_z) (:%l x8632::arg_y))
363 :last
[10984]364 (movl (:$l (:apply target-nil-value)) (:%l x8632::arg_z))
[7112]365 :done)
366
367(define-x8632-vinsn default-optionals (()
368 ((n :u16const))
[8629]369 ((temp :u32)
370 (nargs (:lisp #.x8632::nargs))))
371 (movl (:%l x8632::nargs) (:%l temp))
[8367]372 ((:pred < n 32)
373 (rcmpl (:%l x8632::nargs) (:$b (:apply ash n x8632::fixnumshift))))
374 ((:pred >= n 32)
375 (rcmpl (:%l x8632::nargs) (:$l (:apply ash n x8632::fixnumshift))))
[7112]376 (jae :done)
377 :loop
[8367]378 (addl (:$b x8632::fixnumone) (:%l temp))
[10984]379 (pushl (:$l (:apply target-nil-value)))
[8367]380 ((:pred < n 32)
381 (cmpl (:$b (:apply ash n x8632::fixnumshift)) (:%l temp)))
382 ((:pred >= n 32)
383 (cmpl (:$l (:apply ash n x8632::fixnumshift)) (:%l temp)))
[7112]384 (jne :loop)
[8256]385 :done)
[7112]386
387(define-x8632-vinsn save-lisp-context-no-stack-args (()
388 ())
389 (pushl (:%l x8632::ebp))
390 (movl (:%l x8632::esp) (:%l x8632::ebp)))
391
392(define-x8632-vinsn save-lisp-context-offset (()
393 ((nbytes-pushed :s32const)))
394 (movl (:%l x8632::ebp) (:@ (:apply + nbytes-pushed x8632::node-size) (:%l x8632::esp)))
[7114]395 (leal (:@ (:apply + nbytes-pushed x8632::node-size) (:%l x8632::esp)) (:%l x8632::ebp))
396 (popl (:@ x8632::node-size (:%l x8632::ebp))))
[7112]397
398(define-x8632-vinsn save-lisp-context-variable-arg-count (()
399 ()
[8629]400 ((temp :u32)
401 (nargs (:lisp #.x8632::nargs))))
[8367]402 (movl (:%l x8632::nargs) (:%l temp))
[7112]403 (subl (:$b (* $numx8632argregs x8632::node-size)) (:%l temp))
404 (jle :push)
405 (movl (:%l x8632::ebp) (:@ x8632::node-size (:%l x8632::esp) (:%l temp)))
406 (leal (:@ x8632::node-size (:%l x8632::esp) (:%l temp)) (:%l x8632::ebp))
407 (popl (:@ x8632::node-size (:%l x8632::ebp)))
408 (jmp :done)
409 :push
410 (pushl (:%l x8632::ebp))
411 (movl (:%l x8632::esp) (:%l x8632::ebp))
412 :done)
413
414;;; We know that some args were pushed, but don't know how many were
415;;; passed.
416(define-x8632-vinsn save-lisp-context-in-frame (()
417 ()
[8629]418 ((temp :u32)
419 (nargs (:lisp #.x8632::nargs))))
[8367]420 (movl (:%l x8632::nargs) (:%l temp))
[7112]421 (subl (:$b (* $numx8632argregs x8632::node-size)) (:%l temp))
[7114]422 (movl (:%l x8632::ebp) (:@ x8632::node-size (:%l x8632::esp) (:%l temp)))
[7112]423 (leal (:@ x8632::node-size (:%l x8632::esp) (:%l temp)) (:%l x8632::ebp))
424 (popl (:@ x8632::node-size (:%l x8632::ebp))))
425
[7009]426(define-x8632-vinsn (vpush-register :push :node :vsp)
427 (()
428 ((reg :lisp)))
429 (pushl (:% reg)))
430
431(define-x8632-vinsn (vpush-fixnum :push :node :vsp)
432 (()
433 ((const :s32const)))
434 ((:and (:pred < const 128) (:pred >= const -128))
435 (pushl (:$b const)))
436 ((:not (:and (:pred < const 128) (:pred >= const -128)))
437 (pushl (:$l const))))
438
[7112]439(define-x8632-vinsn vframe-load (((dest :lisp))
440 ((frame-offset :u16const)
441 (cur-vsp :u16const)))
442 (movl (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp)) (:%l dest)))
443
444(define-x8632-vinsn compare-vframe-offset-to-nil (()
445 ((frame-offset :u16const)
446 (cur-vsp :u16const)))
[10984]447 (cmpl (:$l (:apply target-nil-value)) (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp))))
[7112]448
[15022]449
450(define-x8632-vinsn compare-vframe-offset-to-fixnum (()
451 ((frame-offset :u16const)
452 (fixval :s32const)))
453 ((:and (:pred < fixval 128) (:pred >= fixval -128))
454 (cmpl (:$b fixval) (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp))))
455 ((:not (:and (:pred < fixval 128) (:pred >= fixval -128)))
456 (cmpl (:$l fixval) (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp)))))
457
458(define-x8632-vinsn add-constant-to-vframe-offset (()
459 ((frame-offset :u16const)
460 (constant :s32const)))
461 ((:and (:pred < constant 128) (:pred >= constant -128))
462 (addl (:$b constant) (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp))))
463 ((:not (:and (:pred < constant 128) (:pred >= constant -128)))
464 (addl (:$l constant) (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp)))))
465
[7112]466(define-x8632-vinsn compare-value-cell-to-nil (()
467 ((vcell :lisp)))
[10984]468 (cmpl (:$l (:apply target-nil-value)) (:@ x8632::value-cell.value (:%l vcell))))
[7112]469
470(define-x8632-vinsn lcell-load (((dest :lisp))
471 ((cell :lcell)
472 (top :lcell)))
473 (movl (:@ (:apply - (:apply + (:apply calc-lcell-offset cell) x8632::word-size-in-bytes)) (:%l x8632::ebp)) (:%l dest)))
474
475(define-x8632-vinsn (vframe-push :push :node :vsp)
476 (()
477 ((frame-offset :u16const)
478 (cur-vsp :u16const)))
[7114]479 (pushl (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp))))
[7112]480
481(define-x8632-vinsn vframe-store (()
482 ((src :lisp)
483 (frame-offset :u16const)
484 (cur-vsp :u16const)))
485 (movl (:%l src) (:@ (:apply - (:apply + frame-offset x8632::word-size-in-bytes)) (:%l x8632::ebp))))
486
487(define-x8632-vinsn lcell-store (()
488 ((src :lisp)
489 (cell :lcell)
490 (top :lcell)))
491 (movl (:%l src) (:@ (:apply - (:apply + (:apply calc-lcell-offset cell) x8632::word-size-in-bytes)) (:%l x8632::ebp))))
492
[15519]493(define-x8632-vinsn (popj :lispcontext :pop :vsp :lrRestore :jumpLR)
[7112]494 (()
495 ())
496 (leave)
497 (ret))
498
[15564]499(define-x8632-vinsn (popj-via-jump :lispcontext :pop :vsp :lrRestore :jumpLR)
500 (()
501 ((lab :label)))
502 (jmp lab))
503
[7112]504(define-x8632-vinsn (restore-full-lisp-context :lispcontext :pop :vsp )
505 (()
506 ())
507 (leave))
508
509(define-x8632-vinsn compare-to-nil (()
510 ((arg0 t)))
[10984]511 (cmpl (:$l (:apply target-nil-value)) (:%l arg0)))
[7112]512
[10234]513(define-x8632-vinsn compare-to-t (()
514 ((arg0 t)))
[10984]515 (cmpl (:$l (:apply target-t-value)) (:%l arg0)))
[10234]516
[7009]517(define-x8632-vinsn ref-constant (((dest :lisp))
518 ((lab :label)))
519 (movl (:@ (:^ lab) (:%l x8632::fn)) (:%l dest)))
520
[10234]521(define-x8632-vinsn compare-constant-to-register (()
522 ((lab :label)
523 (reg :lisp)))
524 (cmpl (:@ (:^ lab) (:%l x8632::fn)) (:%l reg)))
525
[7009]526(define-x8632-vinsn (vpush-constant :push :node :vsp) (()
527 ((lab :label)))
[7112]528 (pushl (:@ (:^ lab) (:%l x8632::fn))))
[7009]529
530(define-x8632-vinsn (jump :jump)
531 (()
532 ((label :label)))
533 (jmp label))
534
535(define-x8632-vinsn (cbranch-true :branch) (()
536 ((label :label)
537 (crbit :u8const)))
538 (jcc (:$ub crbit) label))
539
540(define-x8632-vinsn (cbranch-false :branch) (()
541 ((label :label)
542 (crbit :u8const)))
543 (jcc (:$ub (:apply logxor 1 crbit)) label))
544
[7112]545(define-x8632-vinsn (lri :constant-ref) (((dest :imm))
546 ((intval :s32const))
547 ())
548 ((:pred = intval 0)
549 (xorl (:%l dest) (:%l dest)))
[7428]550 ((:not (:pred = intval 0))
[7112]551 (movl (:$l intval) (:%l dest))))
552
[7817]553(define-x8632-vinsn (lriu :constant-ref) (((dest :imm))
554 ((intval :u32const))
555 ())
556 ((:pred = intval 0)
557 (xorl (:%l dest) (:%l dest)))
558 ((:not (:pred = intval 0))
559 (movl (:$l intval) (:%l dest))))
560
[7112]561;;; In the following trap/branch-unless vinsns, it might be worth
562;;; trying to use byte instructions when the args are known to be
563;;; accessible as byte regs. It also might be possible to
564;;; special-case eax/ax/al.
565
566(define-x8632-vinsn trap-unless-bit (()
567 ((value :lisp)))
[10495]568 :resume
[7112]569 (testl (:$l (lognot x8632::fixnumone)) (:%l value))
[10495]570 (jne :bad)
[7112]571
[10495]572 (:anchored-uuo-section :resume)
573 :bad
574 (:anchored-uuo (uuo-error-reg-not-type (:%l value) (:$ub arch::error-object-not-bit))))
575
[7133]576;;; note that NIL is just a distinguished CONS.
[7112]577;;; the tag formerly known as fulltag-nil is now
578;;; for tagged return addresses.
579(define-x8632-vinsn trap-unless-list (()
580 ((object :lisp))
[8211]581 ((tag :u8)))
[10495]582 :resume
[8211]583 (movl (:% object) (:% tag))
584 (andl (:$b x8632::fulltagmask) (:% tag))
585 (cmpl (:$b x8632::fulltag-cons) (:% tag))
[10495]586 (jne :bad)
[7112]587
[10495]588 (:anchored-uuo-section :resume)
589 :bad
590 (:anchored-uuo (uuo-error-reg-not-list (:%l object))))
591
[7112]592(define-x8632-vinsn trap-unless-cons (()
593 ((object :lisp))
[8367]594 ((tag :u8)))
595 ;; special check for NIL (which is a distinguished CONS on x8632)
[10495]596 :resume
[10984]597 (cmpl (:$l (:apply target-nil-value)) (:%l object))
[9692]598 (je :bad)
[8367]599 (movl (:%l object) (:%l tag))
600 (andl (:$b x8632::fulltagmask) (:%l tag))
601 (cmpl (:$b x8632::fulltag-cons) (:%l tag))
[10495]602 (jne :bad)
603
604 (:anchored-uuo-section :resume)
[7112]605 :bad
[10495]606 (:anchored-uuo (uuo-error-reg-not-tag (:%l object) (:$ub x8632::fulltag-cons))))
[7112]607
[8629]608(define-x8632-vinsn set-z-flag-if-consp (()
609 ((object :lisp))
610 ((tag (:u32 #.x8632::imm0))))
611 (movl (:%l object) (:%accl tag))
[11030]612 (andl (:$b x8632::fulltagmask) (:%accl tag))
[8629]613 (cmpb (:$b x8632::fulltag-cons) (:%accb tag))
[8687]614 (setne (:%b x8632::ah))
[10984]615 (cmpl (:$l (:apply target-nil-value)) (:% object))
[8629]616 (sete (:%b x8632::al))
[8687]617 (orb (:%b x8632::ah) (:%b x8632::al)))
[8629]618
[7009]619(define-x8632-vinsn trap-unless-uvector (()
620 ((object :lisp))
[8367]621 ((tag :u8)))
[10495]622 :resume
[8367]623 (movl (:%l object) (:%l tag))
624 (andl (:$b x8632::tagmask) (:%l tag))
625 (cmpl (:$b x8632::tag-misc) (:%l tag))
[10495]626 (jne :bad)
[7009]627
[10495]628 (:anchored-uuo-section :resume)
629 :bad
630 (:anchored-uuo (uuo-error-reg-not-tag (:%l object) (:$ub x8632::tag-misc))))
631
[7112]632(define-x8632-vinsn trap-unless-character (()
[8367]633 ((object :lisp))
634 ((tag :u8)))
635 ;; xxx can't be sure that object will be in a byte-accessible register
[10495]636 :resume
[8367]637 (movl (:%l object) (:%l tag))
638 (cmpb (:$b x8632::subtag-character) (:%b tag))
[10495]639 (jne :bad)
[7112]640
[10495]641 (:anchored-uuo-section :resume)
642 :bad
643 (:anchored-uuo(uuo-error-reg-not-tag (:%l object) (:$ub x8632::subtag-character))))
644
[7112]645(define-x8632-vinsn trap-unless-fixnum (()
646 ((object :lisp))
647 ())
[10495]648 :resume
[8367]649 (testl (:$l x8632::tagmask) (:%l object))
[10495]650 (jne :bad)
[7112]651
[10495]652 (:anchored-uuo-section :resume)
653 :bad
654 (:anchored-uuo (uuo-error-reg-not-fixnum (:%l object))))
655
[7112]656(define-x8632-vinsn set-flags-from-lisptag (()
657 ((reg :lisp)))
[8367]658 (testl (:$l x8632::tagmask) (:%l reg)))
[7112]659
660(define-x8632-vinsn trap-unless-typecode= (()
661 ((object :lisp)
[7251]662 (tagval :u8const))
663 ((tag :u8)))
[10495]664 :resume
[7251]665 (movl (:%l object) (:%l tag))
666 ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
667 ;; accumulator
[8231]668 (andl (:$b x8632::tagmask) (:%accl tag))
669 (cmpl (:$b x8632::tag-misc) (:%accl tag)))
670 ((:pred > (:apply %hard-regspec-value tag) x8632::eax)
671 (andl (:$b x8632::tagmask) (:%l tag))
[7251]672 (cmpl (:$b x8632::tag-misc) (:%l tag)))
[7112]673 (jne :have-tag)
[11029]674 ;; This needs to be a sign-extending mov, since the cmpl below
675 ;; will sign-extend the 8-bit constant operand.
676 (movsbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
[7112]677 :have-tag
[11029]678 (cmpl (:$b tagval) (:%l tag))
[10495]679 (jne :bad)
[7112]680
[10495]681 (:anchored-uuo-section :resume)
682 :bad
683 (:anchored-uuo (uuo-error-reg-not-tag (:%l object) (:$ub tagval))))
684
[7112]685(define-x8632-vinsn trap-unless-single-float (()
686 ((object :lisp))
[8367]687 ((tag :u8)))
[10495]688 :resume
[8367]689 (movl (:%l object) (:%l tag))
690 (andl (:$b x8632::tagmask) (:%l tag))
691 (cmpl (:$b x8632::tag-misc) (:%l tag))
[8629]692 (jne :bad)
[11029]693 (movsbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
694 (cmpl (:$b x8632::subtag-single-float) (:%l tag))
[10495]695 (jne :bad)
696
697 (:anchored-uuo-section :resume)
[8629]698 :bad
[10495]699 (:anchored-uuo (uuo-error-reg-not-tag (:%l object) (:$ub x8632::subtag-single-float))))
[7112]700
701(define-x8632-vinsn trap-unless-double-float (()
702 ((object :lisp))
[8367]703 ((tag :u8)))
[10495]704 :resume
[8367]705 (movl (:%l object) (:%l tag))
706 (andl (:$b x8632::tagmask) (:%l tag))
707 (cmpl (:$b x8632::tag-misc) (:%l tag))
[8629]708 (jne :bad)
[11029]709 (movsbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
710 (cmpl (:$b x8632::subtag-double-float) (:%l tag))
[10495]711 (jne :bad)
712
713 (:anchored-uuo-section :resume)
[8629]714 :bad
[10495]715 (:anchored-uuo (uuo-error-reg-not-tag (:%l object) (:$ub x8632::subtag-double-float))))
[7112]716
717(define-x8632-vinsn trap-unless-macptr (()
718 ((object :lisp))
[8367]719 ((tag :u8)))
[10495]720 :resume
[8367]721 (movl (:%l object) (:%l tag))
722 (andl (:$b x8632::tagmask) (:%l tag))
723 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7112]724 (jne :have-tag)
[11029]725 (movsbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
[7112]726 :have-tag
[8367]727 (cmpl (:$b x8632::subtag-macptr) (:%l tag))
[10495]728 (jne :bad)
[7112]729
[10495]730 (:anchored-uuo-section :resume)
731 :bad
732 (:anchored-uuo (uuo-error-reg-not-tag (:%l object) (:$ub x8632::subtag-macptr))))
733
[7112]734(define-x8632-vinsn check-misc-bound (()
735 ((idx :imm)
736 (v :lisp))
737 ((temp :u32)))
[10495]738 :resume
[7112]739 (movl (:@ x8632::misc-header-offset (:%l v)) (:%l temp))
[7286]740 ((:and (:pred >= (:apply %hard-regspec-value temp) x8632::eax)
741 (:pred <= (:apply %hard-regspec-value temp) x8632::ebx))
742 (xorb (:%b temp) (:%b temp))
743 (shrl (:$ub (- x8632::num-subtag-bits x8632::fixnumshift)) (:%l temp)))
744 ((:pred > (:apply %hard-regspec-value temp) x8632::ebx)
745 (shrl (:$ub x8632::num-subtag-bits) (:%l temp))
746 (shll (:$ub x8632::fixnumshift) (:%l temp)))
[7114]747 (rcmpl (:%l idx) (:%l temp))
[10495]748 (jae :bad)
[7112]749
[10495]750 (:anchored-uuo-section :resume)
751 :bad
752 (:anchored-uuo (uuo-error-vector-bounds (:%l idx) (:%l v))))
753
[7112]754(define-x8632-vinsn %cdr (((dest :lisp))
755 ((src :lisp)))
756 (movl (:@ x8632::cons.cdr (:%l src)) (:%l dest)))
757
758(define-x8632-vinsn (%vpush-cdr :push :node :vsp)
759 (()
760 ((src :lisp)))
761 (pushl (:@ x8632::cons.cdr (:%l src))))
762
763(define-x8632-vinsn %car (((dest :lisp))
764 ((src :lisp)))
765 (movl (:@ x8632::cons.car (:%l src)) (:%l dest)))
766
767(define-x8632-vinsn (%vpush-car :push :node :vsp)
768 (()
769 ((src :lisp)))
770 (pushl (:@ x8632::cons.car (:%l src))))
771
772(define-x8632-vinsn u32->char (((dest :lisp)
773 (src :u8))
774 ((src :u8))
775 ())
776 (shll (:$ub x8632::charcode-shift) (:%l src))
[7114]777 (leal (:@ x8632::subtag-character (:%l src)) (:%l dest)))
[7112]778
779(define-x8632-vinsn (load-nil :constant-ref) (((dest t))
780 ())
[10984]781 (movl (:$l (:apply target-nil-value)) (:%l dest)))
[7112]782
783
784(define-x8632-vinsn (load-t :constant-ref) (((dest t))
785 ())
[10984]786 (movl (:$l (:apply target-t-value)) (:%l dest)))
[7112]787
788(define-x8632-vinsn extract-tag (((tag :u8))
789 ((object :lisp)))
790 (movl (:%l object) (:%l tag))
[11030]791 (andl (:$b x8632::tagmask) (:%l tag)))
[7112]792
793(define-x8632-vinsn extract-tag-fixnum (((tag :imm))
794 ((object :lisp)))
[8902]795 (leal (:@ (:%l object) 4) (:%l tag))
[8367]796 (andl (:$b (ash x8632::tagmask x8632::fixnumshift)) (:%l tag)))
[7112]797
798(define-x8632-vinsn extract-fulltag (((tag :u8))
799 ((object :lisp)))
800 (movl (:%l object) (:%l tag))
[8367]801 (andl (:$b x8632::fulltagmask) (:%l tag)))
[7112]802
803(define-x8632-vinsn extract-fulltag-fixnum (((tag :imm))
804 ((object :lisp)))
[8367]805 ((:pred =
806 (:apply %hard-regspec-value tag)
807 (:apply %hard-regspec-value object))
808 (shll (:$ub x8632::fixnumshift) (:%l object)))
809 ((:not (:pred =
810 (:apply %hard-regspec-value tag)
811 (:apply %hard-regspec-value object)))
812 (imull (:$b x8632::fixnumone) (:%l object) (:%l tag)))
813 (andl (:$b (ash x8632::fulltagmask x8632::fixnumshift)) (:%l tag)))
[7112]814
[11029]815(define-x8632-vinsn extract-typecode (((tag :u32))
[7112]816 ((object :lisp)))
817 (movl (:%l object) (:%l tag))
[11029]818 (andl (:$b x8632::tagmask) (:%l tag))
819 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7112]820 (jne :have-tag)
[11029]821 (movzbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
[7112]822 :have-tag)
823
824(define-x8632-vinsn extract-typecode-fixnum (((tag :imm))
825 ((object :lisp))
826 ((temp :u32)))
827 (movl (:%l object) (:%l temp))
[8232]828 (andl (:$b x8632::tagmask) (:%l temp))
829 (cmpl (:$b x8632::tag-misc) (:%l temp))
[7112]830 (jne :have-tag)
[11029]831 (movzbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l temp))
[7112]832 :have-tag
833 (leal (:@ (:%l temp) 4) (:%l tag)))
834
835(define-x8632-vinsn compare-reg-to-zero (()
836 ((reg :imm)))
837 (testl (:%l reg) (:%l reg)))
838
839;;; life will be sad if reg isn't byte accessible
840(define-x8632-vinsn compare-u8-reg-to-zero (()
841 ((reg :u8)))
842 (testb (:%b reg) (:%b reg)))
843
844(define-x8632-vinsn cr-bit->boolean (((dest :lisp))
845 ((crbit :u8const))
846 ((temp :u32)))
[10984]847 (movl (:$l (:apply target-t-value)) (:%l temp))
[7114]848 (leal (:@ (- x8632::t-offset) (:%l temp)) (:%l dest))
[7112]849 (cmovccl (:$ub crbit) (:%l temp) (:%l dest)))
850
851(define-x8632-vinsn compare-s32-constant (()
852 ((val :imm)
853 (const :s32const)))
854 ((:or (:pred < const -128) (:pred > const 127))
855 (rcmpl (:%l val) (:$l const)))
856 ((:not (:or (:pred < const -128) (:pred > const 127)))
857 (rcmpl (:%l val) (:$b const))))
858
859(define-x8632-vinsn compare-u31-constant (()
860 ((val :u32)
861 (const :u32const)))
862 ((:pred > const 127)
863 (rcmpl (:%l val) (:$l const)))
864 ((:not (:pred > const 127))
865 (rcmpl (:%l val) (:$b const))))
866
867(define-x8632-vinsn compare-u8-constant (()
868 ((val :u8)
869 (const :u8const)))
[7286]870 ((:pred = (:apply %hard-regspec-value val) x8632::eax)
871 (rcmpb (:%accb val) (:$b const)))
872 ((:and (:pred > (:apply %hard-regspec-value val) x8632::eax)
873 (:pred <= (:apply %hard-regspec-value val) x8632::ebx))
874 (rcmpb (:%b val) (:$b const)))
875 ((:pred > (:apply %hard-regspec-value val) x8632::ebx)
876 (rcmpl (:%l val) (:$l const)))
[7112]877 )
878
879(define-x8632-vinsn cons (((dest :lisp))
880 ((car :lisp)
[7222]881 (cdr :lisp))
882 ((allocptr (:lisp #.x8632::allocptr))))
[7112]883 (subl (:$b (- x8632::cons.size x8632::fulltag-cons)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
884 (movl (:@ (:%seg :rcontext) x8632::tcr.save-allocptr) (:%l x8632::allocptr))
885 (rcmpl (:%l x8632::allocptr) (:@ (:%seg :rcontext) x8632::tcr.save-allocbase))
[11556]886 (ja :no-trap)
[7112]887 (uuo-alloc)
888 :no-trap
889 (andb (:$b (lognot x8632::fulltagmask)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
890 (movl (:%l car) (:@ x8632::cons.car (:%l x8632::allocptr)))
891 (movl (:%l cdr) (:@ x8632::cons.cdr (:%l x8632::allocptr)))
892 (movl (:%l x8632::allocptr) (:%l dest)))
893
894(define-x8632-vinsn unbox-u8 (((dest :u8))
895 ((src :lisp)))
[10495]896 :resume
[7112]897 (movl (:$l (lognot (ash #xff x8632::fixnumshift))) (:%l dest))
898 (andl (:% src) (:% dest))
[10495]899 (jne :bad)
[7114]900 (movl (:%l src) (:%l dest))
[10495]901 (shrl (:$ub x8632::fixnumshift) (:%l dest))
[7112]902
[10495]903 (:anchored-uuo-section :resume)
904 :bad
905 (:anchored-uuo (uuo-error-reg-not-type (:%l src) (:$ub arch::error-object-not-unsigned-byte-8))))
906
[7112]907(define-x8632-vinsn %unbox-u8 (((dest :u8))
908 ((src :lisp)))
909 (movl (:%l src) (:%l dest))
910 (shrl (:$ub x8632::fixnumshift) (:%l dest))
911 (andl (:$l #xff) (:%l dest)))
912
913(define-x8632-vinsn unbox-s8 (((dest :s8))
914 ((src :lisp)))
[10495]915 :resume
[7112]916 (movl (:%l src) (:%l dest))
917 (shll (:$ub (- x8632::nbits-in-word (+ 8 x8632::fixnumshift))) (:%l dest))
918 (sarl (:$ub (- x8632::nbits-in-word (+ 8 x8632::fixnumshift))) (:%l dest))
919 (cmpl (:%l src) (:%l dest))
[9692]920 (jne :bad)
[8367]921 (testl (:$l x8632::fixnummask) (:%l dest))
[9692]922 (jne :bad)
[7112]923 (sarl (:$ub x8632::fixnumshift) (:%l dest))
[10495]924
925 (:anchored-uuo-section :resume)
[7112]926 :bad
[10495]927 (:anchored-uuo (uuo-error-reg-not-type (:%l src) (:$ub arch::error-object-not-signed-byte-8))))
[7112]928
[15455]929(define-x8632-vinsn %unbox-s8 (((dest :s8))
930 ((src :lisp)))
931 (movl (:%l src) (:%l dest))
932 (sarl (:$ub x8632::fixnumshift) (:%l dest)))
933
[7112]934(define-x8632-vinsn unbox-u16 (((dest :u16))
935 ((src :lisp)))
[10495]936 :resume
[7112]937 (testl (:$l (lognot (ash #xffff x8632::fixnumshift))) (:% src))
938 (movl (:%l src) (:%l dest))
[10495]939 (jne :bad)
940 (shrl (:$ub x8632::fixnumshift) (:%l dest))
941 (:anchored-uuo-section :resume)
942 :bad
943 (:anchored-uuo (uuo-error-reg-not-type (:%l src) (:$ub arch::error-object-not-unsigned-byte-16))))
[7112]944
945(define-x8632-vinsn %unbox-u16 (((dest :u16))
946 ((src :lisp)))
947 (movl (:%l src) (:%l dest))
948 (shrl (:$ub x8632::fixnumshift) (:%l dest)))
949
950(define-x8632-vinsn unbox-s16 (((dest :s16))
951 ((src :lisp)))
[10495]952 :resume
[7112]953 (movl (:%l src) (:%l dest))
954 (shll (:$ub (- x8632::nbits-in-word (+ 16 x8632::fixnumshift))) (:%l dest))
955 (sarl (:$ub (- x8632::nbits-in-word (+ 16 x8632::fixnumshift))) (:%l dest))
956 (cmpl (:%l src) (:%l dest))
[9692]957 (jne :bad)
[8367]958 (testl (:$l x8632::fixnummask) (:%l dest))
[10495]959 (jne :bad)
960 (sarl (:$ub x8632::fixnumshift) (:%l dest))
961
962 (:anchored-uuo-section :resume)
[7112]963 :bad
[10495]964 (:anchored-uuo (uuo-error-reg-not-type (:%l src) (:$ub arch::error-object-not-signed-byte-16))))
[7112]965
966(define-x8632-vinsn %unbox-s16 (((dest :s16))
967 ((src :lisp)))
968 (movl (:%l src) (:%l dest))
969 (sarl (:$ub x8632::fixnumshift) (:%l dest)))
970
[9584]971;;; An object is of type (UNSIGNED-BYTE 32) iff
972;;; a) it's of type (UNSIGNED-BYTE 30) (e.g., an unsigned fixnum)
973;;; b) it's a bignum of length 1 and the 0'th digit is positive
974;;; c) it's a bignum of length 2 and the sign-digit is 0.
[7112]975(define-x8632-vinsn unbox-u32 (((dest :u32))
976 ((src :lisp)))
[10495]977 :resume
[7112]978 (movl (:$l (lognot (ash x8632::target-most-positive-fixnum x8632::fixnumshift))) (:%l dest))
979 (testl (:%l dest) (:%l src))
980 (movl (:%l src) (:%l dest))
981 (jnz :maybe-bignum)
982 (sarl (:$ub x8632::fixnumshift) (:%l dest))
983 (jmp :done)
984 :maybe-bignum
[8367]985 (andl (:$b x8632::tagmask) (:%l dest))
986 (cmpl (:$b x8632::tag-misc) (:%l dest))
[7112]987 (jne :bad)
988 (movl (:@ x8632::misc-header-offset (:%l src)) (:%l dest))
989 (cmpl (:$l x8632::two-digit-bignum-header) (:%l dest))
[9233]990 (je :two)
991 (cmpl (:$l x8632::one-digit-bignum-header) (:%l dest))
[7112]992 (jne :bad)
[7114]993 (movl (:@ x8632::misc-data-offset (:%l src)) (:%l dest))
[7112]994 (testl (:%l dest) (:%l dest))
[10495]995 (js :bad)
996 (jmp :done)
[9233]997 :two
[7112]998 (movl (:@ (+ 4 x8632::misc-data-offset) (:%l src)) (:%l dest))
999 (testl (:%l dest) (:%l dest))
[9233]1000 (jne :bad)
[7112]1001 (movl (:@ x8632::misc-data-offset (:%l src)) (:%l dest))
[10495]1002 :done
1003
1004 (:anchored-uuo-section :resume)
1005 :bad
1006 (:anchored-uuo (uuo-error-reg-not-type (:%l src) (:$ub arch::error-object-not-unsigned-byte-32))))
[7112]1007
[10859]1008;;; an object is of type (SIGNED-BYTE 32) iff
1009;;; a) it's a fixnum
1010;;; b) it's a bignum with exactly one digit.
[7112]1011(define-x8632-vinsn unbox-s32 (((dest :s32))
1012 ((src :lisp)))
[10495]1013 :resume
[7112]1014 (movl (:%l src) (:%l dest))
1015 (sarl (:$ub x8632::fixnumshift) (:%l dest))
1016 ;; Was it a fixnum ?
[8367]1017 (testl (:$l x8632::fixnummask) (:%l src))
[7112]1018 (je :done)
[10859]1019 ;; May be a 1-digit bignum
[8367]1020 (movl (:%l src) (:%l dest))
1021 (andl (:$b x8632::tagmask) (:%l dest))
1022 (cmpl (:$b x8632::tag-misc) (:%l dest))
[7112]1023 (jne :bad)
[10859]1024 (cmpl (:$l x8632::one-digit-bignum-header) (:@ x8632::misc-header-offset (:%l src)))
[7112]1025 (movl (:@ x8632::misc-data-offset (:%l src)) (:%l dest))
[10495]1026 (jne :bad)
1027 :done
1028
1029 (:anchored-uuo-section :resume)
[7112]1030 :bad
[10495]1031 (:anchored-uuo (uuo-error-reg-not-type (:%l src) (:$ub arch::error-object-not-signed-byte-32))))
[7112]1032
1033(define-x8632-vinsn sign-extend-s8 (((dest :s32))
1034 ((src :s8)))
[11355]1035 (movsbl (:%b src) (:%l dest)))
[7112]1036
1037(define-x8632-vinsn sign-extend-s16 (((dest :s32))
1038 ((src :s16)))
[7114]1039 (movswl (:%w src) (:%l dest)))
[7112]1040
1041(define-x8632-vinsn zero-extend-u8 (((dest :s32))
1042 ((src :u8)))
[15022]1043 ((:pred < (:apply %hard-regspec-value src) 4)
1044 (movzbl (:%b src) (:%l dest)))
1045 ((:pred >= (:apply %hard-regspec-value src) 4)
1046 (movl (:%l src) (:%l dest))
1047 (movzbl (:%b dest) (:%l dest))))
1048
[7112]1049
1050(define-x8632-vinsn zero-extend-u16 (((dest :s32))
1051 ((src :u16)))
1052 (movzwl (:%w src) (:%l dest)))
1053
1054(define-x8632-vinsn (jump-subprim :jumpLR) (()
1055 ((spno :s32const)))
1056 (jmp (:@ spno)))
1057
1058;;; Call a subprimitive using a tail-aligned CALL instruction.
1059(define-x8632-vinsn (call-subprim :call) (()
1060 ((spno :s32const))
1061 ((entry (:label 1))))
1062 (:talign x8632::fulltag-tra)
1063 (call (:@ spno))
[7222]1064 (movl (:$self 0) (:% x8632::fn)))
[7112]1065
1066
[14338]1067(define-x8632-vinsn %ilognot (((dest :imm)
1068 (src :imm))
1069 ((src :imm)))
1070 (xorl (:$b (- x8632::fixnumone)) (:%l dest)))
1071
[7112]1072(define-x8632-vinsn %logand-c (((dest t)
1073 (val t))
1074 ((val t)
1075 (const :s32const)))
1076 ((:and (:pred >= const -128) (:pred <= const 127))
1077 (andl (:$b const) (:%l val)))
1078 ((:not (:and (:pred >= const -128) (:pred <= const 127)))
1079 (andl (:$l const) (:%l val))))
1080
1081(define-x8632-vinsn %logior-c (((dest t)
1082 (val t))
1083 ((val t)
1084 (const :s32const)))
1085 ((:and (:pred >= const -128) (:pred <= const 127))
1086 (orl (:$b const) (:%l val)))
1087 ((:not (:and (:pred >= const -128) (:pred <= const 127)))
1088 (orl (:$l const) (:%l val))))
1089
1090(define-x8632-vinsn %logxor-c (((dest t)
1091 (val t))
1092 ((val t)
1093 (const :s32const)))
1094 ((:and (:pred >= const -128) (:pred <= const 127))
1095 (xorl (:$b const) (:%l val)))
1096 ((:not (:and (:pred >= const -128) (:pred <= const 127)))
1097 (xorl (:$l const) (:%l val))))
1098
1099(define-x8632-vinsn character->fixnum (((dest :lisp))
1100 ((src :lisp))
1101 ())
1102 ((:not (:pred =
1103 (:apply %hard-regspec-value dest)
1104 (:apply %hard-regspec-value src)))
1105 (movl (:%l src) (:%l dest)))
[9233]1106
1107 ((:pred <= (:apply %hard-regspec-value dest) x8632::ebx)
1108 (xorb (:%b dest) (:%b dest)))
1109 ((:pred > (:apply %hard-regspec-value dest) x8632::ebx)
1110 (andl (:$l -256) (:%l dest)))
[7112]1111 (shrl (:$ub (- x8632::charcode-shift x8632::fixnumshift)) (:%l dest)))
1112
[7133]1113(define-x8632-vinsn compare (()
1114 ((x t)
1115 (y t)))
1116 (rcmpl (:%l x) (:%l y)))
1117
[7112]1118(define-x8632-vinsn negate-fixnum (((val :lisp))
1119 ((val :imm)))
1120 (negl (:% val)))
1121
[7428]1122;;; This handles the 1-bit overflow from addition/subtraction/unary negation
1123(define-x8632-vinsn set-bigits-and-header-for-fixnum-overflow
1124 (()
1125 ((val :lisp)
1126 (no-overflow
1127 :label))
1128 ((imm (:u32 #.x8632::imm0))))
[9692]1129 (jno no-overflow)
[7428]1130 (movl (:%l val) (:%l imm))
1131 (sarl (:$ub x8632::fixnumshift) (:%l imm))
1132 (xorl (:$l #xc0000000) (:%l imm))
1133 ;; stash bignum digit
1134 (movd (:%l imm) (:%mmx x8632::mm1))
1135 ;; set header
1136 (movl (:$l x8632::one-digit-bignum-header) (:%l imm))
1137 (movd (:%l imm) (:%mmx x8632::mm0))
1138 ;; need 8 bytes of aligned memory for 1 digit bignum
1139 (movl (:$l (- 8 x8632::fulltag-misc)) (:%l imm)))
[7222]1140
[13248]1141(define-x8632-vinsn handle-fixnum-overflow-inline
1142 (()
1143 ((val :lisp)
1144 (no-overflow
1145 :label))
1146 ((imm (:u32 #.x8632::imm0))
1147 (freeptr (:lisp #.x8632::allocptr))))
1148 (jo :overflow)
1149 (:uuo-section)
1150 :overflow
1151 (movl (:%l val) (:%l imm))
1152 (sarl (:$ub x8632::fixnumshift) (:%l imm))
1153 (xorl (:$l #xc0000000) (:%l imm))
1154 ;; stash bignum digit
1155 (movd (:%l imm) (:%mmx x8632::mm1))
1156 ;; set header
1157 (movl (:$l x8632::one-digit-bignum-header) (:%l imm))
1158 (movd (:%l imm) (:%mmx x8632::mm0))
1159 ;; need 8 bytes of aligned memory for 1 digit bignum
1160 (movl (:$l (- 8 x8632::fulltag-misc)) (:%l imm))
1161 (subl (:%l imm) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
1162 (movl (:@ (:%seg :rcontext) x8632::tcr.save-allocptr) (:%l freeptr))
1163 (rcmpl (:%l freeptr) (:@ (:%seg :rcontext) x8632::tcr.save-allocbase))
1164 (ja :no-trap)
1165 (uuo-alloc)
1166 :no-trap
1167 (movd (:%mmx x8632::mm0) (:@ x8632::misc-header-offset (:%l freeptr)))
1168 (andb (:$b (lognot x8632::fulltagmask)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
1169 ((:not (:pred = freeptr
1170 (:apply %hard-regspec-value val)))
1171 (movl (:%l freeptr) (:%l val)))
1172 (movd (:%mmx x8632::mm1) (:@ x8632::misc-data-offset (:%l val)))
1173 (jmp no-overflow))
1174
1175
[7428]1176(define-x8632-vinsn set-bigits-after-fixnum-overflow (()
1177 ((bignum :lisp)))
1178 (movd (:%mmx x8632::mm1) (:@ x8632::misc-data-offset (:%l bignum))))
1179
1180
[7222]1181(define-x8632-vinsn %set-z-flag-if-s32-fits-in-fixnum (((dest :imm))
1182 ((src :s32))
1183 ((temp :s32)))
1184 (movl (:%l src) (:%l temp))
1185 (shll (:$ub x8632::fixnumshift) (:%l temp))
1186 (movl (:%l temp) (:%l dest)) ; tagged as a fixnum
1187 (sarl (:$ub x8632::fixnumshift) (:%l temp))
1188 (cmpl (:%l src) (:%l temp)))
1189
1190(define-x8632-vinsn %set-z-flag-if-u32-fits-in-fixnum (((dest :imm))
1191 ((src :u32))
1192 ((temp :u32)))
1193 (movl (:%l src) (:%l temp))
1194 (shll (:$ub (1+ x8632::fixnumshift)) (:%l temp))
1195 (movl (:%l temp) (:%l dest)) ; tagged as an even fixnum
1196 (shrl (:$ub (1+ x8632::fixnumshift)) (:%l temp))
1197 (shrl (:%l dest))
1198 (cmpl (:%l src) (:%l temp))
1199 :done)
1200
1201;;; setup-bignum-alloc-for-s32-overflow
1202;;; setup-bignum-alloc-for-u32-overflow
1203
[7286]1204(define-x8632-vinsn setup-uvector-allocation (()
1205 ((header :imm)))
1206 (movd (:%l header) (:%mmx x8632::mm0)))
1207
1208;;; The code that runs in response to the uuo-alloc
1209;;; expects a header in mm0, and a size in imm0.
1210;;; mm0 is an implicit arg (it contains the uvector header)
1211;;; size is actually an arg, not a temporary,
[7222]1212;;; but it appears that there's isn't a way to enforce
1213;;; register usage on vinsn args.
[7251]1214(define-x8632-vinsn %allocate-uvector (((dest :lisp))
[7286]1215 ()
1216 ((size (:u32 #.x8632::imm0))
1217 (freeptr (:lisp #.x8632::allocptr))))
[7251]1218 (subl (:%l size) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
1219 (movl (:@ (:%seg :rcontext) x8632::tcr.save-allocptr) (:%l freeptr))
1220 (rcmpl (:%l freeptr) (:@ (:%seg :rcontext) x8632::tcr.save-allocbase))
[11556]1221 (ja :no-trap)
[7251]1222 (uuo-alloc)
1223 :no-trap
[7286]1224 (movd (:%mmx x8632::mm0) (:@ x8632::misc-header-offset (:%l freeptr)))
[7251]1225 (andb (:$b (lognot x8632::fulltagmask)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
1226 ((:not (:pred = freeptr
1227 (:apply %hard-regspec-value dest)))
1228 (movl (:%l freeptr) (:%l dest))))
[7222]1229
1230(define-x8632-vinsn box-fixnum (((dest :imm))
1231 ((src :s32)))
1232 ;;(imull (:$b x8632::fixnumone) (:%l src) (:%l dest))
1233 (leal (:@ (:%l src) x8632::fixnumone) (:%l dest)))
1234
[7251]1235(define-x8632-vinsn (fix-fixnum-overflow-ool :call)
1236 (((val :lisp))
1237 ((val :lisp))
[9376]1238 ((unboxed (:s32 #.x8632::imm0))
1239 ;; we use %mm0 for header in subprim
[7251]1240 (entry (:label 1))))
[9692]1241 (jno :done)
[7251]1242 ((:not (:pred = x8632::arg_z
1243 (:apply %hard-regspec-value val)))
1244 (movl (:%l val) (:%l x8632::arg_z)))
1245 (:talign 5)
1246 (call (:@ .SPfix-overflow))
1247 (movl (:$self 0) (:%l x8632::fn))
1248 ((:not (:pred = x8632::arg_z
1249 (:apply %hard-regspec-value val)))
1250 (movl (:%l x8632::arg_z) (:%l val)))
1251 :done)
[7222]1252
1253(define-x8632-vinsn (fix-fixnum-overflow-ool-and-branch :call)
1254 (((val :lisp))
1255 ((val :lisp)
1256 (lab :label))
[9376]1257 ((unboxed (:s32 #.x8632::imm0))
1258 ;; we use %mm0 for header in subprim
[7222]1259 (entry (:label 1))))
[9692]1260 (jno lab)
[7222]1261 ((:not (:pred = x8632::arg_z
1262 (:apply %hard-regspec-value val)))
1263 (movl (:%l val) (:%l x8632::arg_z)))
1264 (:talign 5)
1265 (call (:@ .SPfix-overflow))
1266 (movl (:$self 0) (:%l x8632::fn))
1267 ((:not (:pred = x8632::arg_z
1268 (:apply %hard-regspec-value val)))
1269 (movl (:%l x8632::arg_z) (:%l val)))
1270 (jmp lab))
1271
[15411]1272(define-x8632-vinsn return-or-fix-overflow (()
1273 ())
1274 (jo :fix)
1275 (:byte #xf3) (ret)
1276 :fix
1277 (jmp (:@ .SPfix-overflow)))
[7222]1278
1279(define-x8632-vinsn add-constant (((dest :imm))
1280 ((dest :imm)
1281 (const :s32const)))
1282 ((:and (:pred >= const -128) (:pred <= const 127))
1283 (addl (:$b const) (:%l dest)))
1284 ((:not (:and (:pred >= const -128) (:pred <= const 127)))
1285 (addl (:$l const) (:%l dest))))
1286
1287(define-x8632-vinsn add-constant3 (((dest :imm))
1288 ((src :imm)
1289 (const :s32const)))
1290 ((:pred = (:apply %hard-regspec-value dest)
1291 (:apply %hard-regspec-value src))
1292 ((:and (:pred >= const -128) (:pred <= const 127))
1293 (addl (:$b const) (:%l dest)))
1294 ((:not (:and (:pred >= const -128) (:pred <= const 127)))
1295 (addl (:$l const) (:%l dest))))
1296 ((:not (:pred = (:apply %hard-regspec-value dest)
1297 (:apply %hard-regspec-value src)))
1298 (leal (:@ const (:%l src)) (:%l dest))))
1299
1300(define-x8632-vinsn fixnum-add2 (((dest :imm))
1301 ((dest :imm)
1302 (other :imm)))
1303 (addl (:%l other) (:%l dest)))
1304
1305(define-x8632-vinsn fixnum-sub2 (((dest :imm))
1306 ((x :imm)
1307 (y :imm))
1308 ((temp :imm)))
[15347]1309 ((:pred = (:apply %hard-regspec-value x) (:apply %hard-regspec-value dest))
1310 (subl (:%l y) (:%l dest)))
1311 ((:not (:pred = (:apply %hard-regspec-value x) (:apply %hard-regspec-value dest)))
1312 ((:pred = (:apply %hard-regspec-value y) (:apply %hard-regspec-value dest))
1313 (movl (:%l x) (:%l temp))
1314 (subl (:%l y) (:%l temp))
1315 (movl (:%l temp) (:%l dest)))
1316 ((:not (:pred = (:apply %hard-regspec-value y) (:apply %hard-regspec-value dest)))
1317 (movl (:%l x) (:%l dest))
1318 (subl (:%l y) (:%l dest)))))
[7222]1319
1320(define-x8632-vinsn fixnum-add3 (((dest :imm))
1321 ((x :imm)
1322 (y :imm)))
1323
1324 ((:pred =
1325 (:apply %hard-regspec-value x)
1326 (:apply %hard-regspec-value dest))
1327 (addl (:%l y) (:%l dest)))
1328 ((:not (:pred =
1329 (:apply %hard-regspec-value x)
1330 (:apply %hard-regspec-value dest)))
1331 ((:pred =
1332 (:apply %hard-regspec-value y)
1333 (:apply %hard-regspec-value dest))
1334 (addl (:%l x) (:%l dest)))
1335 ((:not (:pred =
1336 (:apply %hard-regspec-value y)
1337 (:apply %hard-regspec-value dest)))
1338 (leal (:@ (:%l x) (:%l y)) (:%l dest)))))
1339
1340(define-x8632-vinsn copy-gpr (((dest t))
1341 ((src t)))
1342 ((:not (:pred =
1343 (:apply %hard-regspec-value dest)
1344 (:apply %hard-regspec-value src)))
1345 (movl (:%l src) (:%l dest))))
1346
1347(define-x8632-vinsn (vpop-register :pop :node :vsp)
1348 (((dest :lisp))
1349 ())
1350 (popl (:%l dest)))
1351
1352(define-x8632-vinsn (push-argregs :push :node :vsp) (()
[8367]1353 ())
1354 (rcmpl (:%l x8632::nargs) (:$b (* 1 x8632::node-size)))
[7222]1355 (jb :done)
1356 (je :one)
1357 (pushl (:%l x8632::arg_y))
1358 :one
1359 (pushl (:%l x8632::arg_z))
1360 :done)
1361
1362(define-x8632-vinsn (push-max-argregs :push :node :vsp) (()
1363 ((max :u32const)))
1364 ((:pred >= max 2)
[8367]1365 (rcmpl (:%l x8632::nargs) (:$b (* 1 x8632::node-size)))
[7222]1366 (jb :done)
1367 (je :one)
1368 (pushl (:%l x8632::arg_y))
1369 :one
1370 (pushl (:%l x8632::arg_z))
1371 :done)
1372 ((:pred = max 1)
[8367]1373 (testl (:%l x8632::nargs) (:%l x8632::nargs))
[7222]1374 (je :done)
1375 (pushl (:%l x8632::arg_z))
1376 :done))
1377
1378(define-x8632-vinsn (call-label :call) (()
1379 ((label :label))
1380 ((entry (:label 1))))
1381 (:talign 5)
1382 (call label)
1383 (movl (:$self 0) (:%l x8632::fn)))
1384
1385(define-x8632-vinsn double-float-compare (()
1386 ((arg0 :double-float)
1387 (arg1 :double-float)))
1388 (comisd (:%xmm arg1) (:%xmm arg0)))
1389
1390(define-x8632-vinsn single-float-compare (()
1391 ((arg0 :single-float)
1392 (arg1 :single-float)))
1393 (comiss (:%xmm arg1) (:%xmm arg0)))
1394
1395(define-x8632-vinsn double-float+-2 (((result :double-float))
1396 ((x :double-float)
1397 (y :double-float)))
1398 ((:pred =
1399 (:apply %hard-regspec-value result)
1400 (:apply %hard-regspec-value x))
1401 (addsd (:%xmm y) (:%xmm result)))
1402 ((:and (:not (:pred =
1403 (:apply %hard-regspec-value result)
1404 (:apply %hard-regspec-value x)))
1405 (:pred =
1406 (:apply %hard-regspec-value result)
1407 (:apply %hard-regspec-value y)))
1408 (addsd (:%xmm x) (:%xmm result)))
1409 ((:and (:not (:pred =
1410 (:apply %hard-regspec-value result)
1411 (:apply %hard-regspec-value x)))
1412 (:not (:pred =
1413 (:apply %hard-regspec-value result)
1414 (:apply %hard-regspec-value y))))
1415 (movsd (:%xmm x) (:%xmm result))
1416 (addsd (:%xmm y) (:%xmm result))))
1417
1418;;; Caller guarantees (not (eq y result))
1419(define-x8632-vinsn double-float--2 (((result :double-float))
1420 ((x :double-float)
1421 (y :double-float)))
1422 ((:not (:pred = (:apply %hard-regspec-value result)
1423 (:apply %hard-regspec-value x)))
1424 (movsd (:%xmm x) (:%xmm result)))
1425 (subsd (:%xmm y) (:%xmm result)))
1426
1427(define-x8632-vinsn double-float*-2 (((result :double-float))
1428 ((x :double-float)
1429 (y :double-float)))
1430 ((:pred =
1431 (:apply %hard-regspec-value result)
1432 (:apply %hard-regspec-value x))
1433 (mulsd (:%xmm y) (:%xmm result)))
1434 ((:and (:not (:pred =
1435 (:apply %hard-regspec-value result)
1436 (:apply %hard-regspec-value x)))
1437 (:pred =
1438 (:apply %hard-regspec-value result)
1439 (:apply %hard-regspec-value y)))
1440 (mulsd (:%xmm x) (:%xmm result)))
1441 ((:and (:not (:pred =
1442 (:apply %hard-regspec-value result)
1443 (:apply %hard-regspec-value x)))
1444 (:not (:pred =
1445 (:apply %hard-regspec-value result)
1446 (:apply %hard-regspec-value y))))
1447 (movsd (:%xmm x) (:%xmm result))
1448 (mulsd (:%xmm y) (:%xmm result))))
1449
1450;;; Caller guarantees (not (eq y result))
1451(define-x8632-vinsn double-float/-2 (((result :double-float))
1452 ((x :double-float)
1453 (y :double-float)))
1454 ((:not (:pred = (:apply %hard-regspec-value result)
1455 (:apply %hard-regspec-value x)))
1456 (movsd (:%xmm x) (:%xmm result)))
1457 (divsd (:%xmm y) (:%xmm result)))
1458
1459(define-x8632-vinsn single-float+-2 (((result :single-float))
1460 ((x :single-float)
1461 (y :single-float)))
1462 ((:pred =
1463 (:apply %hard-regspec-value result)
1464 (:apply %hard-regspec-value x))
1465 (addss (:%xmm y) (:%xmm result)))
1466 ((:and (:not (:pred =
1467 (:apply %hard-regspec-value result)
1468 (:apply %hard-regspec-value x)))
1469 (:pred =
1470 (:apply %hard-regspec-value result)
1471 (:apply %hard-regspec-value y)))
1472 (addss (:%xmm x) (:%xmm result)))
1473 ((:and (:not (:pred =
1474 (:apply %hard-regspec-value result)
1475 (:apply %hard-regspec-value x)))
1476 (:not (:pred =
1477 (:apply %hard-regspec-value result)
1478 (:apply %hard-regspec-value y))))
1479 (movss (:%xmm x) (:%xmm result))
1480 (addss (:%xmm y) (:%xmm result))))
1481
1482;;; Caller guarantees (not (eq y result))
1483(define-x8632-vinsn single-float--2 (((result :single-float))
1484 ((x :single-float)
1485 (y :single-float)))
1486 ((:not (:pred = (:apply %hard-regspec-value result)
1487 (:apply %hard-regspec-value x)))
1488 (movss (:%xmm x) (:%xmm result)))
1489 (subss (:%xmm y) (:%xmm result)))
1490
1491(define-x8632-vinsn single-float*-2 (((result :single-float))
1492 ((x :single-float)
1493 (y :single-float)))
1494 ((:pred =
1495 (:apply %hard-regspec-value result)
1496 (:apply %hard-regspec-value x))
1497 (mulss (:%xmm y) (:%xmm result)))
1498 ((:and (:not (:pred =
1499 (:apply %hard-regspec-value result)
1500 (:apply %hard-regspec-value x)))
1501 (:pred =
1502 (:apply %hard-regspec-value result)
1503 (:apply %hard-regspec-value y)))
1504 (mulss (:%xmm x) (:%xmm result)))
1505 ((:and (:not (:pred =
1506 (:apply %hard-regspec-value result)
1507 (:apply %hard-regspec-value x)))
1508 (:not (:pred =
1509 (:apply %hard-regspec-value result)
1510 (:apply %hard-regspec-value y))))
1511 (movss (:%xmm x) (:%xmm result))
1512 (mulss (:%xmm y) (:%xmm result))))
1513
1514;;; Caller guarantees (not (eq y result))
1515(define-x8632-vinsn single-float/-2 (((result :single-float))
1516 ((x :single-float)
1517 (y :single-float)))
1518 ((:not (:pred = (:apply %hard-regspec-value result)
1519 (:apply %hard-regspec-value x)))
1520 (movss (:%xmm x) (:%xmm result)))
1521 (divss (:%xmm y) (:%xmm result)))
1522
1523(define-x8632-vinsn get-single (((result :single-float))
1524 ((source :lisp)))
1525 (movss (:@ x8632::single-float.value (:%l source)) (:%xmm result)))
1526
1527(define-x8632-vinsn get-double (((result :double-float))
1528 ((source :lisp)))
1529 (movsd (:@ x8632::double-float.value (:%l source)) (:%xmm result)))
1530
1531;;; Extract a double-float value, typechecking in the process.
1532;;; IWBNI we could simply call the "trap-unless-typecode=" vinsn here,
1533;;; instead of replicating it ..
[11862]1534(define-x8632-vinsn get-double? (((target :double-float))
1535 ((source :lisp))
1536 ((tag :u8)))
1537 :resume
1538 (movl (:%l source) (:%l tag))
1539 ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
1540 (andl (:$b x8632::tagmask) (:%accl tag))
1541 (cmpl (:$b x8632::tag-misc) (:%accl tag)))
1542 ((:pred > (:apply %hard-regspec-value tag) x8632::eax)
1543 (andl (:$b x8632::tagmask) (:%l tag))
1544 (cmpl (:$b x8632::tag-misc) (:%l tag)))
1545 (jne :have-tag)
1546 (movsbl (:@ x8632::misc-subtag-offset (:%l source)) (:%l tag))
1547 :have-tag
1548 (cmpl (:$b x8632::subtag-double-float) (:%l tag))
1549 (jne :bad)
1550 (movsd (:@ x8632::double-float.value (:%l source)) (:%xmm target))
[7222]1551
[11862]1552 (:anchored-uuo-section :resume)
1553 :bad
1554 (:anchored-uuo (uuo-error-reg-not-tag (:%q source) (:$ub x8632::subtag-double-float))))
[7659]1555
1556(define-x8632-vinsn copy-double-float (((dest :double-float))
1557 ((src :double-float)))
1558 (movsd (:%xmm src) (:%xmm dest)))
1559
[7222]1560(define-x8632-vinsn copy-single-float (((dest :single-float))
1561 ((src :single-float)))
1562 (movss (:%xmm src) (:%xmm dest)))
1563
1564(define-x8632-vinsn copy-single-to-double (((dest :double-float))
1565 ((src :single-float)))
1566 (cvtss2sd (:%xmm src) (:%xmm dest)))
1567
1568(define-x8632-vinsn copy-double-to-single (((dest :single-float))
1569 ((src :double-float)))
1570 (cvtsd2ss (:%xmm src) (:%xmm dest)))
1571
[9587]1572;;; these two clobber unboxed0, unboxed1 in tcr
1573;;; (There's no way to move a value from the x87 stack to an xmm register,
1574;;; so we have to go through memory.)
1575(define-x8632-vinsn fp-stack-to-single (((dest :single-float))
1576 ())
1577 (fstps (:@ (:%seg :rcontext) x8632::tcr.unboxed0))
1578 (movss (:@ (:%seg :rcontext) x8632::tcr.unboxed0) (:%xmm dest)))
1579
1580(define-x8632-vinsn fp-stack-to-double (((dest :double-float))
1581 ())
1582 (fstpl (:@ (:%seg :rcontext) x8632::tcr.unboxed0))
1583 (movsd (:@ (:%seg :rcontext) x8632::tcr.unboxed0) (:%xmm dest)))
1584
[7222]1585(define-x8632-vinsn fitvals (()
1586 ((n :u16const))
[8367]1587 ((imm :u32)))
[7222]1588 ((:pred = n 0)
1589 (xorl (:%l imm) (:%l imm)))
1590 ((:not (:pred = n 0))
[8367]1591 (movl (:$l (:apply ash n x8632::fixnumshift)) (:%l imm)))
1592 (subl (:%l x8632::nargs) (:%l imm))
[7222]1593 (jae :push-more)
1594 (subl (:%l imm) (:%l x8632::esp))
1595 (jmp :done)
1596 :push-loop
[10984]1597 (pushl (:$l (:apply target-nil-value)))
[8367]1598 (addl (:$b x8632::node-size) (:%l x8632::nargs))
1599 (subl (:$b x8632::node-size) (:%l imm))
[7222]1600 :push-more
1601 (jne :push-loop)
1602 :done)
1603
1604(define-x8632-vinsn (nvalret :jumpLR) (()
1605 ())
1606 (jmp (:@ .SPnvalret)))
1607
1608(define-x8632-vinsn lisp-word-ref (((dest t))
1609 ((base t)
1610 (offset t)))
1611 (movl (:@ (:%l base) (:%l offset)) (:%l dest)))
1612
1613(define-x8632-vinsn lisp-word-ref-c (((dest t))
1614 ((base t)
1615 (offset :s32const)))
1616 ((:pred = offset 0)
1617 (movl (:@ (:%l base)) (:%l dest)))
1618 ((:not (:pred = offset 0))
1619 (movl (:@ offset (:%l base)) (:%l dest))))
1620
1621;; start-mv-call
1622
[7339]1623(define-x8632-vinsn (vpush-label :push :node :vsp) (()
[8629]1624 ((label :label))
1625 ((temp :lisp)))
1626 (leal (:@ (:^ label) (:%l x8632::fn)) (:%l temp))
1627 (pushl (:%l temp)))
[7339]1628
[15606]1629(define-x8632-vinsn (emit-aligned-label :align) (()
1630 ((label :label)))
[8233]1631 ;; We don't care about label.
1632 ;; We just want the label following this stuff to be tra-tagged.
[7222]1633 (:align 3)
[8629]1634 (nop) (nop) (nop) (nop) (nop))
[7222]1635
1636;; pass-multiple-values-symbol
[7339]1637;;; %ra0 is pointing into %fn, so no need to copy %fn here.
1638(define-x8632-vinsn pass-multiple-values-symbol (()
1639 ())
[10984]1640 (pushl (:@ (:apply + (:apply target-nil-value) (x8632::%kernel-global 'x86::ret1valaddr))))
[7339]1641 (jmp (:@ x8632::symbol.fcell (:% x8632::fname))))
1642
1643
[7428]1644;;; It'd be good to have a variant that deals with a known function
1645;;; as well as this.
1646(define-x8632-vinsn pass-multiple-values (()
1647 ()
1648 ((tag :u8)))
[10495]1649 :resume
[11030]1650 (movl (:%l x8632::temp0) (:%l tag))
1651 (andl (:$b x8632::tagmask) (:%l tag))
1652 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7428]1653 (jne :bad)
[11030]1654 (movsbl (:@ x8632::misc-subtag-offset (:%l x8632::temp0)) (:%l tag))
1655 (cmpl (:$b x8632::subtag-function) (:%l tag))
[7428]1656 (cmovel (:%l x8632::temp0) (:%l x8632::fn))
1657 (je :go)
[11030]1658 (cmpl (:$b x8632::subtag-symbol) (:%l tag))
[7428]1659 (cmovel (:@ x8632::symbol.fcell (:%l x8632::fname)) (:%l x8632::fn))
1660 (jne :bad)
1661 :go
[10984]1662 (pushl (:@ (:apply + (:apply target-nil-value) (x8632::%kernel-global 'x86::ret1valaddr))))
[7428]1663 (jmp (:%l x8632::fn))
[10495]1664 (:anchored-uuo-section :resume)
[7428]1665 :bad
[10495]1666 (:anchored-uuo (uuo-error-not-callable))
[7428]1667)
[7222]1668
[14969]1669(define-x8632-vinsn (pass-multiple-values-known-function :jumplr) (((fnreg :lisp))
1670 ())
1671 (pushl (:@ (:apply + (:apply target-nil-value) (x8632::%kernel-global 'x86::ret1valaddr))))
1672 (jmp (:%l fnreg)))
[7428]1673
[14969]1674
[7222]1675(define-x8632-vinsn reserve-outgoing-frame (()
1676 ())
1677 (pushl (:$b x8632::reserved-frame-marker))
1678 (pushl (:$b x8632::reserved-frame-marker)))
1679
1680;; implicit temp0 arg
1681(define-x8632-vinsn (call-known-function :call) (()
1682 ()
1683 ((entry (:label 1))))
1684 (:talign 5)
1685 (call (:%l x8632::temp0))
1686 (movl (:$self 0) (:%l x8632::fn)))
1687
[7286]1688(define-x8632-vinsn (jump-known-function :jumplr) (()
1689 ())
[8902]1690 (jmp (:%l x8632::temp0)))
[7286]1691
1692(define-x8632-vinsn (list :call) (()
1693 ()
[8902]1694 ((entry (:label 1))
1695 (temp (:lisp #.x8632::temp0))))
1696 (leal (:@ (:^ :back) (:%l x8632::fn)) (:%l x8632::temp0))
[7286]1697 (:talign 5)
[8902]1698 (jmp (:@ .SPconslist))
[7286]1699 :back
1700 (movl (:$self 0) (:%l x8632::fn)))
1701
[7428]1702(define-x8632-vinsn make-fixed-stack-gvector (((dest :lisp))
1703 ((aligned-size :u32const)
1704 (header :s32const))
1705 ((tempa :imm)
1706 (tempb :imm)))
1707 ((:and (:pred >= (:apply + aligned-size x8632::dnode-size) -128)
1708 (:pred <= (:apply + aligned-size x8632::dnode-size) 127))
1709 (subl (:$b (:apply + aligned-size x8632::dnode-size))
1710 (:@ (:%seg :rcontext) x8632::tcr.next-tsp)))
1711 ((:not (:and (:pred >= (:apply + aligned-size x8632::dnode-size) -128)
1712 (:pred <= (:apply + aligned-size x8632::dnode-size) 127)))
1713 (subl (:$l (:apply + aligned-size x8632::dnode-size))
1714 (:@ (:%seg :rcontext) x8632::tcr.next-tsp)))
1715 (movl (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%l tempb))
1716 (movl (:@ (:%seg :rcontext) x8632::tcr.next-tsp) (:%l tempa))
1717 (movd (:%l tempb) (:%mmx x8632::stack-temp))
1718 :loop
[9123]1719 (movsd (:%xmm x8632::fpzero) (:@ -8 (:%l tempb)))
[7428]1720 (subl (:$b x8632::dnode-size) (:%l tempb))
1721 (cmpl (:%l tempa) (:%l tempb))
1722 (jnz :loop)
1723 (movd (:%mmx x8632::stack-temp) (:@ (:%l tempa)))
1724 (movl (:%l tempa) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
1725 (movl (:$l header) (:@ x8632::dnode-size (:%l tempa)))
1726 (leal (:@ (+ x8632::dnode-size x8632::fulltag-misc) (:%l tempa)) (:%l dest)))
1727
1728
1729
[7431]1730
[7428]1731(define-x8632-vinsn make-tsp-vcell (((dest :lisp))
1732 ((closed :lisp))
1733 ((temp :imm)))
1734 (subl (:$b (+ x8632::value-cell.size x8632::dnode-size)) (:@ (:%seg :rcontext) x8632::tcr.next-tsp))
1735 (movd (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%mmx x8632::stack-temp))
1736 (movl (:@ (:%seg :rcontext) x8632::tcr.next-tsp) (:%l temp))
[9123]1737 (movsd (:%xmm x8632::fpzero) (:@ (:%l temp)))
1738 (movsd (:%xmm x8632::fpzero) (:@ x8632::dnode-size (:%l temp)))
[7428]1739 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
1740 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
1741 (movl (:$l x8632::value-cell-header) (:@ x8632::dnode-size (:%l temp)))
1742 (movl (:%l closed) (:@ (+ x8632::dnode-size x8632::node-size) (:%l temp)))
1743 (leal (:@ (+ x8632::dnode-size x8632::fulltag-misc) (:%l temp)) (:%l dest)))
1744
[7286]1745(define-x8632-vinsn make-tsp-cons (((dest :lisp))
1746 ((car :lisp) (cdr :lisp))
1747 ((temp :imm)))
1748 (subl (:$b (+ x8632::cons.size x8632::dnode-size)) (:@ (:%seg :rcontext) x8632::tcr.next-tsp))
1749 (movl (:@ (:%seg :rcontext) x8632::tcr.next-tsp) (:%l temp))
1750 (movq (:%xmm x8632::fpzero) (:@ (:%l temp)))
1751 (movq (:%xmm x8632::fpzero) (:@ 8 (:%l temp)))
1752 (movd (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%mmx x8632::stack-temp))
1753 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
1754 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
1755 (leal (:@ (+ x8632::dnode-size x8632::fulltag-cons) (:%l temp)) (:%l temp))
1756 (movl (:%l car) (:@ x8632::cons.car (:%l temp)))
1757 (movl (:%l cdr) (:@ x8632::cons.cdr (:%l temp)))
1758 (movl (:%l temp) (:%l dest)))
1759
1760
[7222]1761;; make-fixed-stack-gvector
1762
[11290]1763(define-x8632-vinsn (discard-temp-frame :tsp :pop :discard) (()
1764 ()
1765 ((temp :imm)))
[7222]1766 (movl (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%l temp))
1767 (movl (:@ (:%l temp)) (:%l temp))
1768 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
1769 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.next-tsp))
1770 )
1771
[11290]1772(define-x8632-vinsn (discard-c-frame :csp :pop :discard) (()
1773 ()
1774 ((temp :imm)))
[7222]1775 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
1776 (movl (:@ (:%l temp)) (:%l temp))
1777 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
1778
1779
[11290]1780(define-x8632-vinsn (vstack-discard :vsp :pop :discard) (()
[7222]1781 ((nwords :u32const)))
1782 ((:not (:pred = nwords 0))
1783 ((:pred < nwords 16)
1784 (addl (:$b (:apply ash nwords x8632::word-shift)) (:%l x8632::esp)))
1785 ((:not (:pred < nwords 16))
1786 (addl (:$l (:apply ash nwords x8632::word-shift)) (:%l x8632::esp)))))
1787
[7286]1788(defmacro define-x8632-subprim-lea-jmp-vinsn ((name &rest other-attrs) spno)
[9678]1789 `(define-x8632-vinsn (,name :call :subprim-call ,@other-attrs) (()
1790 ()
1791 ((entry (:label 1))
1792 (ra (:lisp #.x8632::ra0))))
1793 (leal (:@ (:^ :back) (:%l x8632::fn)) (:%l ra))
[7286]1794 (:talign 5)
1795 (jmp (:@ ,spno))
1796 :back
1797 (movl (:$self 0) (:%l x8632::fn))))
1798
[7222]1799(defmacro define-x8632-subprim-call-vinsn ((name &rest other-attrs) spno)
1800 `(define-x8632-vinsn (,name :call :subprim-call ,@other-attrs) (() () ((entry (:label 1))))
1801 (:talign 5)
1802 (call (:@ ,spno))
1803 :back
1804 (movl (:$self 0) (:%l x8632::fn))))
1805
1806(defmacro define-x8632-subprim-jump-vinsn ((name &rest other-attrs) spno)
[10339]1807 `(define-x8632-vinsn (,name :jumpLR ,@other-attrs) (() ())
[7222]1808 (jmp (:@ ,spno))))
1809
[7286]1810(define-x8632-vinsn (nthrowvalues :call :subprim-call) (()
[9678]1811 ((lab :label))
1812 ((ra (:lisp #.x8632::ra0))))
1813 (leal (:@ (:^ lab) (:%l x8632::fn)) (:%l ra))
[7286]1814 (jmp (:@ .SPnthrowvalues)))
[7222]1815
[7286]1816(define-x8632-vinsn (nthrow1value :call :subprim-call) (()
[9678]1817 ((lab :label))
1818 ((ra (:lisp #.x8632::ra0))))
1819 (leal (:@ (:^ lab) (:%l x8632::fn)) (:%l ra))
[7286]1820 (jmp (:@ .SPnthrow1value)))
[7222]1821
[7659]1822(define-x8632-vinsn set-single-c-arg (()
1823 ((arg :single-float)
[9265]1824 (offset :u32const))
1825 ((temp :imm)))
1826 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]1827 (movss (:%xmm arg) (:@ (:apply + 8 (:apply ash offset 2)) (:%l temp))))
[7659]1828
1829(define-x8632-vinsn reload-single-c-arg (((arg :single-float))
[9265]1830 ((offset :u32const))
1831 ((temp :imm)))
1832 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]1833 (movss (:@ (:apply + 8 (:apply ash offset 2)) (:%l temp)) (:%xmm arg)))
[7659]1834
1835(define-x8632-vinsn set-double-c-arg (()
1836 ((arg :double-float)
[9265]1837 (offset :u32const))
1838 ((temp :imm)))
1839 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]1840 (movsd (:%xmm arg) (:@ (:apply + 8 (:apply ash offset 2)) (:%l temp))))
[7659]1841
1842(define-x8632-vinsn reload-double-c-arg (((arg :double-float))
[9265]1843 ((offset :u32const))
1844 ((temp :imm)))
1845 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]1846 (movsd (:@ (:apply + 8 (:apply ash offset 2)) (:%l temp)) (:%xmm arg)))
[7659]1847
[10739]1848;;; .SPffcall has stored %edx in tcr.unboxed1. Load %mm0 with a
1849;;; 64-bit value composed from %edx:%eax.
1850(define-x8632-vinsn get-64-bit-ffcall-result (()
1851 ())
1852 (movl (:%l x8632::eax) (:@ (:%seg :rcontext) x8632::tcr.unboxed0))
[11046]1853 (movq (:@ (:%seg :rcontext) x8632::tcr.unboxed0) (:%mmx x8632::mm0)))
[10739]1854
[7659]1855(define-x8632-subprim-call-vinsn (ff-call) .SPffcall)
1856
[8750]1857(define-x8632-subprim-call-vinsn (syscall) .SPsyscall)
1858
[8834]1859(define-x8632-subprim-call-vinsn (syscall2) .SPsyscall2)
1860
[9561]1861(define-x8632-subprim-call-vinsn (setqsym) .SPsetqsym)
1862
[8858]1863(define-x8632-subprim-call-vinsn (gets32) .SPgets32)
1864
1865(define-x8632-subprim-call-vinsn (getu32) .SPgetu32)
1866
[8629]1867(define-x8632-subprim-call-vinsn (gets64) .SPgets64)
1868
1869(define-x8632-subprim-call-vinsn (getu64) .SPgetu64)
1870
1871(define-x8632-subprim-call-vinsn (makes64) .SPmakes64)
1872
1873(define-x8632-subprim-call-vinsn (makeu64) .SPmakeu64)
1874
[7659]1875(define-x8632-subprim-lea-jmp-vinsn (stack-cons-list*) .SPstkconslist-star)
1876
[7431]1877(define-x8632-subprim-lea-jmp-vinsn (list*) .SPconslist-star)
1878
[7286]1879(define-x8632-subprim-lea-jmp-vinsn (bind-interrupt-level-0) .SPbind-interrupt-level-0)
[7222]1880
[7286]1881(define-x8632-vinsn bind-interrupt-level-0-inline (()
1882 ()
1883 ((temp :imm)))
1884 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l temp))
1885 (cmpl (:$b 0) (:@ x8632::interrupt-level-binding-index (:%l temp)))
1886 (pushl (:@ x8632::interrupt-level-binding-index (:%l temp)))
1887 (pushl (:$b x8632::interrupt-level-binding-index))
1888 (pushl (:@ (:%seg :rcontext) x8632::tcr.db-link))
1889 (movl (:$l 0) (:@ x8632::interrupt-level-binding-index (:%l temp)))
1890 (movl (:%l x8632::esp) (:@ (:%seg :rcontext) x8632::tcr.db-link))
[9692]1891 (jns :done)
[7286]1892 (btrl (:$ub 31) (:@ (:%seg :rcontext) x8632::tcr.interrupt-pending))
[9692]1893 (jae :done)
[7286]1894 (ud2a)
1895 (:byte 2)
1896 :done)
[7222]1897
[7659]1898(define-x8632-vinsn bind-interrupt-level-m1-inline (()
1899 ()
1900 ((temp :imm)))
1901 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l temp))
1902 (pushl (:@ x8632::interrupt-level-binding-index (:%l temp)))
1903 (pushl (:$b x8632::interrupt-level-binding-index))
1904 (pushl (:@ (:%seg :rcontext) x8632::tcr.db-link))
1905 (movl (:$l (ash -1 x8632::fixnumshift)) (:@ x8632::interrupt-level-binding-index (:%l temp)))
1906 (movl (:%l x8632::esp) (:@ (:%seg :rcontext) x8632::tcr.db-link)))
1907
[7339]1908(define-x8632-subprim-lea-jmp-vinsn (bind-interrupt-level-m1) .SPbind-interrupt-level-m1)
1909
1910(define-x8632-subprim-lea-jmp-vinsn (bind-interrupt-level) .SPbind-interrupt-level)
1911
1912(define-x8632-subprim-call-vinsn (unbind-interrupt-level) .SPunbind-interrupt-level)
1913
[8902]1914#||
[7659]1915(define-x8632-vinsn unbind-interrupt-level-inline (()
1916 ()
1917 ((link :imm)
1918 (curval :imm)
1919 (oldval :imm)
1920 (tlb :imm)))
1921 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l tlb))
1922 (movl (:@ (:%seg :rcontext) x8632::tcr.db-link) (:%l link))
1923 (movl (:@ x8632::interrupt-level-binding-index (:%l tlb)) (:%l curval))
1924 (testl (:%l curval) (:%l curval))
[8875]1925 (movl (:@ 8 #|binding.val|# (:%l link)) (:%l oldval))
[7659]1926 (movl (:@ #|binding.link|# (:%l link)) (:%l link))
1927 (movl (:%l oldval) (:@ x8632::interrupt-level-binding-index (:%l tlb)))
1928 (movl (:%l link) (:@ (:%seg :rcontext) x8632::tcr.db-link))
[9692]1929 (jns :done)
[7659]1930 (testl (:%l oldval) (:%l oldval))
[9692]1931 (js :done)
[7659]1932 (btrl (:$ub 31) (:@ (:%seg :rcontext) x8632::tcr.interrupt-pending))
[9692]1933 (jae :done)
[7659]1934 (ud2a)
1935 (:byte 2)
1936 :done)
[8902]1937||#
[7659]1938
[7428]1939(define-x8632-vinsn (jump-return-pc :jumpLR) (()
1940 ())
1941 (ret))
1942
[7360]1943;;; xxx
1944(define-x8632-vinsn (nmkcatchmv :call :subprim-call) (()
1945 ((lab :label))
1946 ((entry (:label 1))
1947 (xfn (:lisp #.x8632::xfn))))
1948 (leal (:@ (:^ lab) (:%l x8632::fn)) (:%l xfn))
1949 (:talign 5)
1950 (call (:@ .SPmkcatchmv))
1951 :back
1952 (movl (:$self 0) (:%l x8632::fn)))
1953
[7428]1954(define-x8632-vinsn (nmkcatch1v :call :subprim-call) (()
1955 ((lab :label))
[9678]1956 ((entry (:label 1))
1957 (xfn (:lisp #.x8632::xfn))))
[7428]1958 (leal (:@ (:^ lab) (:%l x8632::fn)) (:%l x8632::xfn))
1959 (:talign 5)
1960 (call (:@ .SPmkcatch1v))
1961 :back
1962 (movl (:$self 0) (:%l x8632::fn)))
[7360]1963
[7428]1964
1965(define-x8632-vinsn (make-simple-unwind :call :subprim-call) (()
1966 ((protform-lab :label)
1967 (cleanup-lab :label)))
1968 (leal (:@ (:^ protform-lab) (:%l x8632::fn)) (:%l x8632::ra0))
1969 (leal (:@ (:^ cleanup-lab) (:%l x8632::fn)) (:%l x8632::xfn))
1970 (jmp (:@ .SPmkunwind)))
1971
1972(define-x8632-vinsn (nmkunwind :call :subprim-call) (()
1973 ((protform-lab :label)
1974 (cleanup-lab :label)))
1975 (leal (:@ (:^ protform-lab) (:%l x8632::fn)) (:%l x8632::ra0))
1976 (leal (:@ (:^ cleanup-lab) (:%l x8632::fn)) (:%l x8632::xfn))
1977 (jmp (:@ .SPnmkunwind)))
1978
[11796]1979(define-x8632-vinsn u16->u32 (((dest :u32))
1980 ((src :u16)))
1981 (movzwl (:%w src) (:%l dest)))
[7428]1982
[11796]1983(define-x8632-vinsn u8->u32 (((dest :u32))
1984 ((src :u8)))
[15022]1985 ((:pred < (:apply %hard-regspec-value src) 4)
1986 (movzbl (:%b src) (:%l dest)))
1987 ((:pred >= (:apply %hard-regspec-value src) 4)
1988 (movl (:%l src) (:%l dest))
1989 (movzbl (:%b dest) (:%l dest))))
1990
[11796]1991
1992(define-x8632-vinsn s16->s32 (((dest :s32))
1993 ((src :s16)))
1994 (movswl (:%w src) (:%l dest)))
1995
1996(define-x8632-vinsn s8->s32 (((dest :s32))
1997 ((src :s8)))
1998 (movsbl (:%b src) (:%l dest)))
1999
[7286]2000(define-x8632-subprim-jump-vinsn (tail-call-fn-gen) .SPtcallnfngen)
[7222]2001
[7286]2002(define-x8632-subprim-jump-vinsn (tail-call-fn-vsp) .SPtcallnfnvsp)
[7222]2003
[7286]2004(define-x8632-vinsn set-eq-bit (()
2005 ())
2006 (testb (:%b x8632::arg_z) (:%b x8632::arg_z)))
2007
2008;;; %schar8
2009;;; %schar32
2010;;; %set-schar8
2011;;; %set-schar32
2012
2013(define-x8632-vinsn misc-set-c-single-float (((val :single-float))
2014 ((v :lisp)
2015 (idx :u32const)))
[9265]2016 (movss (:%xmm val) (:@ (:apply + x8632::misc-data-offset (:apply ash idx 2)) (:%l v))))
[7286]2017
2018(define-x8632-vinsn array-data-vector-ref (((dest :lisp))
2019 ((header :lisp)))
2020 (movl (:@ x8632::arrayH.data-vector (:%l header)) (:%l dest)))
2021
[7428]2022(define-x8632-vinsn set-z-flag-if-istruct-typep (()
2023 ((val :lisp)
2024 (type :lisp))
2025 ((tag :u8)
2026 (valtype :lisp)))
2027 (xorl (:%l valtype) (:%l valtype))
2028 (movl (:%l val) (:%l tag))
[11030]2029 (andl (:$b x8632::tagmask) (:%l tag))
2030 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7428]2031 (jne :have-tag)
[11030]2032 (movsbl (:@ x8632::misc-subtag-offset (:%l val)) (:%l tag))
[7428]2033 :have-tag
[11030]2034 (cmpl (:$b x8632::subtag-istruct) (:%l tag))
[7428]2035 (jne :do-compare)
2036 (movl (:@ x8632::misc-data-offset (:%l val)) (:%l valtype))
2037 :do-compare
2038 (cmpl (:%l valtype) (:%l type)))
[7286]2039
[7222]2040(define-x8632-subprim-call-vinsn (subtag-misc-ref) .SPsubtag-misc-ref)
2041
2042(define-x8632-subprim-call-vinsn (subtag-misc-set) .SPsubtag-misc-set)
2043
[7659]2044(define-x8632-vinsn mem-set-c-constant-fullword (()
2045 ((val :s32const)
2046 (dest :address)
2047 (offset :s32const)))
2048 ((:pred = offset 0)
2049 (movl (:$l val) (:@ (:%l dest))))
2050 ((:not (:pred = offset 0))
2051 (movl (:$l val) (:@ offset (:%l dest)))))
2052
[7765]2053(define-x8632-vinsn mem-set-c-halfword (()
2054 ((val :u16)
2055 (dest :address)
2056 (offset :s32const)))
2057 ((:pred = offset 0)
2058 (movw (:%w val) (:@ (:%l dest))))
2059 ((:not (:pred = offset 0))
2060 (movw (:%w val) (:@ offset (:%l dest)))))
2061
[7659]2062(define-x8632-vinsn mem-set-c-constant-halfword (()
2063 ((val :s16const)
2064 (dest :address)
2065 (offset :s32const)))
2066 ((:pred = offset 0)
2067 (movw (:$w val) (:@ (:%l dest))))
2068 ((:not (:pred = offset 0))
2069 (movw (:$w val) (:@ offset (:%l dest)))))
2070
2071(define-x8632-vinsn mem-set-c-constant-byte (()
2072 ((val :s8const)
2073 (dest :address)
2074 (offset :s32const)))
2075 ((:pred = offset 0)
2076 (movb (:$b val) (:@ (:%l dest))))
2077 ((:not (:pred = offset 0))
2078 (movb (:$b val) (:@ offset (:%l dest)))))
2079
[7765]2080(define-x8632-vinsn mem-set-c-byte (()
2081 ((val :u8)
2082 (dest :address)
2083 (offset :s32const)))
2084 ((:pred = offset 0)
2085 (movb (:%b val) (:@ (:%l dest))))
2086 ((:not (:pred = offset 0))
2087 (movb (:%b val) (:@ offset (:%l dest)))))
2088
[7222]2089(define-x8632-vinsn mem-ref-c-absolute-u8 (((dest :u8))
2090 ((addr :s32const)))
2091 (movzbl (:@ addr) (:%l dest)))
2092
2093(define-x8632-vinsn mem-ref-c-absolute-s8 (((dest :s8))
2094 ((addr :s32const)))
2095 (movsbl (:@ addr) (:%l dest)))
2096
2097(define-x8632-vinsn mem-ref-c-absolute-u16 (((dest :u16))
2098 ((addr :s32const)))
2099 (movzwl (:@ addr) (:%l dest)))
2100
2101(define-x8632-vinsn mem-ref-c-absolute-s16 (((dest :s16))
2102 ((addr :s32const)))
2103 (movswl (:@ addr) (:%l dest)))
2104
2105(define-x8632-vinsn mem-ref-c-absolute-fullword (((dest :u32))
2106 ((addr :s32const)))
2107 (movl (:@ addr) (:%l dest)))
2108
2109(define-x8632-vinsn mem-ref-c-absolute-signed-fullword (((dest :s32))
2110 ((addr :s32const)))
2111 (movl (:@ addr) (:%l dest)))
2112
2113(define-x8632-vinsn mem-ref-c-absolute-natural (((dest :u32))
2114 ((addr :s32const)))
2115 (movl (:@ addr) (:%l dest)))
2116
[7659]2117(define-x8632-vinsn mem-ref-u8 (((dest :u8))
2118 ((src :address)
2119 (index :s32)))
2120 (movzbl (:@ (:%l src) (:%l index)) (:%l dest)))
2121
[7765]2122(define-x8632-vinsn mem-ref-c-u16 (((dest :u16))
2123 ((src :address)
2124 (index :s32const)))
2125 ((:pred = index 0)
2126 (movzwl (:@ (:%l src)) (:%l dest)))
2127 ((:not (:pred = index 0))
2128 (movzwl (:@ index (:%l src)) (:%l dest))))
2129
2130(define-x8632-vinsn mem-ref-u16 (((dest :u16))
2131 ((src :address)
2132 (index :s32)))
2133 (movzwl (:@ (:%l src) (:%l index)) (:%l dest)))
2134
[7817]2135(define-x8632-vinsn mem-ref-c-s16 (((dest :s16))
2136 ((src :address)
2137 (index :s32const)))
2138 ((:pred = index 0)
2139 (movswl (:@ (:%l src)) (:%l dest)))
2140 ((:not (:pred = index 0))
2141 (movswl (:@ index (:%l src)) (:%l dest))))
2142
2143(define-x8632-vinsn mem-ref-s16 (((dest :s16))
2144 ((src :address)
2145 (index :s32)))
2146 (movswl (:@ (:%l src) (:%l index)) (:%l dest)))
2147
[7772]2148(define-x8632-vinsn mem-ref-c-u8 (((dest :u8))
2149 ((src :address)
2150 (index :s16const)))
2151 ((:pred = index 0)
2152 (movzbl (:@ (:%l src)) (:%l dest)))
2153 ((:not (:pred = index 0))
2154 (movzbl (:@ index (:%l src)) (:%l dest))))
2155
2156(define-x8632-vinsn mem-ref-u8 (((dest :u8))
2157 ((src :address)
2158 (index :s32)))
2159 (movzbl (:@ (:%l src) (:%l index)) (:%l dest)))
2160
2161(define-x8632-vinsn mem-ref-c-s8 (((dest :s8))
2162 ((src :address)
2163 (index :s16const)))
2164 ((:pred = index 0)
2165 (movsbl (:@ (:%l src)) (:%l dest)))
2166 ((:not (:pred = index 0))
2167 (movsbl (:@ index (:%l src)) (:%l dest))))
2168
2169(define-x8632-vinsn misc-set-c-s8 (((val :s8))
2170 ((v :lisp)
2171 (idx :u32const))
2172 ())
2173 (movb (:%b val) (:@ (:apply + x8632::misc-data-offset idx) (:%l v))))
2174
2175(define-x8632-vinsn misc-set-s8 (((val :s8))
2176 ((v :lisp)
2177 (scaled-idx :s32))
2178 ())
2179 (movb (:%b val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
2180
2181(define-x8632-vinsn mem-ref-s8 (((dest :s8))
2182 ((src :address)
2183 (index :s32)))
2184 (movsbl (:@ (:%l src) (:%l index)) (:%l dest)))
2185
[7659]2186(define-x8632-vinsn mem-set-constant-fullword (()
2187 ((val :s32const)
2188 (ptr :address)
2189 (offset :s32)))
2190 (movl (:$l val) (:@ (:%l ptr) (:%l offset))))
2191
2192
2193(define-x8632-vinsn mem-set-constant-halfword (()
2194 ((val :s16const)
2195 (ptr :address)
2196 (offset :s32)))
2197 (movw (:$w val) (:@ (:%l ptr) (:%l offset))))
2198
2199(define-x8632-vinsn mem-set-constant-byte (()
2200 ((val :s8const)
2201 (ptr :address)
2202 (offset :s32)))
2203 (movb (:$b val) (:@ (:%l ptr) (:%l offset))))
2204
[9755]2205(define-x8632-vinsn misc-set-c-u8 (((val :u8))
2206 ((v :lisp)
2207 (idx :u32const))
2208 ())
2209 (movb (:%b val) (:@ (:apply + x8632::misc-data-offset idx) (:%l v))))
2210
[7765]2211(define-x8632-vinsn misc-set-u8 (((val :u8))
2212 ((v :lisp)
2213 (scaled-idx :s32))
2214 ())
2215 (movb (:%b val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
2216
[9802]2217(define-x8632-vinsn misc-set-c-u16 (()
2218 ((val :u16)
2219 (v :lisp)
2220 (idx :s32const))
2221 ())
2222 (movw (:%w val) (:@ (:apply + x8632::misc-data-offset (:apply * 2 idx)) (:%l v))))
2223
[7765]2224(define-x8632-vinsn misc-set-u16 (()
2225 ((val :u16)
2226 (v :lisp)
2227 (scaled-idx :s32))
2228 ())
2229 (movw (:%w val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
2230
2231(define-x8632-vinsn misc-set-c-s16 (()
2232 ((val :s16)
2233 (v :lisp)
2234 (idx :s32const))
2235 ())
2236 (movw (:%w val) (:@ (:apply + x8632::misc-data-offset (:apply * 2 idx)) (:%l v))))
2237
2238(define-x8632-vinsn misc-set-s16 (()
2239 ((val :s16)
2240 (v :lisp)
2241 (scaled-idx :s32))
2242 ())
2243 (movw (:%w val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
2244
2245(define-x8632-vinsn misc-set-c-u32 (()
2246 ((val :u32)
2247 (v :lisp)
2248 (idx :u32const)) ; sic
2249 ())
[9572]2250 (movl (:%l val) (:@ (:apply + x8632::misc-data-offset (:apply ash idx 2)) (:%l v))))
[7765]2251
[7428]2252(define-x8632-vinsn misc-set-u32 (()
2253 ((val :u32)
2254 (v :lisp)
[13446]2255 (scaled-idx :imm))
[7428]2256 ())
2257 (movl (:%l val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
2258
[7765]2259(define-x8632-vinsn misc-set-c-s32 (()
2260 ((val :s32)
2261 (v :lisp)
2262 (idx :u32const)) ; sic
2263 ())
[9572]2264 (movl (:%l val) (:@ (:apply + x8632::misc-data-offset (:apply ash idx 2)) (:%l v))))
[7765]2265
2266(define-x8632-vinsn misc-set-s32 (()
2267 ((val :s32)
2268 (v :lisp)
[13446]2269 (scaled-idx :imm))
[7765]2270 ())
2271 (movl (:%l val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
2272
[7817]2273(define-x8632-vinsn %iasr (((dest :imm))
2274 ((count :imm)
2275 (src :imm))
2276 ((temp :s32)
[8629]2277 (shiftcount (:s32 #.x8632::ecx))))
[7817]2278 (movl (:%l count) (:%l temp))
2279 (sarl (:$ub x8632::fixnumshift) (:%l temp))
[13457]2280 (movl (:$l 31) (:%l shiftcount))
2281 (rcmpl (:%l temp) (:%l shiftcount))
2282 (cmovbel (:%l temp) (:%l shiftcount))
[7817]2283 (movl (:%l src) (:%l temp))
2284 (sarl (:%shift x8632::cl) (:%l temp))
2285 (andl (:$l (lognot x8632::fixnummask)) (:%l temp))
2286 (movl (:%l temp) (:%l dest)))
2287
[7659]2288(define-x8632-vinsn %ilsr (((dest :imm))
2289 ((count :imm)
2290 (src :imm))
2291 ((temp :s32)
2292 (shiftcount (:s32 #.x8632::ecx))))
2293 (movl (:%l count) (:%l temp))
2294 (sarl (:$ub x8632::fixnumshift) (:%l temp))
[13457]2295 (movl (:$l 31) (:%l shiftcount))
2296 (rcmpl (:%l temp) (:%l shiftcount))
2297 (cmovbel (:%l temp) (:%l shiftcount))
[7659]2298 (movl (:%l src) (:%l temp))
2299 (shrl (:%shift x8632::cl) (:%l temp))
[13457]2300 (andl (:$b (lognot x8632::fixnummask)) (:%l temp))
[7659]2301 (movl (:%l temp) (:%l dest)))
2302
[7428]2303(define-x8632-vinsn %iasr-c (((dest :imm))
2304 ((count :u8const)
2305 (src :imm))
2306 ((temp :s32)))
2307 (movl (:%l src) (:%l temp))
2308 (sarl (:$ub count) (:%l temp))
2309 (andb (:$b (lognot x8632::fixnummask)) (:%b temp))
2310 (movl (:%l temp) (:%l dest)))
2311
2312(define-x8632-vinsn %ilsr-c (((dest :imm))
2313 ((count :u8const)
2314 (src :imm))
2315 ((temp :s32)))
2316 (movl (:%l src) (:%l temp))
2317 (shrl (:$ub count) (:%l temp))
2318 ;; xxx --- use :%acc
2319 (andb (:$b (lognot x8632::fixnummask)) (:%b temp))
2320 (movl (:%l temp) (:%l dest)))
2321
2322(define-x8632-vinsn %ilsl (((dest :imm))
2323 ((count :imm)
2324 (src :imm))
[14338]2325 ((shiftcount (:s32 #.x8632::ecx))))
2326
2327 (movl (:$l (ash 31 x8632::fixnumshift)) (:%l shiftcount))
2328 (rcmpl (:%l count) (:%l shiftcount))
2329 (cmovbl (:%l count) (:%l shiftcount))
2330 (sarl (:$ub x8632::fixnumshift) (:%l shiftcount))
2331 ((:not (:pred =
2332 (:apply %hard-regspec-value src)
2333 (:apply %hard-regspec-value dest)))
2334 (movl (:%l src) (:%l dest)))
2335 (shll (:%shift x8632::cl) (:%l dest)))
[7428]2336
2337(define-x8632-vinsn %ilsl-c (((dest :imm))
2338 ((count :u8const)
2339 (src :imm)))
2340 ((:not (:pred =
2341 (:apply %hard-regspec-value src)
2342 (:apply %hard-regspec-value dest)))
2343 (movl (:%l src) (:%l dest)))
2344 (shll (:$ub count) (:%l dest)))
2345
[15495]2346(define-x8632-vinsn fixnum-ash-left (((dest :lisp))
2347 ((num :lisp)
2348 (amt :lisp))
2349 ((shiftcount (:s32 #.x8632::ecx))))
2350 (movl (:%l amt) (:%l shiftcount))
2351 (sarl (:$ub x8632::fixnumshift) (:%l shiftcount))
2352 ((:not (:pred =
2353 (:apply %hard-regspec-value num)
2354 (:apply %hard-regspec-value dest)))
2355 (movl (:%l num) (:%l dest)))
2356 (shll (:%shift x8632::cl) (:%l dest)))
2357
2358(define-x8632-vinsn fixnum-ash (((dest :lisp))
2359 ((num :lisp)
2360 (amt :lisp))
2361 ((shiftcount (:s32 #.x8632::ecx))
2362 (temp (:s32))))
2363 (movl (:%l amt) (:%l shiftcount))
2364 (sarl (:$ub x8632::fixnumshift) (:%l shiftcount))
2365 (jns :left)
2366 (negl (:%l shiftcount))
2367 (movl (:%l num) (:%l temp))
2368 (sarl (:$ub x8632::fixnumshift) (:%l temp))
2369 (sarl (:%shift x8632::cl) (:%l temp))
2370 (imull (:$b x8632::fixnumone) (:%l temp)(:%l dest))
2371 (jmp :done)
2372 :left
2373 ((:not (:pred =
2374 (:apply %hard-regspec-value num)
2375 (:apply %hard-regspec-value dest)))
2376 (movl (:%l num) (:%l dest)))
2377 (shll (:%shift x8632::cl) (:%l dest))
2378 :done)
2379
[7817]2380;;; In safe code, something else has ensured that the value is of type
2381;;; BIT.
2382(define-x8632-vinsn set-variable-bit-to-variable-value (()
2383 ((vec :lisp)
2384 (word-index :s32)
2385 (bitnum :u8)
2386 (value :lisp)))
2387 (testl (:%l value) (:%l value))
2388 (je :clr)
2389 (btsl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4))
2390 (jmp :done)
2391 :clr
2392 (btrl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4))
2393 :done)
2394
[8629]2395;;; In safe code, something else has ensured that the value is of type
2396;;; BIT.
2397(define-x8632-vinsn nset-variable-bit-to-variable-value (()
2398 ((vec :lisp)
2399 (index :s32)
2400 (value :lisp)))
2401 (testl (:%l value) (:%l value))
2402 (je :clr)
2403 (btsl (:%l index) (:@ x8632::misc-data-offset (:%l vec)))
2404 (jmp :done)
2405 :clr
2406 (btrl (:%l index) (:@ x8632::misc-data-offset (:%l vec)))
2407 :done)
2408
2409(define-x8632-vinsn nset-variable-bit-to-zero (()
2410 ((vec :lisp)
2411 (index :s32)))
2412 (btrl (:%l index) (:@ x8632::misc-data-offset (:%l vec))))
2413
2414(define-x8632-vinsn nset-variable-bit-to-one (()
2415 ((vec :lisp)
2416 (index :s32)))
2417 (btsl (:%l index) (:@ x8632::misc-data-offset (:%l vec))))
2418
[7817]2419(define-x8632-vinsn set-variable-bit-to-zero (()
2420 ((vec :lisp)
2421 (word-index :s32)
2422 (bitnum :u8)))
2423 (btrl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4)))
2424
2425(define-x8632-vinsn set-variable-bit-to-one (()
2426 ((vec :lisp)
2427 (word-index :s32)
2428 (bitnum :u8)))
2429 (btsl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4)))
2430
2431(define-x8632-vinsn set-constant-bit-to-zero (()
2432 ((src :lisp)
2433 (idx :u32const)))
2434 (btrl (:$ub (:apply logand 31 idx))
2435 (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src))))
2436
2437(define-x8632-vinsn set-constant-bit-to-one (()
2438 ((src :lisp)
2439 (idx :u32const)))
2440 (btsl (:$ub (:apply logand 31 idx))
2441 (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src))))
2442
2443(define-x8632-vinsn set-constant-bit-to-variable-value (()
2444 ((src :lisp)
2445 (idx :u32const)
2446 (value :lisp)))
2447 (testl (:%l value) (:%l value))
2448 (je :clr)
2449 (btsl (:$ub (:apply logand 31 idx))
2450 (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src)))
2451 (jmp :done)
2452 :clr
2453 (btrl (:$ub (:apply logand 31 idx))
2454 (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src)))
2455 :done)
2456
[7428]2457(define-x8632-vinsn require-fixnum (()
2458 ((object :lisp)))
2459 :again
[15774]2460 ((:pred <= (:apply %hard-regspec-value object) x8632::ebx)
[9233]2461 (testb (:$b x8632::fixnummask) (:%b object)))
[7428]2462 ((:pred > (:apply %hard-regspec-value object) x8632::ebx)
2463 (testl (:$l x8632::fixnummask) (:%l object)))
[10495]2464 (jne :bad)
[7428]2465
[10495]2466 (:anchored-uuo-section :again)
2467 :bad
2468 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-fixnum))))
2469
[7428]2470(define-x8632-vinsn require-integer (()
2471 ((object :lisp))
2472 ((tag :u8)))
2473 :again
2474 (movl (:%l object) (:%l tag))
2475 ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
2476 (andb (:$b x8632::fixnummask) (:%accb tag)))
2477 ((:and (:pred > (:apply %hard-regspec-value tag) x8632::eax)
2478 (:pred <= (:apply %hard-regspec-value tag) x8632::ebx))
2479 (andb (:$b x8632::fixnummask) (:%b tag)))
2480 ((:pred > (:apply %hard-regspec-value object) x8632::ebx)
2481 (andl (:$l x8632::fixnummask) (:%l tag)))
[9692]2482 (je :got-it)
[7428]2483 ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
2484 (cmpb (:$b x8632::tag-misc) (:%accb tag)))
2485 ((:and (:pred > (:apply %hard-regspec-value tag) x8632::eax)
2486 (:pred <= (:apply %hard-regspec-value tag) x8632::ebx))
2487 (cmpb (:$b x8632::tag-misc) (:%b tag)))
2488 ((:pred > (:apply %hard-regspec-value object) x8632::ebx)
2489 (cmpl (:$l x8632::tag-misc) (:%l tag)))
2490 (jne :bad)
2491 (cmpb (:$b x8632::subtag-bignum) (:@ x8632::misc-subtag-offset (:%l object)))
[10495]2492 (jne :bad)
2493 :got-it
2494
2495 (:anchored-uuo-section :again)
[7428]2496 :bad
[10495]2497 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-integer))))
[7428]2498
[7659]2499(define-x8632-vinsn require-simple-vector (()
2500 ((object :lisp))
2501 ((tag :u8)))
2502 :again
[11029]2503 (movl (:%l object) (:%l tag))
2504 (andl (:$b x8632::fixnummask) (:%l tag))
2505 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7659]2506 (jne :bad)
2507 (cmpb (:$b x8632::subtag-simple-vector) (:@ x8632::misc-subtag-offset (:%l object)))
[10495]2508 (jne :bad)
2509
2510 (:anchored-uuo-section :again)
[7659]2511 :bad
[10495]2512 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-simple-vector))))
[7659]2513
2514(define-x8632-vinsn require-simple-string (()
2515 ((object :lisp))
2516 ((tag :u8)))
2517 :again
[11029]2518 (movl (:%l object) (:%l tag))
2519 (andl (:$b x8632::fixnummask) (:%l tag))
2520 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7659]2521 (jne :bad)
2522 (cmpb (:$b x8632::subtag-simple-base-string) (:@ x8632::misc-subtag-offset (:%l object)))
[10495]2523 (jne :bad)
2524
2525 (:anchored-uuo-section :again)
[7659]2526 :bad
[10495]2527 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-simple-string))))
[7659]2528
2529
[7428]2530;;; naive
2531(define-x8632-vinsn require-real (()
2532 ((object :lisp))
[10495]2533 ((tag :u8)
2534 (mask :lisp)))
[7428]2535 :again
2536 (movl (:%l object) (:%l tag))
[10495]2537 (andl (:$b x8632::tagmask) (:%l tag))
[11029]2538 (cmpl (:$b x8632::tag-misc) (:%l tag))
[10495]2539 (jne :have-tag)
[11029]2540 (movzbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
[10495]2541 :have-tag
[11029]2542 (cmpl (:$b (1- (- x8632::nbits-in-word x8632::fixnumshift))) (:%l tag))
[10495]2543 (movl (:$l (ash (logior (ash 1 x8632::tag-fixnum)
2544 (ash 1 x8632::subtag-single-float)
2545 (ash 1 x8632::subtag-double-float)
2546 (ash 1 x8632::subtag-bignum)
2547 (ash 1 x8632::subtag-ratio))
2548 x8632::fixnumshift)) (:%l mask))
2549 (ja :bad)
2550 (addl (:$b x8632::fixnumshift) (:%l tag))
2551 (btl (:%l tag) (:%l mask))
2552 (jnc :bad)
2553
2554 (:anchored-uuo-section :again)
[7428]2555 :bad
[10495]2556 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-real))))
[7428]2557
[7659]2558;;; naive
2559(define-x8632-vinsn require-number (()
2560 ((object :lisp))
[10495]2561 ((tag :u8)
2562 (mask :lisp)))
[7659]2563 :again
2564 (movl (:%l object) (:%l tag))
[10495]2565 (andl (:$b x8632::tagmask) (:%l tag))
[11029]2566 (cmpl (:$b x8632::tag-misc) (:%l tag))
[10495]2567 (jne :have-tag)
[11029]2568 (movzbl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag))
[10495]2569 :have-tag
[11029]2570 (cmpl (:$b (1- (- x8632::nbits-in-word x8632::fixnumshift))) (:%l tag))
[10495]2571 (movl (:$l (ash (logior (ash 1 x8632::tag-fixnum)
2572 (ash 1 x8632::subtag-single-float)
2573 (ash 1 x8632::subtag-double-float)
2574 (ash 1 x8632::subtag-bignum)
2575 (ash 1 x8632::subtag-ratio)
2576 (ash 1 x8632::subtag-complex))
2577 x8632::fixnumshift)) (:%l mask))
2578 (ja :bad)
2579 (addl (:$b x8632::fixnumshift) (:%l tag))
2580 (btl (:%l tag) (:%l mask))
2581 (jnc :bad)
2582
2583 (:anchored-uuo-section :again)
[7659]2584 :bad
[10495]2585 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-number))))
[7659]2586
2587(define-x8632-vinsn require-list (()
2588 ((object :lisp))
2589 ((tag :u8)))
2590 :again
2591 (movl (:%l object) (:%l tag))
[11029]2592 (andl (:$b x8632::fulltagmask) (:%l tag))
2593 (cmpl (:$b x8632::fulltag-cons) (:%l tag))
[10495]2594 (jne :bad)
[7659]2595
[10495]2596 (:anchored-uuo-section :again)
2597 :bad
2598 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-list))))
2599
[7428]2600(define-x8632-vinsn require-symbol (()
2601 ((object :lisp))
2602 ((tag :u8)))
2603 :again
[10984]2604 (cmpl (:$l (:apply target-nil-value)) (:%l object))
[7428]2605 (je :got-it)
2606 (movl (:%l object) (:%l tag))
[11029]2607 (andl (:$b x8632::tagmask) (:%l tag))
2608 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7428]2609 (jne :bad)
2610 (cmpb (:$b x8632::subtag-symbol) (:@ x8632::misc-subtag-offset (:%l object)))
[10495]2611 (jne :bad)
2612 :got-it
2613
2614 (:anchored-uuo-section :again)
[7428]2615 :bad
[10495]2616 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-symbol)))
2617)
[7428]2618
[7659]2619(define-x8632-vinsn require-character (()
[14979]2620 ((object :lisp))
2621 ((tag (:u8 #.x8632::imm0))))
[7659]2622 :again
[14979]2623 ((:pred < (:apply %hard-regspec-value object) 4)
2624 (cmpb (:$b x8632::subtag-character) (:%b object)))
2625 ((:not (:pred < (:apply %hard-regspec-value object) 4))
2626 (movl (:%l object) (:%l tag))
2627 (cmpb (:$b x8632::subtag-character) (:%b tag)))
2628
[10495]2629 (jne :bad)
[7659]2630
[10495]2631 (:anchored-uuo-section :again)
2632 :bad
2633 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-character))))
2634
[7765]2635(define-x8632-vinsn require-s8 (()
2636 ((object :lisp))
2637 ((tag :u32)))
2638 :again
2639 (movl (:%l object) (:%l tag))
2640 (shll (:$ub (- x8632::nbits-in-word (+ 8 x8632::fixnumshift))) (:%l tag))
2641 (sarl (:$ub (- x8632::nbits-in-word 8)) (:%l tag))
2642 (shll (:$ub x8632::fixnumshift) (:%l tag))
2643 (cmpl (:%l object) (:%l tag))
[10495]2644 (jne :bad)
2645
2646 (:anchored-uuo-section :again)
[7765]2647 :bad
[10495]2648 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-signed-byte-8))))
[7765]2649
2650(define-x8632-vinsn require-u8 (()
2651 ((object :lisp))
2652 ((tag :u32)))
2653 :again
2654 (movl (:$l (lognot (ash #xff x8632::fixnumshift))) (:%l tag))
2655 (andl (:%l object) (:%l tag))
[10495]2656 (jne :bad)
[7765]2657
[10495]2658 (:anchored-uuo-section :again)
2659 :bad
2660 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-unsigned-byte-8))))
2661
[7765]2662(define-x8632-vinsn require-s16 (()
2663 ((object :lisp))
2664 ((tag :s32)))
2665 :again
2666 (movl (:%l object) (:%l tag))
2667 (shll (:$ub (- x8632::nbits-in-word (+ 16 x8632::fixnumshift))) (:%l tag))
2668 (sarl (:$ub (- x8632::nbits-in-word 16)) (:%l tag))
2669 (shll (:$ub x8632::fixnumshift) (:%l tag))
2670 (cmpl (:%l object) (:%l tag))
[10495]2671 (jne :bad)
2672
2673 (:anchored-uuo-section :again)
[7765]2674 :bad
[10495]2675 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-signed-byte-16))))
[7765]2676
2677(define-x8632-vinsn require-u16 (()
2678 ((object :lisp))
2679 ((tag :u32)))
2680 :again
2681 (movl (:$l (lognot (ash #xffff x8632::fixnumshift))) (:%l tag))
2682 (andl (:%l object) (:%l tag))
[10495]2683 (jne :bad)
[7765]2684
[10495]2685 (:anchored-uuo-section :again)
2686 :bad
2687 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-unsigned-byte-16))))
2688
[7765]2689(define-x8632-vinsn require-s32 (()
2690 ((object :lisp))
2691 ((tag :s32)))
2692 :again
2693 (testl (:$l x8632::fixnummask) (:%l object))
2694 (movl (:%l object) (:%l tag))
[9692]2695 (je :ok)
[7765]2696 (andl (:$l x8632::fulltagmask) (:%l tag))
2697 (cmpl (:$l x8632::fulltag-misc) (:%l tag))
[9692]2698 (jne :bad)
[7765]2699 (cmpl (:$l x8632::one-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
[10495]2700 (jne :bad)
2701 :ok
2702
2703 (:anchored-uuo-section :again)
[7765]2704 :bad
[10495]2705 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-signed-byte-32))))
[7765]2706
2707(define-x8632-vinsn require-u32 (()
2708 ((object :lisp))
2709 ((tag :s32)))
2710 :again
2711 (testl (:$l x8632::fixnummask) (:%l object))
2712 (movl (:%l object) (:%l tag))
[9692]2713 (je :ok-if-non-negative)
[7765]2714 (andl (:$l x8632::fulltagmask) (:%l tag))
2715 (cmpl (:$l x8632::fulltag-misc) (:%l tag))
[9692]2716 (jne :bad)
[7765]2717 (cmpl (:$l x8632::one-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
2718 (je :one)
2719 (cmpl (:$l x8632::two-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
[9692]2720 (jne :bad)
[7765]2721 (cmpl (:$b 0) (:@ (+ x8632::misc-data-offset 4) (:%l object)))
2722 (je :ok)
2723 :bad
2724 (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-unsigned-byte-32))
2725 (jmp :again)
2726 :one
2727 (movl (:@ x8632::misc-data-offset (:%l object)) (:%l tag))
2728 :ok-if-non-negative
2729 (testl (:%l tag) (:%l tag))
2730 (js :bad)
2731 :ok)
2732
[7817]2733(define-x8632-vinsn require-s64 (()
2734 ((object :lisp))
2735 ((tag :s32)))
2736 :again
2737 (testl (:$l x8632::fixnummask) (:%l object))
2738 (movl (:%l object) (:%l tag))
[9692]2739 (je :ok)
[7817]2740 (andl (:$l x8632::fulltagmask) (:%l tag))
2741 (cmpl (:$l x8632::fulltag-misc) (:%l tag))
[9692]2742 (jne :bad)
[7817]2743 (cmpl (:$l x8632::two-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
[10495]2744 (jne :bad)
2745 :ok
2746
2747 (:anchored-uuo-section :again)
[7817]2748 :bad
[10495]2749 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-signed-byte-64))))
[7817]2750
[16004]2751;;; Something is an (UNSIGNED-BYTE 64) iff:
2752;;; a) it's a non-negative FIXNUM
2753;;; b) it's a 1- or 2-digit BIGNUM and the sign bit is clear
2754;;; c) it's a 3-digit BIGNUM and the high word is 0
[7817]2755(define-x8632-vinsn require-u64 (()
2756 ((object :lisp))
2757 ((tag :s32)))
2758 :again
[16004]2759 (testl (:$l (logior (ash 1 31) x8632::fixnummask)) (:%l object))
[7817]2760 (movl (:%l object) (:%l tag))
[16004]2761 (je :ok)
[7817]2762 (andl (:$l x8632::fulltagmask) (:%l tag))
2763 (cmpl (:$l x8632::fulltag-misc) (:%l tag))
[9692]2764 (jne :bad)
[7817]2765 (cmpl (:$l x8632::three-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
[16004]2766 (jne :notthree)
[7817]2767 (cmpl (:$b 0) (:@ (+ x8632::misc-data-offset 8) (:%l object)))
2768 (je :ok)
2769 :bad
2770 (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-unsigned-byte-64))
2771 (jmp :again)
[16004]2772 :notthree
2773 (xorl (:%l tag) (:%l tag))
2774 (cmpl (:$l x8632::one-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
2775 (je :testsign)
2776 (addl (:$b x8632::fixnumone) (:%l tag))
2777 (cmpl (:$l x8632::two-digit-bignum-header) (:@ x8632::misc-header-offset (:%l object)))
2778 (jne :bad)
2779 :testsign
2780 (cmpl (:$b 0) (:@ x8632::misc-data-offset (:%l object) (:%l tag)))
[7817]2781 (js :bad)
2782 :ok)
2783
[7765]2784(define-x8632-vinsn require-char-code (()
2785 ((object :lisp))
2786 ((tag :u32)))
2787 :again
[15774]2788 ((:pred <= (:apply %hard-regspec-value object) x8632::ebx)
2789 (testb (:$b x8632::fixnummask) (:%b object)))
2790 ((:pred > (:apply %hard-regspec-value object) x8632::ebx)
2791 (testl (:$l x8632::fixnummask) (:%l object)))
[9692]2792 (jne :bad)
[7765]2793 (cmpl (:$l (ash #x110000 x8632::fixnumshift)) (:%l object))
[10495]2794 (jae :bad)
2795
2796 (:anchored-uuo-section :again)
[7765]2797 :bad
[10495]2798 (:anchored-uuo (uuo-error-reg-not-type (:%l object) (:$ub arch::error-object-not-mod-char-code-limit))))
[7765]2799
[7428]2800(define-x8632-vinsn mask-base-char (((dest :u8))
2801 ((src :lisp)))
[15022]2802 ((:pred < (:apply %hard-regspec-value src) 4)
2803 (movzbl (:%b src) (:%l dest)))
2804 ((:pred >= (:apply %hard-regspec-value src) 4)
2805 (movl (:%l src) (:%l dest))
2806 (movzbl (:%b dest) (:%l dest))))
2807
2808
[7428]2809
[7222]2810(define-x8632-vinsn event-poll (()
2811 ())
2812 (btrl (:$ub 31) (:@ (:%seg :rcontext) x8632::tcr.interrupt-pending))
2813 (jae :no-interrupt)
2814 (ud2a)
2815 (:byte 2)
2816 :no-interrupt)
2817
2818;;; check-2d-bound
2819;;; check-3d-bound
[7286]2820
2821(define-x8632-vinsn 2d-dim1 (((dest :u32))
2822 ((header :lisp)))
2823 (movl (:@ (+ x8632::misc-data-offset (* 4 (1+ x8632::arrayH.dim0-cell)))
2824 (:%l header)) (:%l dest))
2825 (sarl (:$ub x8632::fixnumshift) (:%l dest)))
2826
[7222]2827;;; 3d-dims
2828
[7339]2829;;; xxx
2830(define-x8632-vinsn 2d-unscaled-index (((dest :imm)
2831 (dim1 :u32))
2832 ((dim1 :u32)
2833 (i :imm)
2834 (j :imm)))
2835
2836 (imull (:%l i) (:%l dim1))
2837 (leal (:@ (:%l j) (:%l dim1)) (:%l dest)))
2838
[7222]2839;;; 3d-unscaled-index
2840
[7009]2841(define-x8632-vinsn branch-unless-both-args-fixnums (()
2842 ((a :lisp)
2843 (b :lisp)
2844 (dest :label))
[7222]2845 ((tag :u8)))
2846 (movl (:%l a) (:%l tag))
2847 (orl (:%l b) (:%l tag))
[7286]2848 ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
2849 (testb (:$b x8632::fixnummask) (:%accb tag)))
2850 ((:and (:pred > (:apply %hard-regspec-value tag) x8632::eax)
2851 (:pred <= (:apply %hard-regspec-value tag) x8632::ebx))
2852 (testb (:$b x8632::fixnummask) (:%b tag)))
2853 ((:pred > (:apply %hard-regspec-value tag) x8632::ebx)
2854 (testl (:$l x8632::fixnummask) (:%l tag)))
[7009]2855 (jne dest))
2856
2857(define-x8632-vinsn branch-unless-arg-fixnum (()
2858 ((a :lisp)
2859 (dest :label)))
[7112]2860 ((:pred <= (:apply %hard-regspec-value a) x8632::ebx)
2861 (testb (:$b x8632::fixnummask) (:%b a)))
2862 ((:pred > (:apply %hard-regspec-value a) x8632::ebx)
[7222]2863 (testl (:$l x8632::fixnummask) (:%l a)))
[7009]2864 (jne dest))
2865
2866(define-x8632-vinsn fixnum->single-float (((f :single-float))
2867 ((arg :lisp))
2868 ((unboxed :s32)))
2869 (movl (:%l arg) (:%l unboxed))
2870 (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
2871 (cvtsi2ssl (:%l unboxed) (:%xmm f)))
2872
2873(define-x8632-vinsn fixnum->double-float (((f :double-float))
2874 ((arg :lisp))
2875 ((unboxed :s32)))
2876 (movl (:%l arg) (:%l unboxed))
2877 (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
2878 (cvtsi2sdl (:%l unboxed) (:%xmm f)))
2879
2880(define-x8632-vinsn xchg-registers (()
2881 ((a t)
2882 (b t)))
2883 (xchgl (:%l a) (:%l b)))
2884
2885(define-x8632-vinsn establish-fn (()
2886 ())
[7222]2887 (movl (:$self 0) (:%l x8632::fn)))
[7009]2888
[7659]2889(define-x8632-vinsn %scharcode32 (((code :imm))
2890 ((str :lisp)
2891 (idx :imm))
2892 ((imm :u32)))
[8629]2893 (movl (:@ x8632::misc-data-offset (:%l str) (:%l idx)) (:%l imm))
2894 (imull (:$b x8632::fixnumone) (:%l imm) (:%l code)))
[7222]2895
[8629]2896(define-x8632-vinsn %set-scharcode32 (()
2897 ((str :lisp)
2898 (idx :imm)
2899 (code :imm))
2900 ((imm :u32)))
2901 (movl (:%l code) (:%l imm))
2902 (shrl (:$ub x8632::fixnumshift) (:%l imm))
2903 (movl (:%l imm) (:@ x8632::misc-data-offset (:%l str) (:%l idx))))
[7659]2904
[8629]2905
[7339]2906(define-x8632-subprim-jump-vinsn (tail-call-sym-slide) .SPtcallsymslide)
2907
2908(define-x8632-subprim-jump-vinsn (tail-call-sym-vsp) .SPtcallsymvsp)
2909
2910
2911(define-x8632-vinsn character->code (((dest :u32))
2912 ((src :lisp)))
2913 (movl (:%l src) (:%l dest))
2914 (sarl (:$ub x8632::charcode-shift) (:%l dest)))
2915
[15022]2916(define-x8632-vinsn (adjust-vsp :vsp :pop :discard)
2917 (()
2918 ((amount :s32const)))
[7339]2919 ((:and (:pred >= amount -128) (:pred <= amount 127))
2920 (addl (:$b amount) (:%l x8632::esp)))
2921 ((:not (:and (:pred >= amount -128) (:pred <= amount 127)))
2922 (addl (:$l amount) (:%l x8632::esp))))
2923
2924
[7222]2925(define-x8632-vinsn (call-subprim-2 :call :subprim-call) (((dest t))
2926 ((spno :s32const)
2927 (y t)
2928 (z t))
2929 ((entry (:label 1))))
2930 (:talign 5)
2931 (call (:@ spno))
2932 (movl (:$self 0) (:%l x8632::fn)))
2933
[7659]2934(define-x8632-vinsn %symbol->symptr (((dest :lisp))
2935 ((src :lisp))
2936 ((tag :u8)))
[10495]2937 :resume
[10984]2938 (cmpl (:$l (:apply target-nil-value)) (:%l src))
[7659]2939 (je :nilsym)
[8349]2940 (movl (:%l src) (:%l tag))
[11029]2941 (andl (:$b x8632::tagmask) (:%l tag))
2942 (cmpl (:$b x8632::tag-misc) (:%l tag))
[7659]2943 (jne :bad)
[11029]2944 (movsbl (:@ x8632::misc-subtag-offset (:%l src)) (:%l tag))
2945 (cmpl (:$b x8632::subtag-symbol) (:%l tag))
[7659]2946 (jne :bad)
2947 ((:not (:pred =
2948 (:apply %hard-regspec-value dest)
2949 (:apply %hard-regspec-value src)))
2950 (movl (:% src) (:% dest)))
2951 (jmp :ok)
2952 :nilsym
[10984]2953 (movl (:$l (:apply + (:apply target-nil-value) x8632::nilsym-offset)) (:%l dest))
[10495]2954 :ok
2955
2956 (:anchored-uuo-section :resume)
2957 :bad
2958 (:anchored-uuo (uuo-error-reg-not-tag (:%l src) (:$ub x8632::subtag-symbol))))
[7659]2959
[11066]2960(define-x8632-vinsn single-float-bits (((dest :u32))
2961 ((src :lisp)))
2962 (movl (:@ x8632::misc-data-offset (:%l src)) (:%l dest)))
[10495]2963
[7286]2964(define-x8632-vinsn zero-double-float-register (((dest :double-float))
2965 ())
2966 (movsd (:%xmm x8632::fpzero) (:%xmm dest)))
[7251]2967
[7286]2968(define-x8632-vinsn zero-single-float-register (((dest :single-float))
2969 ())
2970 (movss (:%xmm x8632::fpzero) (:%xmm dest)))
2971
[7428]2972(define-x8632-subprim-lea-jmp-vinsn (heap-rest-arg) .SPheap-rest-arg)
2973(define-x8632-subprim-lea-jmp-vinsn (stack-rest-arg) .SPstack-rest-arg)
2974(define-x8632-subprim-lea-jmp-vinsn (req-stack-rest-arg) .SPreq-stack-rest-arg)
2975
2976
[7286]2977(define-x8632-subprim-call-vinsn (stack-misc-alloc) .SPstack-misc-alloc)
2978
2979(define-x8632-vinsn misc-element-count-fixnum (((dest :imm))
2980 ((src :lisp))
2981 ((temp :u32)))
2982 (movl (:@ x8632::misc-header-offset (:%l src)) (:%l temp))
[11029]2983 (shrl (:$ub x8632::num-subtag-bits) (:%l temp))
2984 (leal (:@ (:%l temp) 4) (:%l dest)))
[7286]2985
2986(define-x8632-vinsn %logior2 (((dest :imm))
2987 ((x :imm)
2988 (y :imm)))
2989 ((:pred =
2990 (:apply %hard-regspec-value x)
2991 (:apply %hard-regspec-value dest))
2992 (orl (:%l y) (:%l dest)))
2993 ((:not (:pred =
2994 (:apply %hard-regspec-value x)
2995 (:apply %hard-regspec-value dest)))
2996 ((:pred =
2997 (:apply %hard-regspec-value y)
2998 (:apply %hard-regspec-value dest))
2999 (orl (:%l x) (:%l dest)))
3000 ((:not (:pred =
3001 (:apply %hard-regspec-value y)
3002 (:apply %hard-regspec-value dest)))
3003 (movl (:%l x) (:%l dest))
3004 (orl (:%l y) (:%l dest)))))
3005
3006(define-x8632-vinsn %logand2 (((dest :imm))
3007 ((x :imm)
3008 (y :imm)))
3009 ((:pred =
3010 (:apply %hard-regspec-value x)
3011 (:apply %hard-regspec-value dest))
3012 (andl (:%l y) (:%l dest)))
3013 ((:not (:pred =
3014 (:apply %hard-regspec-value x)
3015 (:apply %hard-regspec-value dest)))
3016 ((:pred =
3017 (:apply %hard-regspec-value y)
3018 (:apply %hard-regspec-value dest))
3019 (andl (:%l x) (:%l dest)))
3020 ((:not (:pred =
3021 (:apply %hard-regspec-value y)
3022 (:apply %hard-regspec-value dest)))
3023 (movl (:%l x) (:%l dest))
3024 (andl (:%l y) (:%l dest)))))
3025
3026(define-x8632-vinsn %logxor2 (((dest :imm))
3027 ((x :imm)
3028 (y :imm)))
3029 ((:pred =
3030 (:apply %hard-regspec-value x)
3031 (:apply %hard-regspec-value dest))
3032 (xorl (:%l y) (:%l dest)))
3033 ((:not (:pred =
3034 (:apply %hard-regspec-value x)
3035 (:apply %hard-regspec-value dest)))
3036 ((:pred =
3037 (:apply %hard-regspec-value y)
3038 (:apply %hard-regspec-value dest))
3039 (xorl (:%l x) (:%l dest)))
3040 ((:not (:pred =
3041 (:apply %hard-regspec-value y)
3042 (:apply %hard-regspec-value dest)))
3043 (movl (:%l x) (:%l dest))
3044 (xorl (:%l y) (:%l dest)))))
3045
[7659]3046
[7251]3047(define-x8632-subprim-call-vinsn (integer-sign) .SPinteger-sign)
3048
3049(define-x8632-subprim-call-vinsn (misc-ref) .SPmisc-ref)
3050
3051(define-x8632-subprim-call-vinsn (ksignalerr) .SPksignalerr)
3052
3053(define-x8632-subprim-call-vinsn (misc-alloc-init) .SPmisc-alloc-init)
3054
[7428]3055(define-x8632-subprim-call-vinsn (misc-alloc) .SPmisc-alloc)
[7251]3056
[7428]3057(define-x8632-subprim-lea-jmp-vinsn (make-stack-gvector) .SPstkgvector)
3058
3059(define-x8632-vinsn load-character-constant (((dest :lisp))
3060 ((code :u32const))
3061 ())
3062 (movl (:$l (:apply logior (:apply ash code 8) x8632::subtag-character))
3063 (:%l dest)))
3064
3065
[7817]3066(define-x8632-vinsn setup-single-float-allocation (()
3067 ())
3068 (movl (:$l (arch::make-vheader x8632::single-float.element-count x8632::subtag-single-float)) (:%l x8632::imm0))
3069 (movd (:%l x8632::imm0) (:%mmx x8632::mm0))
3070 (movl (:$l (- x8632::single-float.size x8632::fulltag-misc)) (:%l x8632::imm0)))
3071
[7286]3072(define-x8632-vinsn setup-double-float-allocation (()
3073 ())
3074 (movl (:$l (arch::make-vheader x8632::double-float.element-count x8632::subtag-double-float)) (:%l x8632::imm0))
[7817]3075 (movd (:%l x8632::imm0) (:%mmx x8632::mm0))
3076 (movl (:$l (- x8632::double-float.size x8632::fulltag-misc)) (:%l x8632::imm0)))
[7286]3077
[7817]3078(define-x8632-vinsn set-single-float-value (()
3079 ((node :lisp)
3080 (val :single-float)))
3081 (movss (:%xmm val) (:@ x8632::single-float.value (:%l node))))
3082
[7286]3083(define-x8632-vinsn set-double-float-value (()
3084 ((node :lisp)
3085 (val :double-float)))
[7765]3086 (movsd (:%xmm val) (:@ x8632::double-float.value (:%l node))))
[7286]3087
[7817]3088(define-x8632-vinsn word-index-and-bitnum-from-index (((word-index :u32)
3089 (bitnum :u8))
3090 ((index :imm)))
3091 (movl (:%l index) (:%l word-index))
3092 (shrl (:$ub x8632::fixnumshift) (:%l word-index))
3093 (movl (:$l 31) (:%l bitnum))
3094 (andl (:%l word-index) (:%l bitnum))
3095 (shrl (:$ub 5) (:%l word-index)))
3096
3097(define-x8632-vinsn ref-bit-vector-fixnum (((dest :imm)
3098 (bitnum :u8))
3099 ((bitnum :u8)
3100 (bitvector :lisp)
3101 (word-index :u32)))
3102 (btl (:%l bitnum) (:@ x8632::misc-data-offset (:%l bitvector) (:%l word-index) 4))
3103 (setb (:%b bitnum))
3104 (negb (:%b bitnum))
3105 (andl (:$l x8632::fixnumone) (:%l bitnum))
3106 (movl (:%l bitnum) (:%l dest)))
3107
[8629]3108(define-x8632-vinsn nref-bit-vector-fixnum (((dest :imm)
3109 (bitnum :s32))
3110 ((bitnum :s32)
3111 (bitvector :lisp))
3112 ())
3113 (btl (:%l bitnum) (:@ x8632::misc-data-offset (:%l bitvector)))
3114 (setc (:%b bitnum))
3115 (movzbl (:%b bitnum) (:%l bitnum))
3116 (imull (:$b x8632::fixnumone) (:%l bitnum) (:%l dest)))
3117
[10363]3118(define-x8632-vinsn nref-bit-vector-flags (()
3119 ((bitnum :s32)
3120 (bitvector :lisp))
3121 ())
3122 (btl (:%l bitnum) (:@ x8632::misc-data-offset (:%l bitvector))))
3123
3124(define-x8632-vinsn misc-ref-c-bit-fixnum (((dest :imm))
3125 ((src :lisp)
3126 (idx :u32const))
3127 ((temp :u8)))
3128 (btl (:$ub (:apply logand 31 idx))
3129 (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src)))
3130 (setc (:%b temp))
3131 (movzbl (:%b temp) (:%l temp))
3132 (imull (:$b x8632::fixnumone) (:%l temp) (:%l dest)))
3133
3134(define-x8632-vinsn misc-ref-c-bit-flags (()
3135 ((src :lisp)
3136 (idx :u64const)))
3137 (btl (:$ub (:apply logand 31 idx))
3138 (:@ (:apply + x8632::misc-data-offset (:apply ash (:apply ash idx -5) x8632::word-shift)) (:%l src))))
3139
[7659]3140(define-x8632-vinsn set-macptr-address (()
3141 ((addr :address)
3142 (src :lisp))
3143 ())
3144 (movl (:%l addr) (:@ x8632::macptr.address (:%l src))))
3145
3146(define-x8632-vinsn deref-macptr (((addr :address))
3147 ((src :lisp))
3148 ())
3149 (movl (:@ x8632::macptr.address (:%l src)) (:%l addr)))
3150
3151(define-x8632-vinsn setup-macptr-allocation (()
3152 ((src :address)))
[8349]3153 (movd (:%l src) (:%mmx x8632::mm1)) ;see %set-new-macptr-value, below
3154 (movl (:$l x8632::macptr-header) (:%l x8632::imm0))
3155 (movd (:%l x8632::imm0) (:%mmx x8632::mm0))
[7659]3156 (movl (:$l (- x8632::macptr.size x8632::fulltag-misc)) (:%l x8632::imm0)))
3157
3158(define-x8632-vinsn %set-new-macptr-value (()
3159 ((ptr :lisp)))
3160 (movd (:%mmx x8632::mm1) (:@ x8632::macptr.address (:%l ptr))))
3161
[7772]3162(define-x8632-vinsn mem-ref-natural (((dest :u32))
3163 ((src :address)
3164 (index :s32)))
3165 (movl (:@ (:%l src) (:%l index)) (:%l dest)))
3166
[7765]3167(define-x8632-vinsn mem-ref-c-fullword (((dest :u32))
3168 ((src :address)
3169 (index :s32const)))
3170 ((:pred = index 0)
3171 (movl (:@ (:%l src)) (:%l dest)))
3172 ((:not (:pred = index 0))
3173 (movl (:@ index (:%l src)) (:%l dest))))
3174
3175(define-x8632-vinsn mem-ref-c-signed-fullword (((dest :s32))
3176 ((src :address)
3177 (index :s32const)))
3178 ((:pred = index 0)
3179 (movl (:@ (:%l src)) (:%l dest)))
3180 ((:not (:pred = index 0))
3181 (movl (:@ index (:%l src)) (:%l dest))))
3182
[7772]3183(define-x8632-vinsn mem-ref-c-single-float (((dest :single-float))
3184 ((src :address)
3185 (index :s32const)))
3186 ((:pred = index 0)
3187 (movss (:@ (:%l src)) (:%xmm dest)))
3188 ((:not (:pred = index 0))
3189 (movss (:@ index (:%l src)) (:%xmm dest))))
3190
3191(define-x8632-vinsn mem-set-c-single-float (()
3192 ((val :single-float)
3193 (src :address)
3194 (index :s16const)))
3195 ((:pred = index 0)
3196 (movss (:%xmm val) (:@ (:%l src))))
3197 ((:not (:pred = index 0))
3198 (movss (:%xmm val) (:@ index (:%l src)))))
3199
3200(define-x8632-vinsn mem-ref-c-natural (((dest :u32))
3201 ((src :address)
3202 (index :s32const)))
3203 ((:pred = index 0)
3204 (movl (:@ (:%l src)) (:%l dest)))
3205 ((:not (:pred = index 0))
3206 (movl (:@ index (:%l src)) (:%l dest))))
3207
[7817]3208(define-x8632-vinsn mem-ref-c-double-float (((dest :double-float))
3209 ((src :address)
3210 (index :s32const)))
3211 ((:pred = index 0)
3212 (movsd (:@ (:%l src)) (:%xmm dest)))
3213 ((:not (:pred = index 0))
3214 (movsd (:@ index (:%l src)) (:%xmm dest))))
[7772]3215
[7817]3216(define-x8632-vinsn mem-set-c-double-float (()
3217 ((val :double-float)
3218 (src :address)
3219 (index :s32const)))
3220 ((:pred = index 0)
3221 (movsd (:%xmm val) (:@ (:%l src))))
3222 ((:not (:pred = index 0))
3223 (movsd (:%xmm val) (:@ index (:%l src)))))
3224
[7765]3225(define-x8632-vinsn mem-ref-fullword (((dest :u32))
3226 ((src :address)
3227 (index :s32)))
3228 (movl (:@ (:%l src) (:%l index)) (:%l dest)))
3229
3230(define-x8632-vinsn mem-ref-signed-fullword (((dest :s32))
3231 ((src :address)
3232 (index :s32)))
3233 (movl (:@ (:%l src) (:%l index)) (:%l dest)))
3234
[7659]3235(define-x8632-vinsn macptr->stack (((dest :lisp))
[8687]3236 ((ptr :address))
3237 ((temp :imm)))
[7659]3238 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
[8687]3239 (subl (:$b (+ 8 x8632::macptr.size)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
3240 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
3241 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
[10561]3242 (movl (:%l x8632::ebp) (:@ 4 (:%l temp)))
[8687]3243 (leal (:@ (+ 8 x8632::fulltag-misc) (:%l temp)) (:%l dest))
[7659]3244 (movl (:$l x8632::macptr-header) (:@ x8632::macptr.header (:%l dest)))
3245 (movl (:%l ptr) (:@ x8632::macptr.address (:%l dest)))
[8687]3246 (movsd (:%xmm x8632::fpzero) (:@ x8632::macptr.domain (:%l dest))))
[7659]3247
3248(define-x8632-vinsn fixnum->signed-natural (((dest :s32))
3249 ((src :imm)))
3250 (movl (:%l src) (:%l dest))
3251 (sarl (:$ub x8632::fixnumshift) (:%l dest)))
3252
[8629]3253(define-x8632-vinsn fixnum->unsigned-natural (((dest :u32))
3254 ((src :imm)))
3255 (movl (:%l src) (:%l dest))
3256 (shrl (:$ub x8632::fixnumshift) (:%l dest)))
3257
[7765]3258(define-x8632-vinsn mem-set-double-float (()
3259 ((val :double-float)
3260 (src :address)
3261 (index :s32)))
3262 (movsd (:%xmm val) (:@ (:%l src) (:%l index))))
3263
3264(define-x8632-vinsn mem-set-single-float (()
3265 ((val :single-float)
3266 (src :address)
3267 (index :s32)))
3268 (movss (:%xmm val) (:@ (:%l src) (:%l index))))
3269
3270(define-x8632-vinsn mem-set-c-fullword (()
3271 ((val :u32)
3272 (dest :address)
3273 (offset :s32const)))
3274 ((:pred = offset 0)
3275 (movl (:%l val) (:@ (:%l dest))))
3276 ((:not (:pred = offset 0))
3277 (movl (:%l val) (:@ offset (:%l dest)))))
3278
[7817]3279(define-x8632-vinsn mem-set-bit-variable-value (((src :address))
3280 ((src :address)
3281 (offset :lisp)
3282 (value :lisp))
[9456]3283 ((temp :lisp)))
3284 ;; (mark-as-imm temp)
3285 (btrl (:$ub (:apply %hard-regspec-value temp))
3286 (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask))
[7817]3287 (movl (:%l offset) (:%l temp))
3288 (shrl (:$ub (+ 5 x8632::fixnumshift)) (:%l temp))
3289 (leal (:@ (:%l src) (:%l temp) 4) (:%l src))
3290 (movl (:%l offset) (:%l temp))
3291 (shrl (:$ub x8632::fixnumshift) (:%l temp))
3292 (andl (:$l 31) (:%l temp))
3293 (testl (:%l value) (:%l value))
3294 (jne :set)
3295 (btrl (:%l temp) (:@ (:%l src)))
3296 (jmp :done)
3297 :set
3298 (btsl (:%l temp) (:@ (:%l src)))
[9456]3299 :done
3300 ;; (mark-as-node temp)
3301 (xorl (:%l temp) (:%l temp))
3302 (btsl (:$ub (:apply %hard-regspec-value temp))
3303 (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
[7817]3304
[10542]3305
3306(define-x8632-vinsn mem-set-c-bit-variable-value (()
3307 ((src :address)
3308 (offset :s32const)
3309 (value :lisp)))
3310 (testl (:%l value) (:%l value))
3311 (jne :set)
3312 ((:pred = 0 (:apply ash offset -5))
3313 (btrl (:$ub (:apply logand 31 offset))
[11467]3314 (:@ (:%l src))))
[10542]3315 ((:not (:pred = 0 (:apply ash offset -5)))
3316 (btrl (:$ub (:apply logand 31 offset))
[11467]3317 (:@ (:apply ash (:apply ash offset -5) 4) (:%l src))))
[10542]3318 (jmp :done)
3319 :set
3320 ((:pred = 0 (:apply ash offset -5))
3321 (btsl (:$ub (:apply logand 31 offset))
[11467]3322 (:@ (:%l src))))
[10542]3323 ((:not (:pred = 0 (:apply ash offset -5)))
3324 (btsl (:$ub (:apply logand 31 offset))
[11467]3325 (:@ (:apply ash (:apply ash offset -5) 2) (:%l src))))
[10542]3326 :done)
3327
[7286]3328(define-x8632-vinsn %natural+ (((result :u32))
3329 ((result :u32)
3330 (other :u32)))
3331 (addl (:%l other) (:%l result)))
3332
3333(define-x8632-vinsn %natural+-c (((result :u32))
3334 ((result :u32)
[9802]3335 (constant :u32const)))
3336 (addl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
[7286]3337
3338(define-x8632-vinsn %natural- (((result :u32))
[7772]3339 ((result :u32)
3340 (other :u32)))
[7286]3341 (subl (:%l other) (:%l result)))
3342
3343(define-x8632-vinsn %natural--c (((result :u32))
3344 ((result :u32)
[9802]3345 (constant :u32const)))
3346 (subl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
[7286]3347
3348(define-x8632-vinsn %natural-logior (((result :u32))
3349 ((result :u32)
3350 (other :u32)))
3351 (orl (:%l other) (:%l result)))
3352
3353(define-x8632-vinsn %natural-logior-c (((result :u32))
3354 ((result :u32)
[9802]3355 (constant :u32const)))
3356 (orl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
[7286]3357
3358(define-x8632-vinsn %natural-logand (((result :u32))
3359 ((result :u32)
3360 (other :u32)))
3361 (andl (:%l other) (:%l result)))
3362
3363(define-x8632-vinsn %natural-logand-c (((result :u32))
3364 ((result :u32)
[9802]3365 (constant :u32const)))
3366 (andl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
[7286]3367
3368(define-x8632-vinsn %natural-logxor (((result :u32))
3369 ((result :u32)
3370 (other :u32)))
3371 (xorl (:%l other) (:%l result)))
3372
3373(define-x8632-vinsn %natural-logxor-c (((result :u32))
3374 ((result :u32)
[9802]3375 (constant :u32const)))
3376 (xorl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
[7286]3377
3378(define-x8632-vinsn natural-shift-left (((dest :u32))
3379 ((dest :u32)
3380 (amt :u8const)))
3381 (shll (:$ub amt) (:%l dest)))
3382
3383(define-x8632-vinsn natural-shift-right (((dest :u32))
3384 ((dest :u32)
3385 (amt :u8const)))
3386 (shrl (:$ub amt) (:%l dest)))
3387
[7339]3388(define-x8632-vinsn recover-fn (()
3389 ())
3390 (movl (:$self 0) (:%l x8632::fn)))
[7286]3391
[7339]3392;;; xxx probably wrong
3393(define-x8632-vinsn (call-subprim-3 :call :subprim-call) (((dest t))
3394 ((spno :s32const)
3395 (x t)
3396 (y t)
3397 (z t))
3398 ((entry (:label 1))))
3399 (:talign 5)
3400 (call (:@ spno))
3401 (movl (:$self 0) (:%l x8632::fn)))
[7286]3402
[7360]3403(define-x8632-vinsn vcell-ref (((dest :lisp))
3404 ((vcell :lisp)))
3405 (movl (:@ x8632::misc-data-offset (:%l vcell)) (:%l dest)))
3406
3407(define-x8632-vinsn setup-vcell-allocation (()
3408 ())
3409 (movl (:$l x8632::value-cell-header) (:%l x8632::imm0))
3410 (movd (:%l x8632::imm0) (:%mmx x8632::mm0))
3411 (movl (:$l (- x8632::value-cell.size x8632::fulltag-misc)) (:%l x8632::imm0)))
3412
3413(define-x8632-vinsn %init-vcell (()
3414 ((vcell :lisp)
3415 (closed :lisp)))
3416 (movl (:%l closed) (:@ x8632::value-cell.value (:%l vcell))))
3417
[7428]3418;;; "old" mkunwind. Used by PROGV, since the binding of *interrupt-level*
3419;;; on entry to the new mkunwind confuses the issue.
3420
3421(define-x8632-vinsn (mkunwind :call :subprim-call) (()
3422 ((protform-lab :label)
3423 (cleanup-lab :label)))
3424 (leal (:@ (:^ protform-lab) (:%l x8632::fn)) (:%l x8632::ra0))
3425 (leal (:@ (:^ cleanup-lab) (:%l x8632::fn)) (:%l x8632::xfn))
3426 (jmp (:@ .SPmkunwind)))
3427
3428;;; Funcall the function or symbol in temp0 and obtain the single
3429;;; value that it returns.
[8349]3430(define-x8632-subprim-call-vinsn (funcall) .SPfuncall)
[7428]3431
3432(define-x8632-vinsn tail-funcall (()
3433 ()
3434 ((tag :u8)))
[10495]3435 :resume
[7428]3436 (movl (:%l x8632::temp0) (:%l tag))
3437 ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
[8231]3438 (andl (:$b x8632::tagmask) (:%accl tag))
3439 (cmpl (:$b x8632::tag-misc) (:%accl tag)))
3440 ((:pred > (:apply %hard-regspec-value tag) x8632::eax)
3441 (andl (:$b x8632::tagmask) (:%l tag))
[7428]3442 (cmpl (:$b x8632::tag-misc) (:%l tag)))
3443 (jne :bad)
[11029]3444 (movsbl (:@ x8632::misc-subtag-offset (:%l x8632::temp0)) (:%l tag))
3445 (cmpl (:$b x8632::subtag-function) (:%l tag))
[7428]3446 (je :go)
[11029]3447 (cmpl (:$b x8632::subtag-symbol) (:%l tag))
[9191]3448 (cmovel (:@ x8632::symbol.fcell (:%l x8632::temp0)) (:%l x8632::temp0))
[7428]3449 (jne :bad)
3450 :go
[8629]3451 (jmp (:%l x8632::temp0))
[10495]3452
3453 (:anchored-uuo-section :resume)
[7428]3454 :bad
[10495]3455 (:anchored-uuo (uuo-error-not-callable)))
[7428]3456
[7360]3457;;; Magic numbers in here include the address of .SPcall-closure.
3458
3459;;; movl $self, %fn
3460;;; jmp *20660 (.SPcall-closure)
3461(define-x8632-vinsn init-nclosure (()
3462 ((closure :lisp)))
[8750]3463 (movb (:$b 6) (:@ x8632::misc-data-offset (:%l closure))) ;imm word count
[7360]3464 (movb (:$b #xbf) (:@ (+ x8632::misc-data-offset 2) (:%l closure))) ;movl $self, %fn
3465 (movb (:$b #xff) (:@ (+ x8632::misc-data-offset 7) (:%l closure))) ;jmp
[10234]3466 (movl (:$l #x0150b425) (:@ (+ x8632::misc-data-offset 8) (:%l closure))) ;.SPcall-closure
[7360]3467 ;; already aligned
[8750]3468 ;; (movl ($ 0) (:@ (+ x8632::misc-data-offset 12))) ;"end" of self-references
[9191]3469 (movb (:$b 7) (:@ (+ x8632::misc-data-offset 16) (:%l closure))) ;self-reference offset
[15259]3470 (movb (:$b x8632::function-boundary-marker) (:@ (+ x8632::misc-data-offset 20) (:%l closure)))
3471 ;; If the GC moved the closure before we finished creating its
3472 ;; self-reference table, it wouldn't have updated this self-reference
3473 (movl (:%l closure) (:@ (+ x8632::misc-data-offset 3) (:%l closure))))
[7360]3474
3475(define-x8632-vinsn finalize-closure (((closure :lisp))
3476 ((closure :lisp)))
3477 (nop))
3478
3479
3480(define-x8632-vinsn (ref-symbol-value :call :subprim-call)
3481 (((val :lisp))
3482 ((sym (:lisp (:ne val)))))
3483 (:talign 5)
3484 (call (:@ .SPspecrefcheck))
3485 (movl (:$self 0) (:%l x8632::fn)))
3486
[7659]3487(define-x8632-vinsn ref-symbol-value-inline (((dest :lisp))
3488 ((src (:lisp (:ne dest))))
3489 ((table :imm)
3490 (idx :imm)))
[10495]3491 :resume
[7659]3492 (movl (:@ x8632::symbol.binding-index (:%l src)) (:%l idx))
[13561]3493 (xorl (:%l table) (:%l table))
[7659]3494 (rcmpl (:%l idx) (:@ (:%seg :rcontext) x8632::tcr.tlb-limit))
[13561]3495 (cmovael (:%l table) (:%l idx))
[7659]3496 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l table))
3497 (movl (:@ (:%l table) (:%l idx)) (:%l dest))
3498 (cmpl (:$l x8632::subtag-no-thread-local-binding) (:%l dest))
[13561]3499 (cmovel (:@ x8632::symbol.vcell (:%l src)) (:%l dest))
[7659]3500 (cmpl (:$l x8632::unbound-marker) (:%l dest))
[10495]3501 (je :bad)
[7659]3502
[10495]3503 (:anchored-uuo-section :resume)
3504 :bad
3505 (:anchored-uuo (uuo-error-unbound (:%l src))))
3506
[9743]3507(define-x8632-vinsn (%ref-symbol-value :call :subprim-call)
3508 (((val :lisp))
3509 ((sym (:lisp (:ne val)))))
3510 (:talign 5)
3511 (call (:@ .SPspecref))
3512 (movl (:$self 0) (:%l x8632::fn)))
3513
[7428]3514(define-x8632-vinsn %ref-symbol-value-inline (((dest :lisp))
3515 ((src (:lisp (:ne dest))))
[13561]3516 ((idx :imm)))
3517 ;; binding index 0 always contains a no-thread-local-binding
3518 ;; marker, so treat out-of-range indices as 0 to avoid branches.
[7428]3519 (movl (:@ x8632::symbol.binding-index (:%l src)) (:%l idx))
[13561]3520 (xorl (:% dest) (:% dest))
[7428]3521 (rcmpl (:%l idx) (:@ (:%seg :rcontext) x8632::tcr.tlb-limit))
[13561]3522 (cmovael (:% dest) (:% idx))
[7428]3523 (addl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l idx))
3524 (movl (:@ (:%l idx)) (:%l dest))
3525 (cmpl (:$l x8632::subtag-no-thread-local-binding) (:%l dest))
[13561]3526 (cmovel (:@ x8632::symbol.vcell (:%l src)) (:%l dest)))
[7428]3527
[7772]3528(define-x8632-vinsn ref-interrupt-level (((dest :imm))
3529 ()
3530 ((temp :u32)))
3531 (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l temp))
3532 (movl (:@ x8632::interrupt-level-binding-index (:%l temp)) (:%l dest)))
3533
[7360]3534(define-x8632-subprim-lea-jmp-vinsn (bind-nil) .SPbind-nil)
3535
3536(define-x8632-subprim-lea-jmp-vinsn (bind-self) .SPbind-self)
3537
3538(define-x8632-subprim-lea-jmp-vinsn (bind-self-boundp-check) .SPbind-self-boundp-check)
3539
3540(define-x8632-subprim-lea-jmp-vinsn (bind) .SPbind)
3541
3542(define-x8632-vinsn (dpayback :call :subprim-call) (()
3543 ((n :s16const))
3544 ((temp (:u32 #.x8632::imm0))
3545 (entry (:label 1))))
3546 ((:pred > n 0)
3547 ((:pred > n 1)
3548 (movl (:$l n) (:%l temp))
[8349]3549 (:talign 5)
[7360]3550 (call (:@ .SPunbind-n)))
3551 ((:pred = n 1)
3552 (:talign 5)
3553 (call (:@ .SPunbind)))
3554 (movl (:$self 0) (:%l x8632::fn))))
3555
[7428]3556(define-x8632-subprim-jump-vinsn (tail-call-sym-gen) .SPtcallsymgen)
3557
3558(define-x8632-subprim-call-vinsn (make-stack-list) .Spmakestacklist)
3559
3560(define-x8632-vinsn node-slot-ref (((dest :lisp))
3561 ((node :lisp)
3562 (cellno :u32const)))
3563 (movl (:@ (:apply + x8632::misc-data-offset (:apply ash cellno 2))
3564 (:%l node)) (:%l dest)))
3565
3566(define-x8632-subprim-lea-jmp-vinsn (stack-cons-list) .SPstkconslist)
3567
[7659]3568(define-x8632-vinsn save-lexpr-argregs (()
3569 ((min-fixed :u16const)))
3570 ((:pred >= min-fixed $numx8632argregs)
3571 (pushl (:%l x8632::arg_y))
3572 (pushl (:%l x8632::arg_z)))
3573 ((:pred = min-fixed 1) ; at least one arg
[8367]3574 (rcmpl (:%l x8632::nargs) (:$b (ash 1 x8632::word-shift)))
[7659]3575 (je :z1) ;skip arg_y if exactly 1
3576 (pushl (:%l x8632::arg_y))
3577 :z1
3578 (pushl (:%l x8632::arg_z)))
3579 ((:pred = min-fixed 0)
[8367]3580 (rcmpl (:%l x8632::nargs) (:$b (ash 1 x8632::word-shift)))
[7659]3581 (je :z0) ;exactly one
3582 (jl :none) ;none
3583 ;two or more...
3584 (pushl (:%l x8632::arg_y))
3585 :z0
3586 (pushl (:%l x8632::arg_z))
3587 :none
3588 )
3589 ((:not (:pred = min-fixed 0))
3590 (leal (:@ (:apply - (:apply ash min-fixed x8632::word-shift)) (:%l x8632::nargs))
3591 (:%l x8632::nargs)))
3592 (pushl (:%l x8632::nargs))
3593 (movl (:%l x8632::esp) (:%l x8632::arg_z)))
[7428]3594
[7659]3595;;; The frame that was built (by SAVE-LISP-CONTEXT-VARIABLE-ARG-COUNT
3596;;; and SAVE-LEXPR-ARGREGS) contains an unknown number of arguments
3597;;; followed by the count of non-required arguments; the count is on
3598;;; top of the stack and its address is in %arg_z. We need to build a
3599;;; frame so that the function can address its arguments (copies of
3600;;; the required arguments and the lexpr) and locals; when the
3601;;; function returns, it should one or more values (depending on how
3602;;; it was called) and discard the hidden lexpr frame. At this point,
3603;;; %ra0 still contains the "real" return address. If it's not the
3604;;; magic multiple-value address, we can make the function return to
3605;;; something that does a single-value return (.SPpopj); otherwise, we
3606;;; need to make it return multiple values to the real caller. (Unlike
3607;;; the PPC, this case only involves creating one frame here, but that
3608;;; frame has two return addresses.)
3609(define-x8632-vinsn build-lexpr-frame (()
3610 ()
[9123]3611 ((temp :imm)
3612 (ra0 (:lisp #.x8632::ra0))))
[10984]3613 (movl (:@ (:apply + (:apply target-nil-value) (x8632::%kernel-global 'x86::ret1valaddr)))
[7659]3614 (:%l temp))
[9123]3615 (cmpl (:%l temp) (:%l ra0))
[7659]3616 (je :multiple)
[10984]3617 (pushl (:@ (:apply + (:apply target-nil-value) (x8632::%kernel-global 'x86::lexpr-return1v))))
[7659]3618 (jmp :finish)
3619 :multiple
[10984]3620 (pushl (:@ (:apply + (:apply target-nil-value) (x8632::%kernel-global 'x86::lexpr-return))))
[7659]3621 (pushl (:%l temp))
3622 :finish
3623 (pushl (:%l x8632::ebp))
3624 (movl (:%l x8632::esp) (:%l x8632::ebp)))
3625
3626(define-x8632-vinsn copy-lexpr-argument (()
3627 ((n :u16const))
3628 ((temp :imm)))
3629 (movl (:@ (:%l x8632::arg_z)) (:%l temp))
3630 (pushl (:@ (:apply ash n x8632::word-shift) (:%l x8632::arg_z) (:%l temp))))
3631
3632(define-x8632-vinsn %current-tcr (((dest :lisp))
3633 ())
3634 (movl (:@ (:%seg :rcontext) x8632::tcr.linear) (:%l dest)))
3635
[7360]3636(define-x8632-vinsn (setq-special :call :subprim-call)
3637 (()
3638 ((sym :lisp)
3639 (val :lisp))
3640 ((entry (:label 1))))
3641 (:talign 5)
3642 (call (:@ .SPspecset))
3643 (movl (:$self 0) (:%l x8632::fn)))
3644
[7817]3645(define-x8632-vinsn pop-argument-registers (()
3646 ())
[8367]3647 (testl (:%l x8632::nargs) (:%l x8632::nargs))
[7817]3648 (je :done)
[8367]3649 (rcmpl (:%l x8632::nargs) (:$l (ash 1 x8632::word-shift)))
[7817]3650 (popl (:%l x8632::arg_z))
3651 (je :done)
[8629]3652 (popl (:%l x8632::arg_y))
[7817]3653 :done)
3654
[7360]3655(define-x8632-vinsn %symptr->symvector (((target :lisp))
3656 ((target :lisp)))
3657 (nop))
3658
3659(define-x8632-vinsn %symvector->symptr (((target :lisp))
3660 ((target :lisp)))
3661 (nop))
3662
[7659]3663(define-x8632-subprim-lea-jmp-vinsn (spread-lexpr) .SPspread-lexpr-z)
3664
[7772]3665(define-x8632-vinsn mem-ref-double-float (((dest :double-float))
3666 ((src :address)
3667 (index :s32)))
3668 (movsd (:@ (:%l src) (:%l index)) (:%xmm dest)))
3669
3670(define-x8632-vinsn mem-ref-single-float (((dest :single-float))
3671 ((src :address)
3672 (index :s32)))
3673 (movss (:@ (:%l src) (:%l index)) (:%xmm dest)))
3674
[9678]3675;;; This would normally be put in %nargs, but we need an
3676;;; extra node register for passing stuff into
3677;;; SPdestructuring_bind and friends.
[7772]3678(define-x8632-vinsn load-adl (()
3679 ((n :u32const)))
[9678]3680 (movl (:$l n) (:%l x8632::imm0)))
[7772]3681
3682(define-x8632-subprim-lea-jmp-vinsn (macro-bind) .SPmacro-bind)
3683
3684(define-x8632-subprim-lea-jmp-vinsn (destructuring-bind-inner) .SPdestructuring-bind-inner)
3685
3686(define-x8632-subprim-lea-jmp-vinsn (destructuring-bind) .SPdestructuring-bind)
3687
3688
[7360]3689(define-x8632-vinsn symbol-function (((val :lisp))
3690 ((sym (:lisp (:ne val))))
3691 ((tag :u8)))
[10495]3692 :resume
[7360]3693 (movl (:@ x8632::symbol.fcell (:%l sym)) (:%l val))
3694 (movl (:%l val) (:%l tag))
[11029]3695 (andl (:$b x8632::tagmask) (:%l tag))
3696 (cmpl (:$b x8632::tag-misc) (:%l tag))
[9692]3697 (jne :bad)
[11029]3698 (movsbl (:@ x8632::misc-subtag-offset (:%l val)) (:%l tag))
3699 (cmpl (:$b x8632::subtag-function) (:%l tag))
[10495]3700 (jne :bad)
3701
3702 (:anchored-uuo-section :resume)
[7360]3703 :bad
[10495]3704 (:anchored-uuo (uuo-error-udf (:%l sym))))
[7360]3705
[7428]3706(define-x8632-subprim-jump-vinsn (tail-call-fn-slide) .SPtcallnfnslide)
3707
3708(define-x8632-vinsn load-double-float-constant (((dest :double-float))
3709 ((lab :label)))
3710 (movsd (:@ (:^ lab) (:%l x8632::fn)) (:%xmm dest)))
3711
3712(define-x8632-vinsn load-single-float-constant (((dest :single-float))
3713 ((lab :label)))
3714 (movss (:@ (:^ lab) (:%l x8632::fn)) (:%xmm dest)))
3715
3716(define-x8632-subprim-call-vinsn (misc-set) .SPmisc-set)
3717
3718(define-x8632-subprim-lea-jmp-vinsn (slide-values) .SPmvslide)
3719
3720(define-x8632-subprim-lea-jmp-vinsn (spread-list) .SPspreadargz)
3721
[7659]3722;;; Even though it's implemented by calling a subprim, THROW is really
3723;;; a JUMP (to a possibly unknown destination). If the destination's
3724;;; really known, it should probably be inlined (stack-cleanup, value
3725;;; transfer & jump ...)
[10339]3726(define-x8632-vinsn (throw :jump-unknown) (()
[7659]3727 ()
[9678]3728 ((entry (:label 1))
3729 (ra (:lisp #.x8632::ra0))))
3730 (leal (:@ (:^ :back) (:%l x8632::fn)) (:%l ra))
[7659]3731 (:talign 5)
3732 (jmp (:@ .SPthrow))
3733 :back
[10339]3734 (movl (:$self 0) (:%l x8632::fn))
3735 (uuo-error-reg-not-tag (:%l x8632::temp0) (:$ub x8632::subtag-catch-frame)))
[7659]3736
[7428]3737(define-x8632-vinsn unbox-base-char (((dest :u32))
3738 ((src :lisp)))
3739 (movl (:%l src) (:%l dest))
3740 ((:pred = (:apply %hard-regspec-value dest) x8632::eax)
3741 (cmpb (:$b x8632::subtag-character) (:%accb dest)))
3742 ((:and (:pred > (:apply %hard-regspec-value dest) x8632::eax)
3743 (:pred <= (:apply %hard-regspec-value dest) x8632::ebx))
3744 (cmpb (:$b x8632::subtag-character) (:%b dest)))
3745 ((:pred > (:apply %hard-regspec-value dest) x8632::ebx)
3746 ;; very rare case, if even possible...
3747 (andl (:$l #xff) (:%l dest))
3748 (cmpl (:$b x8632::subtag-character) (:%l dest))
3749 (cmovel (:%l src) (:%l dest)))
[9692]3750 (je ::got-it)
[7428]3751 (uuo-error-reg-not-tag (:%l src) (:$ub x8632::subtag-character))
3752 :got-it
3753 (shrl (:$ub x8632::charcode-shift) (:%l dest)))
3754
3755(define-x8632-subprim-lea-jmp-vinsn (save-values) .SPsave-values)
3756
3757(define-x8632-subprim-lea-jmp-vinsn (recover-values) .SPrecover-values)
3758
3759(define-x8632-subprim-lea-jmp-vinsn (recover-values-for-mvcall) .SPrecover-values-for-mvcall)
3760
3761(define-x8632-subprim-lea-jmp-vinsn (add-values) .SPadd-values)
3762
3763(define-x8632-subprim-call-vinsn (make-stack-block) .SPmakestackblock)
3764
3765(define-x8632-subprim-call-vinsn (make-stack-block0) .Spmakestackblock0)
3766
3767;;; "dest" is preallocated, presumably on a stack somewhere.
[7817]3768(define-x8632-vinsn store-single (()
3769 ((dest :lisp)
3770 (source :single-float))
3771 ())
3772 (movss (:%xmm source) (:@ x8632::single-float.value (:%l dest))))
3773
3774;;; "dest" is preallocated, presumably on a stack somewhere.
[7428]3775(define-x8632-vinsn store-double (()
3776 ((dest :lisp)
3777 (source :double-float))
3778 ())
3779 (movsd (:%xmm source) (:@ x8632::double-float.value (:%l dest))))
3780
[7765]3781(define-x8632-vinsn fixnum->char (((dest :lisp))
3782 ((src :imm))
3783 ((temp :u32)))
3784 (movl (:%l src) (:%l temp))
[10363]3785 (sarl (:$ub (+ x8632::fixnumshift 1)) (:%l temp))
3786 (cmpl (:$l (ash #xfffe -1)) (:%l temp))
3787 (je :bad-if-eq)
3788 (sarl (:$ub (- 11 1)) (:%l temp))
[7765]3789 (cmpl (:$b (ash #xd800 -11))(:%l temp))
[10363]3790 :bad-if-eq
[10984]3791 (movl (:$l (:apply target-nil-value)) (:%l temp))
[7765]3792 (cmovel (:%l temp) (:%l dest))
3793 (je :done)
3794 ((:not (:pred =
3795 (:apply %hard-regspec-value dest)
3796 (:apply %hard-regspec-value src)))
3797 (movl (:%l src) (:%l dest)))
3798 (shll (:$ub (- x8632::charcode-shift x8632::fixnumshift)) (:%l dest))
[10363]3799 (addl (:$b x8632::subtag-character) (:%l dest))
[7765]3800 :done)
[7428]3801
[10363]3802;;; src is known to be a code for which CODE-CHAR returns non-nil.
3803(define-x8632-vinsn code-char->char (((dest :lisp))
3804 ((src :imm))
3805 ())
3806 ((:not (:pred =
3807 (:apply %hard-regspec-value dest)
3808 (:apply %hard-regspec-value src)))
3809 (movl (:%l src) (:%l dest)))
3810 (shll (:$ub (- x8632::charcode-shift x8632::fixnumshift)) (:%l dest))
3811 (addl (:$b x8632::subtag-character) (:%l dest))
3812 :done)
3813
[7772]3814(define-x8632-vinsn sign-extend-halfword (((dest :imm))
3815 ((src :imm)))
3816 (movl (:%l src ) (:%l dest))
[11355]3817 (shll (:$ub (- 16 x8632::fixnumshift)) (:%l dest))
3818 (sarl (:$ub (- 16 x8632::fixnumshift)) (:%l dest)))
[7765]3819
[7428]3820(define-x8632-subprim-jump-vinsn (tail-funcall-gen) .SPtfuncallgen)
3821
3822(define-x8632-vinsn %init-gvector (()
3823 ((v :lisp)
3824 (nbytes :u32const))
3825 ((count :imm)))
3826 (movl (:$l nbytes) (:%l count))
3827 (jmp :test)
3828 :loop
3829 (popl (:@ x8632::misc-data-offset (:%l v) (:%l count)))
3830 :test
3831 (subl (:$b x8632::node-size) (:%l count))
3832 (jge :loop))
3833
3834(define-x8632-subprim-jump-vinsn (tail-funcall-slide) .SPtfuncallslide)
3835
3836(define-x8632-vinsn nth-value (((result :lisp))
3837 ()
[8629]3838 ((temp :u32)
3839 (nargs (:lisp #.x8632::nargs))))
[7428]3840 (leal (:@ (:%l x8632::esp) (:%l x8632::nargs)) (:%l temp))
3841 (subl (:@ (:%l temp)) (:%l x8632::nargs))
[10984]3842 (movl (:$l (:apply target-nil-value)) (:%l result))
[7428]3843 (jle :done)
3844 ;; I -think- that a CMOV would be safe here, assuming that N wasn't
3845 ;; extremely large. Don't know if we can assume that.
3846 (movl (:@ (- x8632::node-size) (:%l x8632::esp) (:%l x8632::nargs)) (:%l result))
3847 :done
3848 (leal (:@ x8632::node-size (:%l temp)) (:%l x8632::esp)))
3849
3850
3851(define-x8632-subprim-lea-jmp-vinsn (req-heap-rest-arg) .SPreq-heap-rest-arg)
3852
3853(define-x8632-subprim-call-vinsn (stack-misc-alloc-init) .SPstack-misc-alloc-init)
3854
3855(define-x8632-vinsn %debug-trap (()
3856 ())
3857 (uuo-error-debug-trap))
3858
[7659]3859(define-x8632-vinsn double-to-single (((result :single-float))
3860 ((arg :double-float)))
3861 (cvtsd2ss (:%xmm arg) (:%xmm result)))
[7428]3862
[7659]3863(define-x8632-vinsn single-to-double (((result :double-float))
3864 ((arg :single-float)))
3865 (cvtss2sd (:%xmm arg) (:%xmm result)))
[7428]3866
[7659]3867(define-x8632-vinsn alloc-c-frame (()
[8629]3868 ((nwords :u32const))
3869 ((temp :imm)))
[7659]3870 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
[11421]3871 ;; Work around Apple bug number 6386516 (open stub may clobber stack)
3872 ;; by leaving an extra word of space in the parameter area.
3873 (subl (:$l (:apply ash (:apply 1+ nwords) x8632::word-shift))
[8629]3874 (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
3875 ;; align stack to 16-byte boundary
3876 (andb (:$b -16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[10561]3877 (subl (:$b (* 2 x8632::node-size)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[8629]3878 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]3879 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
3880 (movl (:% x8632::ebp) (:@ 4 (:%l temp))))
[7428]3881
[8902]3882(define-x8632-vinsn alloc-variable-c-frame (()
3883 ((nwords :imm))
3884 ((temp :imm)))
3885 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
[11421]3886 ;; Work around Apple bug number 6386516 (open stub may clobber stack)
3887 ;; by leaving an extra word of space in the parameter area.
3888 ;; Note that nwords is a fixnum.
3889 (leal (:@ 4 (:%l nwords)) (:%l temp))
[11414]3890 (subl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[8902]3891 ;; align stack to 16-byte boundary
3892 (andb (:$b -16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[10561]3893 (subl (:$b (* 2 x8632::node-size)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[8902]3894 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]3895 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
3896 (movl (:% x8632::ebp) (:@ 4 (:%l temp))))
[8902]3897
[7659]3898(define-x8632-vinsn set-c-arg (()
3899 ((arg :u32)
[8629]3900 (offset :u32const))
3901 ((temp :imm)))
3902 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]3903 (movl (:%l arg) (:@ (:apply + 8 (:apply ash offset 2)) (:%l temp))))
[7428]3904
[8750]3905;;; This is a pretty big crock.
3906(define-x8632-vinsn set-c-arg-from-mm0 (()
3907 ((offset :u32const))
3908 ((temp :imm)))
3909 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]3910 (movq (:%mmx x8632::mm0) (:@ (:apply + 8 (:apply ash offset 2)) (:%l temp))))
[8750]3911
[7659]3912(define-x8632-vinsn eep.address (((dest t))
3913 ((src (:lisp (:ne dest )))))
[10495]3914 :resume
[7659]3915 (movl (:@ (+ (ash 1 x8632::word-shift) x8632::misc-data-offset) (:%l src))
3916 (:%l dest))
[10984]3917 (cmpl (:$l (:apply target-nil-value)) (:%l dest))
[10495]3918 (je :bad)
[7659]3919
[10495]3920 (:anchored-uuo-section :resume)
3921 :bad
3922 (:anchored-uuo (uuo-error-eep-unresolved (:%l src) (:%l dest))))
3923
[7765]3924(define-x8632-subprim-lea-jmp-vinsn (heap-cons-rest-arg) .SPheap-cons-rest-arg)
3925
3926(define-x8632-subprim-lea-jmp-vinsn (stack-cons-rest-arg) .SPstack-cons-rest-arg)
3927
3928(define-x8632-subprim-lea-jmp-vinsn (make-stack-vector) .SPmkstackv)
3929
[7772]3930(define-x8632-vinsn %current-frame-ptr (((dest :imm))
3931 ())
3932 (movl (:%l x8632::ebp) (:%l dest)))
3933
3934(define-x8632-vinsn %foreign-stack-pointer (((dest :imm))
3935 ())
3936 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l dest)))
3937
3938
[7360]3939(define-x8632-vinsn %slot-ref (((dest :lisp))
3940 ((instance (:lisp (:ne dest)))
3941 (index :lisp)))
3942 (movl (:@ x8632::misc-data-offset (:%l instance) (:%l index)) (:%l dest))
[7765]3943 (cmpl (:$l x8632::slot-unbound-marker) (:%l dest))
[10495]3944 (je :bad)
[11107]3945 :resume
[10495]3946 (:anchored-uuo-section :resume)
3947 :bad
3948 (:anchored-uuo (uuo-error-slot-unbound (:%l dest) (:%l instance) (:%l index))))
[7659]3949
3950
[10495]3951
[7360]3952(define-x8632-vinsn symbol-ref (((dest :lisp))
3953 ((src :lisp)
3954 (cellno :u32const)))
3955 (movl (:@ (:apply + (- x8632::node-size x8632::fulltag-misc)
3956 (:apply ash cellno 2))
3957 (:%l src)) (:%l dest)))
3958
[10542]3959(define-x8632-vinsn mem-ref-c-bit-fixnum (((dest :lisp))
3960 ((src :address)
3961 (offset :s32const))
3962 ((temp :imm)))
3963 ((:pred = 0 (:apply ash offset -5))
3964 (btl (:$ub (:apply logand 31 offset))
3965 (:@ (:%l src))))
3966 ((:not (:pred = 0 (:apply ash offset -5)))
3967 (btl (:$ub (:apply logand 31 offset))
[11467]3968 (:@ (:apply ash (:apply ash offset -5) 2) (:%l src))))
3969 (movl (:$l x8632::fixnumone) (:%l temp))
[10542]3970 (movl (:$l 0) (:%l dest))
3971 (cmovbl (:%l temp) (:%l dest)))
3972
[7817]3973(define-x8632-vinsn mem-ref-bit-fixnum (((dest :lisp)
3974 (src :address))
3975 ((src :address)
3976 (offset :lisp))
[9462]3977 ((temp :lisp)))
3978 ;; (mark-as-imm temp)
3979 (btrl (:$ub (:apply %hard-regspec-value temp))
3980 (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask))
[7817]3981 (movl (:%l offset) (:%l temp))
3982 (shrl (:$ub (+ 5 x8632::fixnumshift)) (:%l temp))
3983 (leal (:@ (:%l src) (:%l temp) 4) (:%l src))
3984 (movl (:%l offset) (:%l temp))
3985 (shrl (:$ub x8632::fixnumshift) (:%l temp))
3986 (andl (:$l 31) (:%l temp))
3987 (btl (:%l temp) (:@ (:%l src)))
3988 (movl (:$l x8632::fixnumone) (:%l temp))
3989 (leal (:@ (- x8632::fixnumone) (:%l temp)) (:%l dest))
[9462]3990 (cmovbl (:%l temp) (:%l dest))
3991 ;; (mark-as-node temp)
3992 (xorl (:%l temp) (:%l temp))
3993 (btsl (:$ub (:apply %hard-regspec-value temp))
3994 (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
[7817]3995
[7428]3996(define-x8632-subprim-call-vinsn (progvsave) .SPprogvsave)
3997
3998(define-x8632-subprim-jump-vinsn (progvrestore) .SPprogvrestore)
3999
4000(define-x8632-subprim-lea-jmp-vinsn (simple-keywords) .SPsimple-keywords)
4001
4002(define-x8632-subprim-lea-jmp-vinsn (keyword-args) .SPkeyword-args)
4003
4004(define-x8632-subprim-lea-jmp-vinsn (keyword-bind) .SPkeyword-bind)
4005
[8629]4006(define-x8632-vinsn set-high-halfword (()
4007 ((dest :imm)
4008 (n :s16const)))
4009 (orl (:$l (:apply ash n 16)) (:%l dest)))
4010
[7360]4011(define-x8632-vinsn scale-nargs (()
4012 ((nfixed :s16const)))
4013 ((:pred > nfixed 0)
[8367]4014 ((:pred < nfixed 32)
4015 (subl (:$b (:apply ash nfixed x8632::word-shift)) (:%l x8632::nargs)))
4016 ((:pred >= nfixed 32)
4017 (subl (:$l (:apply ash nfixed x8632::word-shift)) (:%l x8632::nargs)))))
[7360]4018
[7428]4019(define-x8632-vinsn opt-supplied-p (()
[10234]4020 ((num-opt :u16const))
4021 ((nargs (:u32 #.x8632::nargs))
4022 (imm :imm)))
4023 (xorl (:%l imm) (:%l imm))
[10984]4024 (movl (:$l (:apply target-nil-value)) (:%l x8632::arg_y))
[10234]4025 :loop
4026 (rcmpl (:%l imm) (:%l nargs))
4027 (movl (:%l x8632::arg_y) (:%l x8632::arg_z))
4028 (cmovll (:@ (+ x8632::t-offset x8632::symbol.vcell) (:%l x8632::arg_y)) (:%l x8632::arg_z))
4029 (addl (:$b x8632::node-size) (:%l imm))
4030 (rcmpl (:%l imm) (:$l (:apply ash num-opt x8632::fixnumshift)))
4031 (pushl (:%l x8632::arg_z))
4032 (jne :loop))
[7428]4033
4034(define-x8632-vinsn one-opt-supplied-p (()
[8629]4035 ()
4036 ((temp :u32)))
[8367]4037 (testl (:%l x8632::nargs) (:%l x8632::nargs))
[8629]4038 (setne (:%b temp))
4039 (negb (:%b temp))
4040 (andl (:$b x8632::t-offset) (:%l temp))
[10984]4041 (addl (:$l (:apply target-nil-value)) (:%l temp))
[8629]4042 (pushl (:%l temp)))
[7428]4043
4044;; needs some love
[7360]4045(define-x8632-vinsn two-opt-supplied-p (()
[7428]4046 ())
[8367]4047 (rcmpl (:%l x8632::nargs) (:$b (:apply ash 2 x8632::word-shift)))
[7428]4048 (jge :two)
[8367]4049 (rcmpl (:%l x8632::nargs) (:$b (:apply ash 1 x8632::word-shift)))
[7428]4050 (je :one)
4051 ;; none
[10984]4052 (pushl (:$l (:apply target-nil-value)))
4053 (pushl (:$l (:apply target-nil-value)))
[7428]4054 (jmp :done)
4055 :one
[10984]4056 (pushl (:$l (:apply target-t-value)))
4057 (pushl (:$l (:apply target-nil-value)))
[7428]4058 (jmp :done)
4059 :two
[10984]4060 (pushl (:$l (:apply target-t-value)))
4061 (pushl (:$l (:apply target-t-value)))
[7428]4062 :done)
[7360]4063
[7428]4064(define-x8632-vinsn set-c-flag-if-constant-logbitp (()
4065 ((bit :u8const)
4066 (int :imm)))
4067 (btl (:$ub bit) (:%l int)))
4068
[7877]4069(define-x8632-vinsn set-c-flag-if-variable-logbitp (()
4070 ((bit :imm)
4071 (int :imm))
[9451]4072 ((temp :u32)))
4073 (movl (:%l bit) (:%l temp))
4074 (sarl (:$ub x8632::fixnumshift) (:%l temp))
4075 (addl (:$b x8632::fixnumshift) (:%l temp))
4076 ;; Would be nice to use a cmov here, but the branch is probably
4077 ;; cheaper than trying to scare up an additional unboxed temporary.
4078 (cmpb (:$ub 31) (:%b temp))
4079 (jbe :test)
4080 (movl (:$l 31) (:%l temp))
4081 :test
4082 (btl (:%l temp) (:%l int)))
[7877]4083
[7772]4084(define-x8632-vinsn multiply-immediate (((dest :imm))
4085 ((src :imm)
4086 (const :s32const)))
4087 ((:and (:pred >= const -128) (:pred <= const 127))
4088 (imull (:$b const) (:%l src) (:%l dest)))
4089 ((:not (:and (:pred >= const -128) (:pred <= const 127)))
4090 (imull (:$l const) (:%l src) (:%l dest))))
4091
4092(define-x8632-vinsn multiply-fixnums (((dest :imm))
4093 ((x :imm)
4094 (y :imm))
4095 ((unboxed :s32)))
4096 ((:pred =
4097 (:apply %hard-regspec-value x)
4098 (:apply %hard-regspec-value dest))
4099 (movl (:%l y) (:%l unboxed))
4100 (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
4101 (imull (:%l unboxed) (:%l dest)))
4102 ((:and (:not (:pred =
4103 (:apply %hard-regspec-value x)
4104 (:apply %hard-regspec-value dest)))
4105 (:pred =
4106 (:apply %hard-regspec-value y)
4107 (:apply %hard-regspec-value dest)))
4108 (movl (:%l x) (:%l unboxed))
4109 (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
4110 (imull (:%l unboxed) (:%l dest)))
4111 ((:and (:not (:pred =
4112 (:apply %hard-regspec-value x)
4113 (:apply %hard-regspec-value dest)))
4114 (:not (:pred =
4115 (:apply %hard-regspec-value y)
4116 (:apply %hard-regspec-value dest))))
4117 (movl (:%l y) (:%l dest))
4118 (movl (:%l x) (:%l unboxed))
4119 (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
4120 (imull (:%l unboxed) (:%l dest))))
4121
4122
[7428]4123(define-x8632-vinsn mark-as-imm (()
[7659]4124 ((reg :imm)))
[7428]4125 (btrl (:$ub (:apply %hard-regspec-value reg)) (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
4126
[15022]4127(define-x8632-vinsn mark-as-node (((reg :imm))
[7659]4128 ((reg :imm)))
[7428]4129 (xorl (:%l reg) (:%l reg))
4130 (btsl (:$ub (:apply %hard-regspec-value reg)) (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
4131
[11297]4132(define-x8632-vinsn mark-temp1-as-node-preserving-flags (()
4133 ()
4134 ((reg (:u32 #.x8632::temp1))))
4135 (movl (:$l 0) (:%l reg)) ;not xorl!
4136 (cld)) ;well, preserving most flags.
4137
[11290]4138
[11297]4139
4140
[7765]4141(define-x8632-vinsn (temp-push-unboxed-word :push :word :csp)
4142 (()
[8629]4143 ((w :u32))
4144 ((temp :imm)))
[7765]4145 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
[10561]4146 (subl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[8629]4147 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
4148 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
[10561]4149 (movl (:%l x8632::ebp) (:@ 4 (:%l temp)))
4150 (movl (:%l w) (:@ 8 (:%l temp))))
[7765]4151
4152(define-x8632-vinsn (temp-pop-unboxed-word :pop :word :csp)
4153 (((w :u32))
[8687]4154 ())
4155 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l w))
[10561]4156 (movl (:@ 8 (:%l w)) (:%l w))
4157 (addl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
[7765]4158
[11297]4159(define-x8632-vinsn (temp-pop-temp1-as-unboxed-word :pop :word :csp)
4160 (()
4161 ()
4162 ((w (:u32 #.x8632::temp1))))
4163 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l w))
4164 (std)
4165 (movl (:@ 8 (:%l w)) (:%l w))
4166 (addl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
4167
[7817]4168(define-x8632-vinsn (temp-push-node :push :word :tsp)
4169 (()
4170 ((w :lisp))
4171 ((temp :imm)))
4172 (subl (:$b (* 2 x8632::dnode-size)) (:@ (:%seg :rcontext) x8632::tcr.next-tsp))
4173 (movd (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%mmx x8632::stack-temp))
4174 (movl (:@ (:%seg :rcontext) x8632::tcr.next-tsp) (:%l temp))
[9123]4175 (movsd (:%xmm x8632::fpzero) (:@ (:%l temp)))
4176 (movsd (:%xmm x8632::fpzero) (:@ x8632::dnode-size (:%l temp)))
[7817]4177 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
4178 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
4179 (movl (:%l w) (:@ x8632::dnode-size (:%l temp))))
4180
4181(define-x8632-vinsn (temp-pop-node :pop :word :tsp)
4182 (((w :lisp))
4183 ()
4184 ((temp :imm)))
4185 (movl (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%l temp))
4186 (movl (:@ x8632::dnode-size (:%l temp)) (:%l w))
4187 (movl (:@ (:%l temp)) (:%l temp))
4188 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
4189 (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.next-tsp)))
4190
[7877]4191(define-x8632-vinsn (temp-push-single-float :push :word :csp)
4192 (()
[8629]4193 ((f :single-float))
4194 ((temp :imm)))
[7877]4195 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
[10561]4196 (subl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[8629]4197 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
4198 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
[10561]4199 (movl (:%l x8632::ebp) (:@ 4 (:%l temp)))
4200 (movss (:%xmm f) (:@ 8 (:%l temp))))
[7877]4201
4202(define-x8632-vinsn (temp-pop-single-float :pop :word :csp)
4203 (((f :single-float))
[8629]4204 ()
4205 ((temp :imm)))
4206 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
[10561]4207 (movss (:@ 8 (:%l temp)) (:%xmm f))
4208 (addl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
[7877]4209
4210(define-x8632-vinsn (temp-push-double-float :push :word :csp)
4211 (()
[8629]4212 ((f :double-float))
4213 ((temp :imm)))
[7877]4214 (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
4215 (subl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
[8629]4216 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
4217 (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
[10561]4218 (movl (:%l x8632::ebp) (:@ 4 (:%l temp)))
[8629]4219 (movsd (:%xmm f) (:@ 8 (:%l temp))))
[7877]4220
4221(define-x8632-vinsn (temp-pop-double-float :pop :word :csp)
4222 (((f :double-float))
[8629]4223 ()
4224 ((temp :imm)))
4225 (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
4226 (movsd (:@ 8 (:%l temp)) (:%xmm f))
[7877]4227 (addl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
4228
[9041]4229(define-x8632-vinsn load-next-method-context (((dest :lisp))
4230 ())
[9042]4231 (movl (:@ (:%seg :rcontext) x8632::tcr.next-method-context) (:%l dest))
[9041]4232 (movl (:$l 0) (:@ (:%seg :rcontext) x8632::tcr.next-method-context)))
4233
[9265]4234(define-x8632-vinsn save-node-register-to-spill-area (()
4235 ((src :lisp)))
4236 ;; maybe add constant to index slot 0--3
4237 (movl (:%l src) (:@ (:%seg :rcontext) x8632::tcr.save3)))
4238
4239(define-x8632-vinsn load-node-register-from-spill-area (((dest :lisp))
4240 ())
4241 (movl (:@ (:%seg :rcontext) x8632::tcr.save3) (:%l dest))
4242 (movss (:%xmm x8632::fpzero) (:@ (:%seg :rcontext) x8632::tcr.save3)))
4243
[10234]4244(define-x8632-vinsn align-loop-head (()
4245 ())
[11297]4246)
[10234]4247
[14776]4248(define-x8632-vinsn double-float-negate (((reg :double-float))
[14777]4249 ((reg :double-float)
4250 (tmp :double-float)))
4251 (movsd (:@ (:^ :const) (:% x8632::fn)) (:%xmm tmp))
4252 (pxor (:%xmm tmp) (:%xmm reg))
4253
[14776]4254 (:uuo-section)
4255 :const
4256 (:long 0)
[14777]4257 (:long #x-80000000))
[14776]4258
4259(define-x8632-vinsn single-float-negate (((reg :single-float))
[14777]4260 ((reg :single-float)
4261 (tmp :single-float)))
4262 (movss (:@ (:^ :const) (:% x8632::fn)) (:%xmm tmp))
4263 (pxor (:%xmm tmp) (:%xmm reg))
[14776]4264 (:uuo-section)
4265 :const
[14777]4266 (:long #x80000000))
[14776]4267
[14943]4268(define-x8632-vinsn fixnum-ref-c-double-float (((dest :double-float))
4269 ((base :imm)
4270 (idx :u32const)))
4271 (movsd (:@ (:apply ash idx 3) (:%l base)) (:%xmm dest)))
4272
4273(define-x8632-vinsn fixnum-ref-double-float (((dest :double-float))
4274 ((base :imm)
4275 (idx :imm)))
4276 (movsd (:@ (:%l base) (:%l idx) 2) (:%xmm dest)))
4277
4278(define-x8632-vinsn fixnum-set-c-double-float (()
4279 ((base :imm)
4280 (idx :u32const)
4281 (val :double-float)))
4282 (movsd (:%xmm val) (:@ (:apply ash idx 3) (:%l base))))
4283
4284(define-x8632-vinsn fixnum-set-double-float (()
4285 ((base :imm)
4286 (idx :imm)
4287 (val :double-float)))
4288 (movsd (:%xmm val) (:@ (:%l base) (:%l idx) 2)))
4289
[14969]4290(define-x8632-vinsn pop-outgoing-arg (((n :u16const))
4291 ())
4292 (popl (:@ (:apply * n (- x8632::node-size)) (:%l x8632::ebp))))
4293
4294(define-x8632-vinsn slide-nth-arg (()
4295 ((n :u16const)
4296 (nstackargs :u16const)
4297 (temp :lisp)))
4298 (movl (:@ (:apply * (:apply - nstackargs (:apply + 1 n)) x8632::node-size) (:%l x8632::esp)) (:%l temp))
4299 (movl (:%l temp) (:@ (:apply * (:apply + n 1) (- x8632::node-size)) (:%l x8632::ebp))))
4300
4301(define-x8632-vinsn set-tail-vsp (((n :u16const))
4302 ())
4303 ((:pred = 0 n)
4304 (movl (:%l x8632::ebp) (:%l x8632::esp)))
4305 ((:not (:pred = 0 n))
4306 (leal (:@ (:apply * n (- x8632::node-size)) (:%l x8632::ebp)) (:%l x8632::esp))))
4307
4308;;; If we've have outgoing arguments in a tail call and are calling
4309;;; some function (rather than jumping to an internal entry point), we
4310;;; need to push the caller's return address and unlink its frame
4311;;; pointer.
4312(define-x8632-vinsn prepare-tail-call (()
4313 ())
4314 (pushl (:@ x8632::node-size (:%l x8632::ebp)))
4315 (movl (:@ (:% x8632::ebp)) (:% x8632::ebp)))
4316
[15006]4317(define-x8632-vinsn (skip-unless-fixnum-in-range :branch)
4318 (((idx :u32))
4319 ((reg :imm)
4320 (minval :s32const)
4321 (maxval :u32const)
4322 (default :label)))
[15004]4323 (testl (:$l x8632::fixnummask) (:%l reg))
[14998]4324 (jne default)
[15006]4325 (movl (:%l reg) (:%l idx))
4326 (sarl (:$ub x8632::fixnumshift) (:%l idx))
[14998]4327 ((:not (:pred zerop minval))
[15006]4328 ((:and (:pred < minval 128) (:pred >= minval -128))
4329 (subl (:$b minval) (:%l idx)))
4330 ((:not (:and (:pred < minval 128) (:pred >= minval -128)))
4331 (subl (:$l minval) (:%l idx))))
4332 ((:pred < maxval 128)
4333 (cmpl (:$b maxval) (:%l idx)))
4334 ((:pred >= maxval 128)
4335 (cmpl (:$l maxval) (:%l idx)))
4336 (jae default))
4337
4338(define-x8632-vinsn (ijmp :branch) (((reg :u32))
4339 ((reg :u32)
4340 (count :s32const))
4341 ((rjmp :lisp)))
4342 (movl (:@ (:^ :jtab) (:%l x8632::fn) (:%l reg) 4) (:%l reg))
[15004]4343 (leal (:@ (:%l x8632::fn) (:%l reg)) (:%l rjmp))
[14998]4344 (jmp (:%l rjmp))
4345 (:uuo-section)
4346 (:align 2)
[15006]4347 (:long count)
[14998]4348 :jtab)
4349
4350(define-x8632-vinsn jtabentry (()
4351 ((label :label)))
4352 (:uuo-section)
4353 (:long (:^ label)))
4354
[7286]4355(queue-fixup
4356 (fixup-x86-vinsn-templates
4357 *x8632-vinsn-templates*
[10754]4358 x86::*x86-opcode-template-lists* *x8632-backend*))
[7286]4359
[9376]4360(provide "X8632-VINSNS")
Note: See TracBrowser for help on using the repository browser.