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

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

Merge fix for ticket:1335 (r16675) to 1.11 release branch.

Closes ticket:1335.

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