source: trunk/source/compiler/X86/X8632/x8632-vinsns.lisp @ 11029

Last change on this file since 11029 was 11029, checked in by rme, 12 years ago

Avoid some partial-register writes.

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