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

Last change on this file was 16078, checked in by Gary Byers, 11 years ago

Pass the test suite on x8632/x8664 on this branch.

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