source: branches/lscan/source/compiler/X86/X8632/x8632-vinsns.lisp

Last change on this file was 16543, checked in by Gary Byers, 9 years ago

restore x8632 support, hopefully.

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