Correct disassembly of some SSE instructions on x86-64.
[sbcl.git] / src / compiler / x86-64 / insts.lisp
1 ;;;; that part of the description of the x86-64 instruction set
2 ;;;; which can live on the cross-compilation host
3
4 ;;;; This software is part of the SBCL system. See the README file for
5 ;;;; more information.
6 ;;;;
7 ;;;; This software is derived from the CMU CL system, which was
8 ;;;; written at Carnegie Mellon University and released into the
9 ;;;; public domain. The software is in the public domain and is
10 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
11 ;;;; files for more information.
12
13 (in-package "SB!VM")
14 ;;; FIXME: SB!DISASSEM: prefixes are used so widely in this file that
15 ;;; I wonder whether the separation of the disassembler from the
16 ;;; virtual machine is valid or adds value.
17
18 ;;; Note: In CMU CL, this used to be a call to SET-DISASSEM-PARAMS.
19 (setf sb!disassem:*disassem-inst-alignment-bytes* 1)
20
21 ;;; This type is used mostly in disassembly and represents legacy
22 ;;; registers only. R8-R15 are handled separately.
23 (deftype reg () '(unsigned-byte 3))
24
25 ;;; This includes legacy registers and R8-R15.
26 (deftype full-reg () '(unsigned-byte 4))
27
28 ;;; The XMM registers XMM0 - XMM15.
29 (deftype xmmreg () '(unsigned-byte 4))
30
31 ;;; Default word size for the chip: if the operand size /= :dword
32 ;;; we need to output #x66 (or REX) prefix
33 (def!constant +default-operand-size+ :dword)
34
35 ;;; The default address size for the chip. It could be overwritten
36 ;;; to :dword with a #x67 prefix, but this is never needed by SBCL
37 ;;; and thus not supported by this assembler/disassembler.
38 (def!constant +default-address-size+ :qword)
39 \f
40 (eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute)
41
42 (defun offset-next (value dstate)
43   (declare (type integer value)
44            (type sb!disassem:disassem-state dstate))
45   (+ (sb!disassem:dstate-next-addr dstate) value))
46
47 (defparameter *byte-reg-names*
48   #(al cl dl bl spl bpl sil dil r8b r9b r10b r11b r12b r13b r14b r15b))
49 (defparameter *high-byte-reg-names*
50   #(ah ch dh bh))
51 (defparameter *word-reg-names*
52   #(ax cx dx bx sp bp si di r8w r9w r10w r11w r12w r13w r14w r15w))
53 (defparameter *dword-reg-names*
54   #(eax ecx edx ebx esp ebp esi edi r8d r9d r10d r11d r12d r13d r14d r15d))
55 (defparameter *qword-reg-names*
56   #(rax rcx rdx rbx rsp rbp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15))
57
58 ;;; The printers for registers, memory references and immediates need to
59 ;;; take into account the width bit in the instruction, whether a #x66
60 ;;; or a REX prefix was issued, and the contents of the REX prefix.
61 ;;; This is implemented using prefilters to put flags into the slot
62 ;;; INST-PROPERTIES of the DSTATE.  These flags are the following
63 ;;; symbols:
64 ;;;
65 ;;; OPERAND-SIZE-8   The width bit was zero
66 ;;; OPERAND-SIZE-16  The "operand size override" prefix (#x66) was found
67 ;;; REX              A REX prefix was found
68 ;;; REX-W            A REX prefix with the "operand width" bit set was
69 ;;;                  found
70 ;;; REX-R            A REX prefix with the "register" bit set was found
71 ;;; REX-X            A REX prefix with the "index" bit set was found
72 ;;; REX-B            A REX prefix with the "base" bit set was found
73
74 ;;; Return the operand size depending on the prefixes and width bit as
75 ;;; stored in DSTATE.
76 (defun inst-operand-size (dstate)
77   (declare (type sb!disassem:disassem-state dstate))
78   (cond ((sb!disassem:dstate-get-inst-prop dstate 'operand-size-8)
79          :byte)
80         ((sb!disassem:dstate-get-inst-prop dstate 'rex-w)
81          :qword)
82         ((sb!disassem:dstate-get-inst-prop dstate 'operand-size-16)
83          :word)
84         (t
85          +default-operand-size+)))
86
87 ;;; The same as INST-OPERAND-SIZE, but for those instructions (e.g.
88 ;;; PUSH, JMP) that have a default operand size of :qword. It can only
89 ;;; be overwritten to :word.
90 (defun inst-operand-size-default-qword (dstate)
91   (declare (type sb!disassem:disassem-state dstate))
92   (if (sb!disassem:dstate-get-inst-prop dstate 'operand-size-16)
93       :word
94       :qword))
95
96 ;;; Print to STREAM the name of the general-purpose register encoded by
97 ;;; VALUE and of size WIDTH. For robustness, the high byte registers
98 ;;; (AH, BH, CH, DH) are correctly detected, too, although the compiler
99 ;;; does not use them.
100 (defun print-reg-with-width (value width stream dstate)
101   (declare (type full-reg value)
102            (type stream stream)
103            (type sb!disassem:disassem-state dstate))
104   (princ (if (and (eq width :byte)
105                   (<= 4 value 7)
106                   (not (sb!disassem:dstate-get-inst-prop dstate 'rex)))
107              (aref *high-byte-reg-names* (- value 4))
108              (aref (ecase width
109                      (:byte *byte-reg-names*)
110                      (:word *word-reg-names*)
111                      (:dword *dword-reg-names*)
112                      (:qword *qword-reg-names*))
113                    value))
114          stream)
115   ;; XXX plus should do some source-var notes
116   )
117
118 (defun print-reg (value stream dstate)
119   (declare (type full-reg value)
120            (type stream stream)
121            (type sb!disassem:disassem-state dstate))
122   (print-reg-with-width value
123                         (inst-operand-size dstate)
124                         stream
125                         dstate))
126
127 (defun print-reg-default-qword (value stream dstate)
128   (declare (type full-reg value)
129            (type stream stream)
130            (type sb!disassem:disassem-state dstate))
131   (print-reg-with-width value
132                         (inst-operand-size-default-qword dstate)
133                         stream
134                         dstate))
135
136 (defun print-byte-reg (value stream dstate)
137   (declare (type full-reg value)
138            (type stream stream)
139            (type sb!disassem:disassem-state dstate))
140   (print-reg-with-width value :byte stream dstate))
141
142 (defun print-addr-reg (value stream dstate)
143   (declare (type full-reg value)
144            (type stream stream)
145            (type sb!disassem:disassem-state dstate))
146   (print-reg-with-width value +default-address-size+ stream dstate))
147
148 ;;; Print a register or a memory reference of the given WIDTH.
149 ;;; If SIZED-P is true, add an explicit size indicator for memory
150 ;;; references.
151 (defun print-reg/mem-with-width (value width sized-p stream dstate)
152   (declare (type (or list full-reg) value)
153            (type (member :byte :word :dword :qword) width)
154            (type boolean sized-p)
155            (type stream stream)
156            (type sb!disassem:disassem-state dstate))
157   (if (typep value 'full-reg)
158       (print-reg-with-width value width stream dstate)
159     (print-mem-access value (and sized-p width) stream dstate)))
160
161 ;;; Print a register or a memory reference. The width is determined by
162 ;;; calling INST-OPERAND-SIZE.
163 (defun print-reg/mem (value stream dstate)
164   (declare (type (or list full-reg) value)
165            (type stream stream)
166            (type sb!disassem:disassem-state dstate))
167   (print-reg/mem-with-width
168    value (inst-operand-size dstate) nil stream dstate))
169
170 ;; Same as print-reg/mem, but prints an explicit size indicator for
171 ;; memory references.
172 (defun print-sized-reg/mem (value stream dstate)
173   (declare (type (or list full-reg) value)
174            (type stream stream)
175            (type sb!disassem:disassem-state dstate))
176   (print-reg/mem-with-width
177    value (inst-operand-size dstate) t stream dstate))
178
179 ;;; Same as print-sized-reg/mem, but with a default operand size of
180 ;;; :qword.
181 (defun print-sized-reg/mem-default-qword (value stream dstate)
182   (declare (type (or list full-reg) value)
183            (type stream stream)
184            (type sb!disassem:disassem-state dstate))
185   (print-reg/mem-with-width
186    value (inst-operand-size-default-qword dstate) t stream dstate))
187
188 (defun print-sized-byte-reg/mem (value stream dstate)
189   (declare (type (or list full-reg) value)
190            (type stream stream)
191            (type sb!disassem:disassem-state dstate))
192   (print-reg/mem-with-width value :byte t stream dstate))
193
194 (defun print-sized-word-reg/mem (value stream dstate)
195   (declare (type (or list full-reg) value)
196            (type stream stream)
197            (type sb!disassem:disassem-state dstate))
198   (print-reg/mem-with-width value :word t stream dstate))
199
200 (defun print-sized-dword-reg/mem (value stream dstate)
201   (declare (type (or list full-reg) value)
202            (type stream stream)
203            (type sb!disassem:disassem-state dstate))
204   (print-reg/mem-with-width value :dword t stream dstate))
205
206 (defun print-label (value stream dstate)
207   (declare (ignore dstate))
208   (sb!disassem:princ16 value stream))
209
210 (defun print-xmmreg (value stream dstate)
211   (declare (type xmmreg value)
212            (type stream stream)
213            (ignore dstate))
214   (format stream "XMM~d" value))
215
216 (defun print-xmmreg/mem (value stream dstate)
217   (declare (type (or list xmmreg) value)
218            (type stream stream)
219            (type sb!disassem:disassem-state dstate))
220   (if (typep value 'xmmreg)
221       (print-xmmreg value stream dstate)
222     (print-mem-access value nil stream dstate)))
223
224 ;;; This prefilter is used solely for its side effects, namely to put
225 ;;; the bits found in the REX prefix into the DSTATE for use by other
226 ;;; prefilters and by printers.
227 (defun prefilter-wrxb (value dstate)
228   (declare (type (unsigned-byte 4) value)
229            (type sb!disassem:disassem-state dstate))
230   (sb!disassem:dstate-put-inst-prop dstate 'rex)
231   (when (plusp (logand value #b1000))
232     (sb!disassem:dstate-put-inst-prop dstate 'rex-w))
233   (when (plusp (logand value #b0100))
234     (sb!disassem:dstate-put-inst-prop dstate 'rex-r))
235   (when (plusp (logand value #b0010))
236     (sb!disassem:dstate-put-inst-prop dstate 'rex-x))
237   (when (plusp (logand value #b0001))
238     (sb!disassem:dstate-put-inst-prop dstate 'rex-b))
239   value)
240
241 ;;; This prefilter is used solely for its side effect, namely to put
242 ;;; the property OPERAND-SIZE-8 into the DSTATE if VALUE is 0.
243 (defun prefilter-width (value dstate)
244   (declare (type bit value)
245            (type sb!disassem:disassem-state dstate))
246   (when (zerop value)
247     (sb!disassem:dstate-put-inst-prop dstate 'operand-size-8))
248   value)
249
250 ;;; This prefilter is used solely for its side effect, namely to put
251 ;;; the property OPERAND-SIZE-16 into the DSTATE.
252 (defun prefilter-x66 (value dstate)
253   (declare (type (eql #x66) value)
254            (ignore value)
255            (type sb!disassem:disassem-state dstate))
256   (sb!disassem:dstate-put-inst-prop dstate 'operand-size-16))
257
258 ;;; A register field that can be extended by REX.R.
259 (defun prefilter-reg-r (value dstate)
260   (declare (type reg value)
261            (type sb!disassem:disassem-state dstate))
262   (if (sb!disassem::dstate-get-inst-prop dstate 'rex-r)
263       (+ value 8)
264       value))
265
266 ;;; A register field that can be extended by REX.B.
267 (defun prefilter-reg-b (value dstate)
268   (declare (type reg value)
269            (type sb!disassem:disassem-state dstate))
270   (if (sb!disassem::dstate-get-inst-prop dstate 'rex-b)
271       (+ value 8)
272       value))
273
274 ;;; Returns either an integer, meaning a register, or a list of
275 ;;; (BASE-REG OFFSET INDEX-REG INDEX-SCALE), where any component
276 ;;; may be missing or nil to indicate that it's not used or has the
277 ;;; obvious default value (e.g., 1 for the index-scale). VALUE is a list
278 ;;; of the mod and r/m field of the ModRM byte of the instruction.
279 ;;; Depending on VALUE a SIB byte and/or an offset may be read. The
280 ;;; REX.B bit from DSTATE is used to extend the sole register or the
281 ;;; BASE-REG to a full register, the REX.X bit does the same for the
282 ;;; INDEX-REG.
283 (defun prefilter-reg/mem (value dstate)
284   (declare (type list value)
285            (type sb!disassem:disassem-state dstate))
286   (let ((mod (first value))
287         (r/m (second value)))
288     (declare (type (unsigned-byte 2) mod)
289              (type (unsigned-byte 3) r/m))
290     (let ((full-reg (if (sb!disassem:dstate-get-inst-prop dstate 'rex-b)
291                         (+ r/m 8)
292                         r/m)))
293       (declare (type full-reg full-reg))
294       (cond ((= mod #b11)
295              ;; registers
296              full-reg)
297             ((= r/m #b100)
298              ;; sib byte
299              (let ((sib (sb!disassem:read-suffix 8 dstate)))
300                (declare (type (unsigned-byte 8) sib))
301                (let ((base-reg (ldb (byte 3 0) sib))
302                      (index-reg (ldb (byte 3 3) sib))
303                      (index-scale (ldb (byte 2 6) sib)))
304                  (declare (type (unsigned-byte 3) base-reg index-reg)
305                           (type (unsigned-byte 2) index-scale))
306                  (let* ((offset
307                          (case mod
308                                (#b00
309                                 (if (= base-reg #b101)
310                                     (sb!disassem:read-signed-suffix 32 dstate)
311                                   nil))
312                                (#b01
313                                 (sb!disassem:read-signed-suffix 8 dstate))
314                                (#b10
315                                 (sb!disassem:read-signed-suffix 32 dstate)))))
316                    (list (unless (and (= mod #b00) (= base-reg #b101))
317                            (if (sb!disassem:dstate-get-inst-prop dstate 'rex-b)
318                                (+ base-reg 8)
319                                base-reg))
320                          offset
321                          (unless (= index-reg #b100)
322                            (if (sb!disassem:dstate-get-inst-prop dstate 'rex-x)
323                                (+ index-reg 8)
324                                index-reg))
325                          (ash 1 index-scale))))))
326             ((and (= mod #b00) (= r/m #b101))
327              (list 'rip (sb!disassem:read-signed-suffix 32 dstate)))
328             ((= mod #b00)
329              (list full-reg))
330             ((= mod #b01)
331            (list full-reg (sb!disassem:read-signed-suffix 8 dstate)))
332           (t                            ; (= mod #b10)
333            (list full-reg (sb!disassem:read-signed-suffix 32 dstate)))))))
334
335 (defun read-address (value dstate)
336   (declare (ignore value))              ; always nil anyway
337   (sb!disassem:read-suffix (width-bits (inst-operand-size dstate)) dstate))
338
339 (defun width-bits (width)
340   (ecase width
341     (:byte 8)
342     (:word 16)
343     (:dword 32)
344     (:qword 64)))
345
346 ) ; EVAL-WHEN
347 \f
348 ;;;; disassembler argument types
349
350 ;;; Used to capture the lower four bits of the REX prefix.
351 (sb!disassem:define-arg-type wrxb
352   :prefilter #'prefilter-wrxb)
353
354 (sb!disassem:define-arg-type width
355   :prefilter #'prefilter-width
356   :printer (lambda (value stream dstate)
357              (declare (ignore value))
358              (princ (schar (symbol-name (inst-operand-size dstate)) 0)
359                     stream)))
360
361 ;;; Used to capture the effect of the #x66 operand size override prefix.
362 (sb!disassem:define-arg-type x66
363   :prefilter #'prefilter-x66)
364
365 (sb!disassem:define-arg-type displacement
366   :sign-extend t
367   :use-label #'offset-next
368   :printer (lambda (value stream dstate)
369              (sb!disassem:maybe-note-assembler-routine value nil dstate)
370              (print-label value stream dstate)))
371
372 (sb!disassem:define-arg-type accum
373   :printer (lambda (value stream dstate)
374              (declare (ignore value)
375                       (type stream stream)
376                       (type sb!disassem:disassem-state dstate))
377              (print-reg 0 stream dstate)))
378
379 (sb!disassem:define-arg-type reg
380   :prefilter #'prefilter-reg-r
381   :printer #'print-reg)
382
383 (sb!disassem:define-arg-type reg-b
384   :prefilter #'prefilter-reg-b
385   :printer #'print-reg)
386
387 (sb!disassem:define-arg-type reg-b-default-qword
388   :prefilter #'prefilter-reg-b
389   :printer #'print-reg-default-qword)
390
391 (sb!disassem:define-arg-type imm-addr
392   :prefilter #'read-address
393   :printer #'print-label)
394
395 ;;; Normally, immediate values for an operand size of :qword are of size
396 ;;; :dword and are sign-extended to 64 bits. For an exception, see the
397 ;;; argument type definition following this one.
398 (sb!disassem:define-arg-type signed-imm-data
399   :prefilter (lambda (value dstate)
400                (declare (ignore value)) ; always nil anyway
401                (let ((width (width-bits (inst-operand-size dstate))))
402                  (when (= width 64)
403                    (setf width 32))
404                  (sb!disassem:read-signed-suffix width dstate))))
405
406 ;;; Used by the variant of the MOV instruction with opcode B8 which can
407 ;;; move immediates of all sizes (i.e. including :qword) into a
408 ;;; register.
409 (sb!disassem:define-arg-type signed-imm-data-upto-qword
410   :prefilter (lambda (value dstate)
411                (declare (ignore value)) ; always nil anyway
412                (sb!disassem:read-signed-suffix
413                 (width-bits (inst-operand-size dstate))
414                 dstate)))
415
416 ;;; Used by those instructions that have a default operand size of
417 ;;; :qword. Nevertheless the immediate is at most of size :dword.
418 ;;; The only instruction of this kind having a variant with an immediate
419 ;;; argument is PUSH.
420 (sb!disassem:define-arg-type signed-imm-data-default-qword
421   :prefilter (lambda (value dstate)
422                (declare (ignore value)) ; always nil anyway
423                (let ((width (width-bits
424                              (inst-operand-size-default-qword dstate))))
425                  (when (= width 64)
426                    (setf width 32))
427                  (sb!disassem:read-signed-suffix width dstate))))
428
429 (sb!disassem:define-arg-type signed-imm-byte
430   :prefilter (lambda (value dstate)
431                (declare (ignore value)) ; always nil anyway
432                (sb!disassem:read-signed-suffix 8 dstate)))
433
434 (sb!disassem:define-arg-type imm-byte
435   :prefilter (lambda (value dstate)
436                (declare (ignore value)) ; always nil anyway
437                (sb!disassem:read-suffix 8 dstate)))
438
439 ;;; needed for the ret imm16 instruction
440 (sb!disassem:define-arg-type imm-word-16
441   :prefilter (lambda (value dstate)
442                (declare (ignore value)) ; always nil anyway
443                (sb!disassem:read-suffix 16 dstate)))
444
445 (sb!disassem:define-arg-type reg/mem
446   :prefilter #'prefilter-reg/mem
447   :printer #'print-reg/mem)
448 (sb!disassem:define-arg-type sized-reg/mem
449   ;; Same as reg/mem, but prints an explicit size indicator for
450   ;; memory references.
451   :prefilter #'prefilter-reg/mem
452   :printer #'print-sized-reg/mem)
453
454 ;;; Arguments of type reg/mem with a fixed size.
455 (sb!disassem:define-arg-type sized-byte-reg/mem
456   :prefilter #'prefilter-reg/mem
457   :printer #'print-sized-byte-reg/mem)
458 (sb!disassem:define-arg-type sized-word-reg/mem
459   :prefilter #'prefilter-reg/mem
460   :printer #'print-sized-word-reg/mem)
461 (sb!disassem:define-arg-type sized-dword-reg/mem
462   :prefilter #'prefilter-reg/mem
463   :printer #'print-sized-dword-reg/mem)
464
465 ;;; Same as sized-reg/mem, but with a default operand size of :qword.
466 (sb!disassem:define-arg-type sized-reg/mem-default-qword
467   :prefilter #'prefilter-reg/mem
468   :printer #'print-sized-reg/mem-default-qword)
469
470 ;;; XMM registers
471 (sb!disassem:define-arg-type xmmreg
472   :prefilter #'prefilter-reg-r
473   :printer #'print-xmmreg)
474
475 (sb!disassem:define-arg-type xmmreg-b
476   :prefilter #'prefilter-reg-b
477   :printer #'print-xmmreg)
478
479 (sb!disassem:define-arg-type xmmreg/mem
480   :prefilter #'prefilter-reg/mem
481   :printer #'print-xmmreg/mem)
482
483
484 (eval-when (:compile-toplevel :load-toplevel :execute)
485 (defparameter *conditions*
486   '((:o . 0)
487     (:no . 1)
488     (:b . 2) (:nae . 2) (:c . 2)
489     (:nb . 3) (:ae . 3) (:nc . 3)
490     (:eq . 4) (:e . 4) (:z . 4)
491     (:ne . 5) (:nz . 5)
492     (:be . 6) (:na . 6)
493     (:nbe . 7) (:a . 7)
494     (:s . 8)
495     (:ns . 9)
496     (:p . 10) (:pe . 10)
497     (:np . 11) (:po . 11)
498     (:l . 12) (:nge . 12)
499     (:nl . 13) (:ge . 13)
500     (:le . 14) (:ng . 14)
501     (:nle . 15) (:g . 15)))
502 (defparameter *condition-name-vec*
503   (let ((vec (make-array 16 :initial-element nil)))
504     (dolist (cond *conditions*)
505       (when (null (aref vec (cdr cond)))
506         (setf (aref vec (cdr cond)) (car cond))))
507     vec))
508 ) ; EVAL-WHEN
509
510 ;;; SSE shuffle patterns. The names end in the number of bits of the
511 ;;; immediate byte that are used to encode the pattern and the radix
512 ;;; in which to print the value.
513 (macrolet ((define-sse-shuffle-arg-type (name format-string)
514                `(sb!disassem:define-arg-type ,name
515                   :type 'imm-byte
516                   :printer (lambda (value stream dstate)
517                              (declare (type (unsigned-byte 8) value)
518                                       (type stream stream)
519                                       (ignore dstate))
520                              (format stream ,format-string value)))))
521   (define-sse-shuffle-arg-type sse-shuffle-pattern-2-2 "#b~2,'0B")
522   (define-sse-shuffle-arg-type sse-shuffle-pattern-8-4 "#4r~4,4,'0R"))
523
524 ;;; Set assembler parameters. (In CMU CL, this was done with
525 ;;; a call to a macro DEF-ASSEMBLER-PARAMS.)
526 (eval-when (:compile-toplevel :load-toplevel :execute)
527   (setf sb!assem:*assem-scheduler-p* nil))
528
529 (sb!disassem:define-arg-type condition-code
530   :printer *condition-name-vec*)
531
532 (defun conditional-opcode (condition)
533   (cdr (assoc condition *conditions* :test #'eq)))
534 \f
535 ;;;; disassembler instruction formats
536
537 (eval-when (:compile-toplevel :execute)
538   (defun swap-if (direction field1 separator field2)
539     `(:if (,direction :constant 0)
540           (,field1 ,separator ,field2)
541           (,field2 ,separator ,field1))))
542
543 (sb!disassem:define-instruction-format (byte 8 :default-printer '(:name))
544   (op    :field (byte 8 0))
545   ;; optional fields
546   (accum :type 'accum)
547   (imm))
548
549 (sb!disassem:define-instruction-format (two-bytes 16
550                                         :default-printer '(:name))
551   (op :fields (list (byte 8 0) (byte 8 8))))
552
553 (sb!disassem:define-instruction-format (three-bytes 24
554                                         :default-printer '(:name))
555   (op :fields (list (byte 8 0) (byte 8 8) (byte 8 16))))
556
557 ;;; Prefix instructions
558
559 (sb!disassem:define-instruction-format (rex 8)
560   (rex     :field (byte 4 4)    :value #b0100)
561   (wrxb    :field (byte 4 0)    :type 'wrxb))
562
563 (sb!disassem:define-instruction-format (x66 8)
564   (x66     :field (byte 8 0)    :type 'x66      :value #x66))
565
566 ;;; A one-byte instruction with a #x66 prefix, used to indicate an
567 ;;; operand size of :word.
568 (sb!disassem:define-instruction-format (x66-byte 16
569                                         :default-printer '(:name))
570   (x66   :field (byte 8 0) :value #x66)
571   (op    :field (byte 8 8)))
572
573 ;;; A one-byte instruction with a REX prefix, used to indicate an
574 ;;; operand size of :qword. REX.W must be 1, the other three bits are
575 ;;; ignored.
576 (sb!disassem:define-instruction-format (rex-byte 16
577                                         :default-printer '(:name))
578   (rex   :field (byte 5 3) :value #b01001)
579   (op    :field (byte 8 8)))
580
581 (sb!disassem:define-instruction-format (simple 8)
582   (op    :field (byte 7 1))
583   (width :field (byte 1 0) :type 'width)
584   ;; optional fields
585   (accum :type 'accum)
586   (imm))
587
588 ;;; Same as simple, but with direction bit
589 (sb!disassem:define-instruction-format (simple-dir 8 :include 'simple)
590   (op :field (byte 6 2))
591   (dir :field (byte 1 1)))
592
593 ;;; Same as simple, but with the immediate value occurring by default,
594 ;;; and with an appropiate printer.
595 (sb!disassem:define-instruction-format (accum-imm 8
596                                      :include 'simple
597                                      :default-printer '(:name
598                                                         :tab accum ", " imm))
599   (imm :type 'signed-imm-data))
600
601 (sb!disassem:define-instruction-format (reg-no-width 8
602                                      :default-printer '(:name :tab reg))
603   (op    :field (byte 5 3))
604   (reg   :field (byte 3 0) :type 'reg-b)
605   ;; optional fields
606   (accum :type 'accum)
607   (imm))
608
609 ;;; Same as reg-no-width, but with a default operand size of :qword.
610 (sb!disassem:define-instruction-format (reg-no-width-default-qword 8
611                                         :include 'reg-no-width
612                                         :default-printer '(:name :tab reg))
613   (reg   :type 'reg-b-default-qword))
614
615 ;;; Adds a width field to reg-no-width. Note that we can't use
616 ;;; :INCLUDE 'REG-NO-WIDTH here to save typing because that would put
617 ;;; the WIDTH field last, but the prefilter for WIDTH must run before
618 ;;; the one for IMM to be able to determine the correct size of IMM.
619 (sb!disassem:define-instruction-format (reg 8
620                                         :default-printer '(:name :tab reg))
621   (op    :field (byte 4 4))
622   (width :field (byte 1 3) :type 'width)
623   (reg   :field (byte 3 0) :type 'reg-b)
624   ;; optional fields
625   (accum :type 'accum)
626   (imm))
627
628 (sb!disassem:define-instruction-format (rex-reg 16
629                                         :default-printer '(:name :tab reg))
630   (rex     :field (byte 4 4)    :value #b0100)
631   (wrxb    :field (byte 4 0)    :type 'wrxb)
632   (width   :field (byte 1 11)   :type 'width)
633   (op      :field (byte 4 12))
634   (reg     :field (byte 3 8)    :type 'reg-b)
635   ;; optional fields
636   (accum   :type 'accum)
637   (imm))
638
639 (sb!disassem:define-instruction-format (two-bytes 16
640                                         :default-printer '(:name))
641   (op :fields (list (byte 8 0) (byte 8 8))))
642
643 (sb!disassem:define-instruction-format (reg-reg/mem 16
644                                         :default-printer
645                                         `(:name :tab reg ", " reg/mem))
646   (op      :field (byte 7 1))
647   (width   :field (byte 1 0)    :type 'width)
648   (reg/mem :fields (list (byte 2 14) (byte 3 8))
649                                 :type 'reg/mem)
650   (reg     :field (byte 3 11)   :type 'reg)
651   ;; optional fields
652   (imm))
653
654 ;;; same as reg-reg/mem, but with direction bit
655 (sb!disassem:define-instruction-format (reg-reg/mem-dir 16
656                                         :include 'reg-reg/mem
657                                         :default-printer
658                                         `(:name
659                                           :tab
660                                           ,(swap-if 'dir 'reg/mem ", " 'reg)))
661   (op  :field (byte 6 2))
662   (dir :field (byte 1 1)))
663
664 ;;; Same as reg-reg/mem, but uses the reg field as a second op code.
665 (sb!disassem:define-instruction-format (reg/mem 16
666                                         :default-printer '(:name :tab reg/mem))
667   (op      :fields (list (byte 7 1) (byte 3 11)))
668   (width   :field (byte 1 0)    :type 'width)
669   (reg/mem :fields (list (byte 2 14) (byte 3 8))
670                                 :type 'sized-reg/mem)
671   ;; optional fields
672   (imm))
673
674 ;;; Same as reg/mem, but without a width field and with a default
675 ;;; operand size of :qword.
676 (sb!disassem:define-instruction-format (reg/mem-default-qword 16
677                                         :default-printer '(:name :tab reg/mem))
678   (op      :fields (list (byte 8 0) (byte 3 11)))
679   (reg/mem :fields (list (byte 2 14) (byte 3 8))
680                                 :type 'sized-reg/mem-default-qword))
681
682 ;;; Same as reg/mem, but with the immediate value occurring by default,
683 ;;; and with an appropiate printer.
684 (sb!disassem:define-instruction-format (reg/mem-imm 16
685                                         :include 'reg/mem
686                                         :default-printer
687                                         '(:name :tab reg/mem ", " imm))
688   (reg/mem :type 'sized-reg/mem)
689   (imm     :type 'signed-imm-data))
690
691 ;;; Same as reg/mem, but with using the accumulator in the default printer
692 (sb!disassem:define-instruction-format
693     (accum-reg/mem 16
694      :include 'reg/mem :default-printer '(:name :tab accum ", " reg/mem))
695   (reg/mem :type 'reg/mem)              ; don't need a size
696   (accum :type 'accum))
697
698 ;;; Same as reg-reg/mem, but with a prefix of #b00001111
699 (sb!disassem:define-instruction-format (ext-reg-reg/mem 24
700                                         :default-printer
701                                         `(:name :tab reg ", " reg/mem))
702   (prefix  :field (byte 8 0)    :value #b00001111)
703   (op      :field (byte 7 9))
704   (width   :field (byte 1 8)    :type 'width)
705   (reg/mem :fields (list (byte 2 22) (byte 3 16))
706                                 :type 'reg/mem)
707   (reg     :field (byte 3 19)   :type 'reg)
708   ;; optional fields
709   (imm))
710
711 (sb!disassem:define-instruction-format (ext-reg-reg/mem-no-width 24
712                                         :default-printer
713                                         `(:name :tab reg ", " reg/mem))
714   (prefix  :field (byte 8 0)    :value #b00001111)
715   (op      :field (byte 8 8))
716   (reg/mem :fields (list (byte 2 22) (byte 3 16))
717                                 :type 'reg/mem)
718   (reg     :field (byte 3 19)   :type 'reg)
719   ;; optional fields
720   (imm))
721
722 (sb!disassem:define-instruction-format (ext-reg/mem-no-width 24
723                                         :default-printer
724                                         `(:name :tab reg/mem))
725   (prefix  :field (byte 8 0)    :value #b00001111)
726   (op      :fields (list (byte 8 8) (byte 3 19)))
727   (reg/mem :fields (list (byte 2 22) (byte 3 16))
728                                 :type 'reg/mem))
729
730 ;;; reg-no-width with #x0f prefix
731 (sb!disassem:define-instruction-format (ext-reg-no-width 16
732                                         :default-printer '(:name :tab reg))
733   (prefix  :field (byte 8 0)    :value #b00001111)
734   (op    :field (byte 5 11))
735   (reg   :field (byte 3 8) :type 'reg-b))
736
737 ;;; Same as reg/mem, but with a prefix of #b00001111
738 (sb!disassem:define-instruction-format (ext-reg/mem 24
739                                         :default-printer '(:name :tab reg/mem))
740   (prefix  :field (byte 8 0)    :value #b00001111)
741   (op      :fields (list (byte 7 9) (byte 3 19)))
742   (width   :field (byte 1 8)    :type 'width)
743   (reg/mem :fields (list (byte 2 22) (byte 3 16))
744                                 :type 'sized-reg/mem)
745   ;; optional fields
746   (imm))
747
748 (sb!disassem:define-instruction-format (ext-reg/mem-imm 24
749                                         :include 'ext-reg/mem
750                                         :default-printer
751                                         '(:name :tab reg/mem ", " imm))
752   (imm :type 'signed-imm-data))
753 \f
754 ;;;; XMM instructions
755
756 ;;; All XMM instructions use an extended opcode (#x0F as the first
757 ;;; opcode byte). Therefore in the following "EXT" in the name of the
758 ;;; instruction formats refers to the formats that have an additional
759 ;;; prefix (#x66, #xF2 or #xF3).
760
761 ;;; Instructions having an XMM register as the destination operand
762 ;;; and an XMM register or a memory location as the source operand.
763 ;;; The size of the operands is implicitly given by the instruction.
764 (sb!disassem:define-instruction-format (xmm-xmm/mem 24
765                                         :default-printer
766                                         '(:name :tab reg ", " reg/mem))
767   (x0f     :field (byte 8 0)    :value #x0f)
768   (op      :field (byte 8 8))
769   (reg/mem :fields (list (byte 2 22) (byte 3 16))
770                                 :type 'xmmreg/mem)
771   (reg     :field (byte 3 19)   :type 'xmmreg)
772   ;; optional fields
773   (imm))
774
775 (sb!disassem:define-instruction-format (ext-xmm-xmm/mem 32
776                                         :default-printer
777                                         '(:name :tab reg ", " reg/mem))
778   (prefix  :field (byte 8 0))
779   (x0f     :field (byte 8 8)    :value #x0f)
780   (op      :field (byte 8 16))
781   (reg/mem :fields (list (byte 2 30) (byte 3 24))
782                                 :type 'xmmreg/mem)
783   (reg     :field (byte 3 27)   :type 'xmmreg)
784   (imm))
785
786 (sb!disassem:define-instruction-format (ext-rex-xmm-xmm/mem 40
787                                         :default-printer
788                                         '(:name :tab reg ", " reg/mem))
789   (prefix  :field (byte 8 0))
790   (rex     :field (byte 4 12)   :value #b0100)
791   (wrxb    :field (byte 4 8)    :type 'wrxb)
792   (x0f     :field (byte 8 16)   :value #x0f)
793   (op      :field (byte 8 24))
794   (reg/mem :fields (list (byte 2 38) (byte 3 32))
795                                 :type 'xmmreg/mem)
796   (reg     :field (byte 3 35)   :type 'xmmreg)
797   (imm))
798
799 ;;; Same as xmm-xmm/mem etc., but with direction bit.
800
801 (sb!disassem:define-instruction-format (ext-xmm-xmm/mem-dir 32
802                                         :include 'ext-xmm-xmm/mem
803                                         :default-printer
804                                         `(:name
805                                           :tab
806                                           ,(swap-if 'dir 'reg ", " 'reg/mem)))
807   (op      :field (byte 7 17))
808   (dir     :field (byte 1 16)))
809
810 (sb!disassem:define-instruction-format (ext-rex-xmm-xmm/mem-dir 40
811                                         :include 'ext-rex-xmm-xmm/mem
812                                         :default-printer
813                                         `(:name
814                                           :tab
815                                           ,(swap-if 'dir 'reg ", " 'reg/mem)))
816   (op      :field (byte 7 25))
817   (dir     :field (byte 1 24)))
818
819 ;;; Instructions having an XMM register as one operand
820 ;;; and a constant (unsigned) byte as the other.
821
822 (sb!disassem:define-instruction-format (ext-xmm-imm 32
823                                         :default-printer
824                                         '(:name :tab reg/mem ", " imm))
825   (prefix  :field (byte 8 0))
826   (x0f     :field (byte 8 8)   :value #x0f)
827   (op      :field (byte 8 16))
828   (/i      :field (byte 3 27))
829   (b11     :field (byte 2 30) :value #b11)
830   (reg/mem :field (byte 3 24)
831            :type 'xmmreg-b)
832   (imm     :type 'imm-byte))
833
834 (sb!disassem:define-instruction-format (ext-rex-xmm-imm 40
835                                         :default-printer
836                                         '(:name :tab reg/mem ", " imm))
837   (prefix  :field (byte 8 0))
838   (rex     :field (byte 4 12)   :value #b0100)
839   (wrxb    :field (byte 4 8)    :type 'wrxb)
840   (x0f     :field (byte 8 16)   :value #x0f)
841   (op      :field (byte 8 24))
842   (/i      :field (byte 3 35))
843   (b11     :field (byte 2 38) :value #b11)
844   (reg/mem :field (byte 3 32)
845            :type 'xmmreg-b)
846   (imm     :type 'imm-byte))
847
848 ;;; Instructions having an XMM register as one operand and a general-
849 ;;; -purpose register or a memory location as the other operand.
850
851 (sb!disassem:define-instruction-format (xmm-reg/mem 24
852                                         :default-printer
853                                         '(:name :tab reg ", " reg/mem))
854   (x0f     :field (byte 8 0)    :value #x0f)
855   (op      :field (byte 8 8))
856   (reg/mem :fields (list (byte 2 22) (byte 3 16))
857            :type 'sized-reg/mem)
858   (reg     :field (byte 3 19)   :type 'xmmreg))
859
860 (sb!disassem:define-instruction-format (ext-xmm-reg/mem 32
861                                         :default-printer
862                                         '(:name :tab reg ", " reg/mem))
863   (prefix  :field (byte 8 0))
864   (x0f     :field (byte 8 8)    :value #x0f)
865   (op      :field (byte 8 16))
866   (reg/mem :fields (list (byte 2 30) (byte 3 24))
867                                 :type 'sized-reg/mem)
868   (reg     :field (byte 3 27)   :type 'xmmreg))
869
870 (sb!disassem:define-instruction-format (ext-rex-xmm-reg/mem 40
871                                         :default-printer
872                                         '(:name :tab reg ", " reg/mem))
873   (prefix  :field (byte 8 0))
874   (rex     :field (byte 4 12)   :value #b0100)
875   (wrxb    :field (byte 4 8)    :type 'wrxb)
876   (x0f     :field (byte 8 16)   :value #x0f)
877   (op      :field (byte 8 24))
878   (reg/mem :fields (list (byte 2 38) (byte 3 32))
879                                 :type 'sized-reg/mem)
880   (reg     :field (byte 3 35)   :type 'xmmreg))
881
882 ;;; Instructions having a general-purpose register as one operand and an
883 ;;; XMM register or a memory location as the other operand.
884
885 (sb!disassem:define-instruction-format (reg-xmm/mem 24
886                                         :default-printer
887                                         '(:name :tab reg ", " reg/mem))
888   (x0f     :field (byte 8 0)    :value #x0f)
889   (op      :field (byte 8 8))
890   (reg/mem :fields (list (byte 2 22) (byte 3 16))
891                                 :type 'xmmreg/mem)
892   (reg     :field (byte 3 19)   :type 'reg))
893
894 (sb!disassem:define-instruction-format (ext-reg-xmm/mem 32
895                                         :default-printer
896                                         '(:name :tab reg ", " reg/mem))
897   (prefix  :field (byte 8 0))
898   (x0f     :field (byte 8 8)    :value #x0f)
899   (op      :field (byte 8 16))
900   (reg/mem :fields (list (byte 2 30) (byte 3 24))
901                                 :type 'xmmreg/mem)
902   (reg     :field (byte 3 27)   :type 'reg))
903
904 (sb!disassem:define-instruction-format (ext-rex-reg-xmm/mem 40
905                                         :default-printer
906                                         '(:name :tab reg ", " reg/mem))
907   (prefix  :field (byte 8 0))
908   (rex     :field (byte 4 12)   :value #b0100)
909   (wrxb    :field (byte 4 8)    :type 'wrxb)
910   (x0f     :field (byte 8 16)   :value #x0f)
911   (op      :field (byte 8 24))
912   (reg/mem :fields (list (byte 2 38) (byte 3 32))
913                                 :type 'xmmreg/mem)
914   (reg     :field (byte 3 35)   :type 'reg))
915
916 ;; XMM comparison instruction
917
918 (eval-when (:compile-toplevel :load-toplevel :execute)
919   (defparameter *sse-conditions* #(:eq :lt :le :unord :neq :nlt :nle :ord)))
920
921 (sb!disassem:define-arg-type sse-condition-code
922   ;; Inherit the prefilter from IMM-BYTE to READ-SUFFIX the byte.
923   :type 'imm-byte
924   :printer *sse-conditions*)
925
926 (sb!disassem:define-instruction-format (string-op 8
927                                      :include 'simple
928                                      :default-printer '(:name width)))
929
930 (sb!disassem:define-instruction-format (short-cond-jump 16)
931   (op    :field (byte 4 4))
932   (cc    :field (byte 4 0) :type 'condition-code)
933   (label :field (byte 8 8) :type 'displacement))
934
935 (sb!disassem:define-instruction-format (short-jump 16
936                                      :default-printer '(:name :tab label))
937   (const :field (byte 4 4) :value #b1110)
938   (op    :field (byte 4 0))
939   (label :field (byte 8 8) :type 'displacement))
940
941 (sb!disassem:define-instruction-format (near-cond-jump 16)
942   (op    :fields (list (byte 8 0) (byte 4 12)) :value '(#b00001111 #b1000))
943   (cc    :field (byte 4 8) :type 'condition-code)
944   ;; The disassembler currently doesn't let you have an instruction > 32 bits
945   ;; long, so we fake it by using a prefilter to read the offset.
946   (label :type 'displacement
947          :prefilter (lambda (value dstate)
948                       (declare (ignore value)) ; always nil anyway
949                       (sb!disassem:read-signed-suffix 32 dstate))))
950
951 (sb!disassem:define-instruction-format (near-jump 8
952                                      :default-printer '(:name :tab label))
953   (op    :field (byte 8 0))
954   ;; The disassembler currently doesn't let you have an instruction > 32 bits
955   ;; long, so we fake it by using a prefilter to read the address.
956   (label :type 'displacement
957          :prefilter (lambda (value dstate)
958                       (declare (ignore value)) ; always nil anyway
959                       (sb!disassem:read-signed-suffix 32 dstate))))
960
961
962 (sb!disassem:define-instruction-format (cond-set 24
963                                      :default-printer '('set cc :tab reg/mem))
964   (prefix :field (byte 8 0) :value #b00001111)
965   (op    :field (byte 4 12) :value #b1001)
966   (cc    :field (byte 4 8) :type 'condition-code)
967   (reg/mem :fields (list (byte 2 22) (byte 3 16))
968            :type 'sized-byte-reg/mem)
969   (reg     :field (byte 3 19)   :value #b000))
970
971 (sb!disassem:define-instruction-format (cond-move 24
972                                      :default-printer
973                                         '('cmov cc :tab reg ", " reg/mem))
974   (prefix  :field (byte 8 0)    :value #b00001111)
975   (op      :field (byte 4 12)   :value #b0100)
976   (cc      :field (byte 4 8)    :type 'condition-code)
977   (reg/mem :fields (list (byte 2 22) (byte 3 16))
978                                 :type 'reg/mem)
979   (reg     :field (byte 3 19)   :type 'reg))
980
981 (sb!disassem:define-instruction-format (enter-format 32
982                                      :default-printer '(:name
983                                                         :tab disp
984                                                         (:unless (:constant 0)
985                                                           ", " level)))
986   (op :field (byte 8 0))
987   (disp :field (byte 16 8))
988   (level :field (byte 8 24)))
989
990 ;;; Single byte instruction with an immediate byte argument.
991 (sb!disassem:define-instruction-format (byte-imm 16
992                                      :default-printer '(:name :tab code))
993  (op :field (byte 8 0))
994  (code :field (byte 8 8)))
995
996 ;;; Two byte instruction with an immediate byte argument.
997 ;;;
998 (sb!disassem:define-instruction-format (word-imm 24
999                                      :default-printer '(:name :tab code))
1000   (op :field (byte 16 0))
1001   (code :field (byte 8 16)))
1002
1003 \f
1004 ;;;; primitive emitters
1005
1006 (define-bitfield-emitter emit-word 16
1007   (byte 16 0))
1008
1009 (define-bitfield-emitter emit-dword 32
1010   (byte 32 0))
1011
1012 ;;; Most uses of dwords are as displacements or as immediate values in
1013 ;;; 64-bit operations. In these cases they are sign-extended to 64 bits.
1014 ;;; EMIT-DWORD is unsuitable there because it accepts values of type
1015 ;;; (OR (SIGNED-BYTE 32) (UNSIGNED-BYTE 32)), so we provide a more
1016 ;;; restricted emitter here.
1017 (defun emit-signed-dword (segment value)
1018   (declare (type segment segment)
1019            (type (signed-byte 32) value))
1020   (declare (inline emit-dword))
1021   (emit-dword segment value))
1022
1023 (define-bitfield-emitter emit-qword 64
1024   (byte 64 0))
1025
1026 (define-bitfield-emitter emit-byte-with-reg 8
1027   (byte 5 3) (byte 3 0))
1028
1029 (define-bitfield-emitter emit-mod-reg-r/m-byte 8
1030   (byte 2 6) (byte 3 3) (byte 3 0))
1031
1032 (define-bitfield-emitter emit-sib-byte 8
1033   (byte 2 6) (byte 3 3) (byte 3 0))
1034
1035 (define-bitfield-emitter emit-rex-byte 8
1036   (byte 4 4) (byte 1 3) (byte 1 2) (byte 1 1) (byte 1 0))
1037
1038
1039 \f
1040 ;;;; fixup emitters
1041
1042 (defun emit-absolute-fixup (segment fixup &optional quad-p)
1043   (note-fixup segment (if quad-p :absolute64 :absolute) fixup)
1044   (let ((offset (fixup-offset fixup)))
1045     (if (label-p offset)
1046         (emit-back-patch segment
1047                          (if quad-p 8 4)
1048                          (lambda (segment posn)
1049                            (declare (ignore posn))
1050                            (let ((val  (- (+ (component-header-length)
1051                                              (or (label-position offset)
1052                                                  0))
1053                                           other-pointer-lowtag)))
1054                              (if quad-p
1055                                  (emit-qword segment val)
1056                                  (emit-signed-dword segment val)))))
1057         (if quad-p
1058             (emit-qword segment (or offset 0))
1059             (emit-signed-dword segment (or offset 0))))))
1060
1061 (defun emit-relative-fixup (segment fixup)
1062   (note-fixup segment :relative fixup)
1063   (emit-signed-dword segment (or (fixup-offset fixup) 0)))
1064
1065 \f
1066 ;;;; the effective-address (ea) structure
1067
1068 (defun reg-tn-encoding (tn)
1069   (declare (type tn tn))
1070   ;; ea only has space for three bits of register number: regs r8
1071   ;; and up are selected by a REX prefix byte which caller is responsible
1072   ;; for having emitted where necessary already
1073   (ecase (sb-name (sc-sb (tn-sc tn)))
1074     (registers
1075      (let ((offset (mod (tn-offset tn) 16)))
1076        (logior (ash (logand offset 1) 2)
1077                (ash offset -1))))
1078     (float-registers
1079      (mod (tn-offset tn) 8))))
1080
1081 (defstruct (ea (:constructor make-ea (size &key base index scale disp))
1082                (:copier nil))
1083   ;; note that we can represent an EA with a QWORD size, but EMIT-EA
1084   ;; can't actually emit it on its own: caller also needs to emit REX
1085   ;; prefix
1086   (size nil :type (member :byte :word :dword :qword))
1087   (base nil :type (or tn null))
1088   (index nil :type (or tn null))
1089   (scale 1 :type (member 1 2 4 8))
1090   (disp 0 :type (or (unsigned-byte 32) (signed-byte 32) fixup)))
1091 (def!method print-object ((ea ea) stream)
1092   (cond ((or *print-escape* *print-readably*)
1093          (print-unreadable-object (ea stream :type t)
1094            (format stream
1095                    "~S~@[ base=~S~]~@[ index=~S~]~@[ scale=~S~]~@[ disp=~S~]"
1096                    (ea-size ea)
1097                    (ea-base ea)
1098                    (ea-index ea)
1099                    (let ((scale (ea-scale ea)))
1100                      (if (= scale 1) nil scale))
1101                    (ea-disp ea))))
1102         (t
1103          (format stream "~A PTR [" (symbol-name (ea-size ea)))
1104          (when (ea-base ea)
1105            (write-string (sb!c::location-print-name (ea-base ea)) stream)
1106            (when (ea-index ea)
1107              (write-string "+" stream)))
1108          (when (ea-index ea)
1109            (write-string (sb!c::location-print-name (ea-index ea)) stream))
1110          (unless (= (ea-scale ea) 1)
1111            (format stream "*~A" (ea-scale ea)))
1112          (typecase (ea-disp ea)
1113            (null)
1114            (integer
1115             (format stream "~@D" (ea-disp ea)))
1116            (t
1117             (format stream "+~A" (ea-disp ea))))
1118          (write-char #\] stream))))
1119
1120 (defun emit-constant-tn-rip (segment constant-tn reg remaining-bytes)
1121   ;; AMD64 doesn't currently have a code object register to use as a
1122   ;; base register for constant access. Instead we use RIP-relative
1123   ;; addressing. The offset from the SIMPLE-FUN-HEADER to the instruction
1124   ;; is passed to the backpatch callback. In addition we need the offset
1125   ;; from the start of the function header to the slot in the CODE-HEADER
1126   ;; that stores the constant. Since we don't know where the code header
1127   ;; starts, instead count backwards from the function header.
1128   (let* ((2comp (component-info *component-being-compiled*))
1129          (constants (ir2-component-constants 2comp))
1130          (len (length constants))
1131          ;; Both CODE-HEADER and SIMPLE-FUN-HEADER are 16-byte aligned.
1132          ;; If there are an even amount of constants, there will be
1133          ;; an extra qword of padding before the function header, which
1134          ;; needs to be adjusted for. XXX: This will break if new slots
1135          ;; are added to the code header.
1136          (offset (* (- (+ len (if (evenp len)
1137                                   1
1138                                   2))
1139                        (tn-offset constant-tn))
1140                     n-word-bytes)))
1141     ;; RIP-relative addressing
1142     (emit-mod-reg-r/m-byte segment #b00 reg #b101)
1143     (emit-back-patch segment
1144                      4
1145                      (lambda (segment posn)
1146                        ;; The addressing is relative to end of instruction,
1147                        ;; i.e. the end of this dword. Hence the + 4.
1148                        (emit-signed-dword segment
1149                                           (+ 4 remaining-bytes
1150                                              (- (+ offset posn)))))))
1151   (values))
1152
1153 (defun emit-label-rip (segment fixup reg remaining-bytes)
1154   (let ((label (fixup-offset fixup)))
1155     ;; RIP-relative addressing
1156     (emit-mod-reg-r/m-byte segment #b00 reg #b101)
1157     (emit-back-patch segment
1158                      4
1159                      (lambda (segment posn)
1160                        (emit-signed-dword segment
1161                                           (- (label-position label)
1162                                              (+ posn 4 remaining-bytes))))))
1163   (values))
1164
1165 (defun emit-ea (segment thing reg &key allow-constants (remaining-bytes 0))
1166   (etypecase thing
1167     (tn
1168      ;; this would be eleganter if we had a function that would create
1169      ;; an ea given a tn
1170      (ecase (sb-name (sc-sb (tn-sc thing)))
1171        ((registers float-registers)
1172         (emit-mod-reg-r/m-byte segment #b11 reg (reg-tn-encoding thing)))
1173        (stack
1174         ;; Convert stack tns into an index off RBP.
1175         (let ((disp (frame-byte-offset (tn-offset thing))))
1176           (cond ((<= -128 disp 127)
1177                  (emit-mod-reg-r/m-byte segment #b01 reg #b101)
1178                  (emit-byte segment disp))
1179                 (t
1180                  (emit-mod-reg-r/m-byte segment #b10 reg #b101)
1181                  (emit-signed-dword segment disp)))))
1182        (constant
1183         (unless allow-constants
1184           ;; Why?
1185           (error
1186            "Constant TNs can only be directly used in MOV, PUSH, and CMP."))
1187         (emit-constant-tn-rip segment thing reg remaining-bytes))))
1188     (ea
1189      (let* ((base (ea-base thing))
1190             (index (ea-index thing))
1191             (scale (ea-scale thing))
1192             (disp (ea-disp thing))
1193             (mod (cond ((or (null base)
1194                             (and (eql disp 0)
1195                                  (not (= (reg-tn-encoding base) #b101))))
1196                         #b00)
1197                        ((and (fixnump disp) (<= -128 disp 127))
1198                         #b01)
1199                        (t
1200                         #b10)))
1201             (r/m (cond (index #b100)
1202                        ((null base) #b101)
1203                        (t (reg-tn-encoding base)))))
1204        (when (and (fixup-p disp)
1205                   (label-p (fixup-offset disp)))
1206          (aver (null base))
1207          (aver (null index))
1208          (return-from emit-ea (emit-ea segment disp reg
1209                                        :allow-constants allow-constants
1210                                        :remaining-bytes remaining-bytes)))
1211        (when (and (= mod 0) (= r/m #b101))
1212          ;; this is rip-relative in amd64, so we'll use a sib instead
1213          (setf r/m #b100 scale 1))
1214        (emit-mod-reg-r/m-byte segment mod reg r/m)
1215        (when (= r/m #b100)
1216          (let ((ss (1- (integer-length scale)))
1217                (index (if (null index)
1218                           #b100
1219                           (let ((index (reg-tn-encoding index)))
1220                             (if (= index #b100)
1221                                 (error "can't index off of ESP")
1222                                 index))))
1223                (base (if (null base)
1224                          #b101
1225                          (reg-tn-encoding base))))
1226            (emit-sib-byte segment ss index base)))
1227        (cond ((= mod #b01)
1228               (emit-byte segment disp))
1229              ((or (= mod #b10) (null base))
1230               (if (fixup-p disp)
1231                   (emit-absolute-fixup segment disp)
1232                   (emit-signed-dword segment disp))))))
1233     (fixup
1234      (typecase (fixup-offset thing)
1235        (label
1236         (emit-label-rip segment thing reg remaining-bytes))
1237        (t
1238         (emit-mod-reg-r/m-byte segment #b00 reg #b100)
1239         (emit-sib-byte segment 0 #b100 #b101)
1240         (emit-absolute-fixup segment thing))))))
1241
1242 (defun byte-reg-p (thing)
1243   (and (tn-p thing)
1244        (eq (sb-name (sc-sb (tn-sc thing))) 'registers)
1245        (member (sc-name (tn-sc thing)) *byte-sc-names*)
1246        t))
1247
1248 (defun byte-ea-p (thing)
1249   (typecase thing
1250     (ea (eq (ea-size thing) :byte))
1251     (tn
1252      (and (member (sc-name (tn-sc thing)) *byte-sc-names*) t))
1253     (t nil)))
1254
1255 (defun word-reg-p (thing)
1256   (and (tn-p thing)
1257        (eq (sb-name (sc-sb (tn-sc thing))) 'registers)
1258        (member (sc-name (tn-sc thing)) *word-sc-names*)
1259        t))
1260
1261 (defun word-ea-p (thing)
1262   (typecase thing
1263     (ea (eq (ea-size thing) :word))
1264     (tn (and (member (sc-name (tn-sc thing)) *word-sc-names*) t))
1265     (t nil)))
1266
1267 (defun dword-reg-p (thing)
1268   (and (tn-p thing)
1269        (eq (sb-name (sc-sb (tn-sc thing))) 'registers)
1270        (member (sc-name (tn-sc thing)) *dword-sc-names*)
1271        t))
1272
1273 (defun dword-ea-p (thing)
1274   (typecase thing
1275     (ea (eq (ea-size thing) :dword))
1276     (tn
1277      (and (member (sc-name (tn-sc thing)) *dword-sc-names*) t))
1278     (t nil)))
1279
1280 (defun qword-reg-p (thing)
1281   (and (tn-p thing)
1282        (eq (sb-name (sc-sb (tn-sc thing))) 'registers)
1283        (member (sc-name (tn-sc thing)) *qword-sc-names*)
1284        t))
1285
1286 (defun qword-ea-p (thing)
1287   (typecase thing
1288     (ea (eq (ea-size thing) :qword))
1289     (tn
1290      (and (member (sc-name (tn-sc thing)) *qword-sc-names*) t))
1291     (t nil)))
1292
1293 ;;; Return true if THING is a general-purpose register TN.
1294 (defun register-p (thing)
1295   (and (tn-p thing)
1296        (eq (sb-name (sc-sb (tn-sc thing))) 'registers)))
1297
1298 (defun accumulator-p (thing)
1299   (and (register-p thing)
1300        (= (tn-offset thing) 0)))
1301
1302 ;;; Return true if THING is an XMM register TN.
1303 (defun xmm-register-p (thing)
1304   (and (tn-p thing)
1305        (eq (sb-name (sc-sb (tn-sc thing))) 'float-registers)))
1306
1307 \f
1308 ;;;; utilities
1309
1310 (def!constant +operand-size-prefix-byte+ #b01100110)
1311
1312 (defun maybe-emit-operand-size-prefix (segment size)
1313   (unless (or (eq size :byte)
1314               (eq size :qword)          ; REX prefix handles this
1315               (eq size +default-operand-size+))
1316     (emit-byte segment +operand-size-prefix-byte+)))
1317
1318 ;;; A REX prefix must be emitted if at least one of the following
1319 ;;; conditions is true:
1320 ;;  1. The operand size is :QWORD and the default operand size of the
1321 ;;     instruction is not :QWORD.
1322 ;;; 2. The instruction references an extended register.
1323 ;;; 3. The instruction references one of the byte registers SIL, DIL,
1324 ;;;    SPL or BPL.
1325
1326 ;;; Emit a REX prefix if necessary. OPERAND-SIZE is used to determine
1327 ;;; whether to set REX.W. Callers pass it explicitly as :DO-NOT-SET if
1328 ;;; this should not happen, for example because the instruction's
1329 ;;; default operand size is qword. R, X and B are NIL or TNs specifying
1330 ;;; registers the encodings of which are extended with the REX.R, REX.X
1331 ;;; and REX.B bit, respectively. To determine whether one of the byte
1332 ;;; registers is used that can only be accessed using a REX prefix, we
1333 ;;; need only to test R and B, because X is only used for the index
1334 ;;; register of an effective address and therefore never byte-sized.
1335 ;;; For R we can avoid to calculate the size of the TN because it is
1336 ;;; always OPERAND-SIZE. The size of B must be calculated here because
1337 ;;; B can be address-sized (if it is the base register of an effective
1338 ;;; address), of OPERAND-SIZE (if the instruction operates on two
1339 ;;; registers) or of some different size (in the instructions that
1340 ;;; combine arguments of different sizes: MOVZX, MOVSX, MOVSXD and
1341 ;;; several SSE instructions, e.g. CVTSD2SI). We don't distinguish
1342 ;;; between general-purpose and floating point registers for this cause
1343 ;;; because only general-purpose registers can be byte-sized at all.
1344 (defun maybe-emit-rex-prefix (segment operand-size r x b)
1345   (declare (type (member nil :byte :word :dword :qword :do-not-set)
1346                  operand-size)
1347            (type (or null tn) r x b))
1348   (labels ((if-hi (r)
1349              (if (and r (> (tn-offset r)
1350                            ;; offset of r8 is 16, offset of xmm8 is 8
1351                            (if (eq (sb-name (sc-sb (tn-sc r)))
1352                                    'float-registers)
1353                                7
1354                                15)))
1355                  1
1356                  0))
1357            (reg-4-7-p (r)
1358              ;; Assuming R is a TN describing a general-purpose
1359              ;; register, return true if it references register
1360              ;; 4 upto 7.
1361              (<= 8 (tn-offset r) 15)))
1362     (let ((rex-w (if (eq operand-size :qword) 1 0))
1363           (rex-r (if-hi r))
1364           (rex-x (if-hi x))
1365           (rex-b (if-hi b)))
1366       (when (or (not (zerop (logior rex-w rex-r rex-x rex-b)))
1367                 (and r
1368                      (eq operand-size :byte)
1369                      (reg-4-7-p r))
1370                 (and b
1371                      (eq (operand-size b) :byte)
1372                      (reg-4-7-p b)))
1373         (emit-rex-byte segment #b0100 rex-w rex-r rex-x rex-b)))))
1374
1375 ;;; Emit a REX prefix if necessary. The operand size is determined from
1376 ;;; THING or can be overwritten by OPERAND-SIZE. This and REG are always
1377 ;;; passed to MAYBE-EMIT-REX-PREFIX. Additionally, if THING is an EA we
1378 ;;; pass its index and base registers, if it is a register TN, we pass
1379 ;;; only itself.
1380 ;;; In contrast to EMIT-EA above, neither stack TNs nor fixups need to
1381 ;;; be treated specially here: If THING is a stack TN, neither it nor
1382 ;;; any of its components are passed to MAYBE-EMIT-REX-PREFIX which
1383 ;;; works correctly because stack references always use RBP as the base
1384 ;;; register and never use an index register so no extended registers
1385 ;;; need to be accessed. Fixups are assembled using an addressing mode
1386 ;;; of displacement-only or RIP-plus-displacement (see EMIT-EA), so may
1387 ;;; not reference an extended register. The displacement-only addressing
1388 ;;; mode requires that REX.X is 0, which is ensured here.
1389 (defun maybe-emit-rex-for-ea (segment thing reg &key operand-size)
1390   (declare (type (or ea tn fixup) thing)
1391            (type (or null tn) reg)
1392            (type (member nil :byte :word :dword :qword :do-not-set)
1393                  operand-size))
1394   (let ((ea-p (ea-p thing)))
1395     (maybe-emit-rex-prefix segment
1396                            (or operand-size (operand-size thing))
1397                            reg
1398                            (and ea-p (ea-index thing))
1399                            (cond (ea-p (ea-base thing))
1400                                  ((and (tn-p thing)
1401                                        (member (sb-name (sc-sb (tn-sc thing)))
1402                                                '(float-registers registers)))
1403                                   thing)
1404                                  (t nil)))))
1405
1406 (defun operand-size (thing)
1407   (typecase thing
1408     (tn
1409      ;; FIXME: might as well be COND instead of having to use #. readmacro
1410      ;; to hack up the code
1411      (case (sc-name (tn-sc thing))
1412        (#.*qword-sc-names*
1413         :qword)
1414        (#.*dword-sc-names*
1415         :dword)
1416        (#.*word-sc-names*
1417         :word)
1418        (#.*byte-sc-names*
1419         :byte)
1420        ;; added by jrd: float-registers is a separate size (?)
1421        ;; The only place in the code where we are called with THING
1422        ;; being a float-register is in MAYBE-EMIT-REX-PREFIX when it
1423        ;; checks whether THING is a byte register. Thus our result in
1424        ;; these cases could as well be :dword and :qword. I leave it as
1425        ;; :float and :double which is more likely to trigger an aver
1426        ;; instead of silently doing the wrong thing in case this
1427        ;; situation should change. Lutz Euler, 2005-10-23.
1428        (#.*float-sc-names*
1429         :float)
1430        (#.*double-sc-names*
1431         :double)
1432        (#.*complex-sc-names*
1433         :complex)
1434        (t
1435         (error "can't tell the size of ~S ~S" thing (sc-name (tn-sc thing))))))
1436     (ea
1437      (ea-size thing))
1438     (fixup
1439      ;; GNA.  Guess who spelt "flavor" correctly first time round?
1440      ;; There's a strong argument in my mind to change all uses of
1441      ;; "flavor" to "kind": and similarly with some misguided uses of
1442      ;; "type" here and there.  -- CSR, 2005-01-06.
1443      (case (fixup-flavor thing)
1444        ((:foreign-dataref) :qword)))
1445     (t
1446      nil)))
1447
1448 (defun matching-operand-size (dst src)
1449   (let ((dst-size (operand-size dst))
1450         (src-size (operand-size src)))
1451     (if dst-size
1452         (if src-size
1453             (if (eq dst-size src-size)
1454                 dst-size
1455                 (error "size mismatch: ~S is a ~S and ~S is a ~S."
1456                        dst dst-size src src-size))
1457             dst-size)
1458         (if src-size
1459             src-size
1460             (error "can't tell the size of either ~S or ~S" dst src)))))
1461
1462 ;;; Except in a very few cases (MOV instructions A1, A3 and B8 - BF)
1463 ;;; we expect dword data bytes even when 64 bit work is being done.
1464 ;;; But A1 and A3 are currently unused and B8 - BF use EMIT-QWORD
1465 ;;; directly, so we emit all quad constants as dwords, additionally
1466 ;;; making sure that they survive the sign-extension to 64 bits
1467 ;;; unchanged.
1468 (defun emit-sized-immediate (segment size value)
1469   (ecase size
1470     (:byte
1471      (emit-byte segment value))
1472     (:word
1473      (emit-word segment value))
1474     (:dword
1475      (emit-dword segment value))
1476     (:qword
1477      (emit-signed-dword segment value))))
1478 \f
1479 ;;;; prefixes
1480
1481 (define-instruction rex (segment)
1482   (:printer rex () nil :print-name nil)
1483   (:emitter
1484    (bug "REX prefix used as a standalone instruction")))
1485
1486 (define-instruction x66 (segment)
1487   (:printer x66 () nil :print-name nil)
1488   (:emitter
1489    (bug "#X66 prefix used as a standalone instruction")))
1490
1491 (defun emit-prefix (segment name)
1492   (declare (ignorable segment))
1493   (ecase name
1494     ((nil))
1495     (:lock
1496      #!+sb-thread
1497      (emit-byte segment #xf0))))
1498
1499 (define-instruction lock (segment)
1500   (:printer byte ((op #b11110000)) nil)
1501   (:emitter
1502    (bug "LOCK prefix used as a standalone instruction")))
1503
1504 (define-instruction rep (segment)
1505   (:emitter
1506    (emit-byte segment #b11110011)))
1507
1508 (define-instruction repe (segment)
1509   (:printer byte ((op #b11110011)) nil)
1510   (:emitter
1511    (emit-byte segment #b11110011)))
1512
1513 (define-instruction repne (segment)
1514   (:printer byte ((op #b11110010)) nil)
1515   (:emitter
1516    (emit-byte segment #b11110010)))
1517
1518 ;;;; general data transfer
1519
1520 ;;; This is the part of the MOV instruction emitter that does moving
1521 ;;; of an immediate value into a qword register. We go to some length
1522 ;;; to achieve the shortest possible encoding.
1523 (defun emit-immediate-move-to-qword-register (segment dst src)
1524   (declare (type integer src))
1525   (cond ((typep src '(unsigned-byte 32))
1526          ;; We use the B8 - BF encoding with an operand size of 32 bits
1527          ;; here and let the implicit zero-extension fill the upper half
1528          ;; of the 64-bit destination register. Instruction size: five
1529          ;; or six bytes. (A REX prefix will be emitted only if the
1530          ;; destination is an extended register.)
1531          (maybe-emit-rex-prefix segment :dword nil nil dst)
1532          (emit-byte-with-reg segment #b10111 (reg-tn-encoding dst))
1533          (emit-dword segment src))
1534         (t
1535          (maybe-emit-rex-prefix segment :qword nil nil dst)
1536          (cond ((typep src '(signed-byte 32))
1537                 ;; Use the C7 encoding that takes a 32-bit immediate and
1538                 ;; sign-extends it to 64 bits. Instruction size: seven
1539                 ;; bytes.
1540                 (emit-byte segment #b11000111)
1541                 (emit-mod-reg-r/m-byte segment #b11 #b000
1542                                        (reg-tn-encoding dst))
1543                 (emit-signed-dword segment src))
1544                ((<= (- (expt 2 64) (expt 2 31))
1545                     src
1546                     (1- (expt 2 64)))
1547                 ;; This triggers on positive integers of 64 bits length
1548                 ;; with the most significant 33 bits being 1. We use the
1549                 ;; same encoding as in the previous clause.
1550                 (emit-byte segment #b11000111)
1551                 (emit-mod-reg-r/m-byte segment #b11 #b000
1552                                        (reg-tn-encoding dst))
1553                 (emit-signed-dword segment (- src (expt 2 64))))
1554                (t
1555                 ;; We need a full 64-bit immediate. Instruction size:
1556                 ;; ten bytes.
1557                 (emit-byte-with-reg segment #b10111 (reg-tn-encoding dst))
1558                 (emit-qword segment src))))))
1559
1560 (define-instruction mov (segment dst src)
1561   ;; immediate to register
1562   (:printer reg ((op #b1011) (imm nil :type 'signed-imm-data))
1563             '(:name :tab reg ", " imm))
1564   (:printer rex-reg ((op #b1011) (imm nil :type 'signed-imm-data-upto-qword))
1565             '(:name :tab reg ", " imm))
1566   ;; absolute mem to/from accumulator
1567   (:printer simple-dir ((op #b101000) (imm nil :type 'imm-addr))
1568             `(:name :tab ,(swap-if 'dir 'accum ", " '("[" imm "]"))))
1569   ;; register to/from register/memory
1570   (:printer reg-reg/mem-dir ((op #b100010)))
1571   ;; immediate to register/memory
1572   (:printer reg/mem-imm ((op '(#b1100011 #b000))))
1573
1574   (:emitter
1575    (let ((size (matching-operand-size dst src)))
1576      (maybe-emit-operand-size-prefix segment size)
1577      (cond ((register-p dst)
1578             (cond ((integerp src)
1579                    (cond ((eq size :qword)
1580                           (emit-immediate-move-to-qword-register segment
1581                                                                  dst src))
1582                          (t
1583                           (maybe-emit-rex-prefix segment size nil nil dst)
1584                           (emit-byte-with-reg segment
1585                                               (if (eq size :byte)
1586                                                   #b10110
1587                                                   #b10111)
1588                                               (reg-tn-encoding dst))
1589                           (emit-sized-immediate segment size src))))
1590                   (t
1591                    (maybe-emit-rex-for-ea segment src dst)
1592                    (emit-byte segment
1593                               (if (eq size :byte)
1594                                   #b10001010
1595                                   #b10001011))
1596                    (emit-ea segment src (reg-tn-encoding dst) :allow-constants t))))
1597            ((integerp src)
1598             ;; C7 only deals with 32 bit immediates even if the
1599             ;; destination is a 64-bit location. The value is
1600             ;; sign-extended in this case.
1601             (maybe-emit-rex-for-ea segment dst nil)
1602             (emit-byte segment (if (eq size :byte) #b11000110 #b11000111))
1603             (emit-ea segment dst #b000)
1604             (emit-sized-immediate segment size src))
1605            ((register-p src)
1606             (maybe-emit-rex-for-ea segment dst src)
1607             (emit-byte segment (if (eq size :byte) #b10001000 #b10001001))
1608             (emit-ea segment dst (reg-tn-encoding src)))
1609            ((fixup-p src)
1610             ;; Generally we can't MOV a fixupped value into an EA, since
1611             ;; MOV on non-registers can only take a 32-bit immediate arg.
1612             ;; Make an exception for :FOREIGN fixups (pretty much just
1613             ;; the runtime asm, since other foreign calls go through the
1614             ;; the linkage table) and for linkage table references, since
1615             ;; these should always end up in low memory.
1616             (aver (or (eq (fixup-flavor src) :foreign)
1617                       (eq (fixup-flavor src) :foreign-dataref)
1618                       (eq (ea-size dst) :dword)))
1619             (maybe-emit-rex-for-ea segment dst nil)
1620             (emit-byte segment #b11000111)
1621             (emit-ea segment dst #b000)
1622             (emit-absolute-fixup segment src))
1623            (t
1624             (error "bogus arguments to MOV: ~S ~S" dst src))))))
1625
1626 (defun emit-move-with-extension (segment dst src signed-p)
1627   (aver (register-p dst))
1628   (let ((dst-size (operand-size dst))
1629         (src-size (operand-size src))
1630         (opcode (if signed-p  #b10111110 #b10110110)))
1631     (ecase dst-size
1632       (:word
1633        (aver (eq src-size :byte))
1634        (maybe-emit-operand-size-prefix segment :word)
1635        ;; REX prefix is needed if SRC is SIL, DIL, SPL or BPL.
1636        (maybe-emit-rex-for-ea segment src dst :operand-size :word)
1637        (emit-byte segment #b00001111)
1638        (emit-byte segment opcode)
1639        (emit-ea segment src (reg-tn-encoding dst)))
1640       ((:dword :qword)
1641        (ecase src-size
1642          (:byte
1643           (maybe-emit-rex-for-ea segment src dst :operand-size dst-size)
1644           (emit-byte segment #b00001111)
1645           (emit-byte segment opcode)
1646           (emit-ea segment src (reg-tn-encoding dst)))
1647          (:word
1648           (maybe-emit-rex-for-ea segment src dst :operand-size dst-size)
1649           (emit-byte segment #b00001111)
1650           (emit-byte segment (logior opcode 1))
1651           (emit-ea segment src (reg-tn-encoding dst)))
1652          (:dword
1653           (aver (eq dst-size :qword))
1654           ;; dst is in reg, src is in modrm
1655           (let ((ea-p (ea-p src)))
1656             (maybe-emit-rex-prefix segment (if signed-p :qword :dword) dst
1657                                    (and ea-p (ea-index src))
1658                                    (cond (ea-p (ea-base src))
1659                                          ((tn-p src) src)
1660                                          (t nil)))
1661             (emit-byte segment (if signed-p #x63 #x8b)) ;movsxd or straight mov
1662             ;;(emit-byte segment opcode)
1663             (emit-ea segment src (reg-tn-encoding dst)))))))))
1664
1665 (define-instruction movsx (segment dst src)
1666   (:printer ext-reg-reg/mem-no-width
1667             ((op #b10111110) (reg/mem nil :type 'sized-byte-reg/mem)))
1668   (:printer ext-reg-reg/mem-no-width
1669             ((op #b10111111) (reg/mem nil :type 'sized-word-reg/mem)))
1670   (:emitter (emit-move-with-extension segment dst src :signed)))
1671
1672 (define-instruction movzx (segment dst src)
1673   (:printer ext-reg-reg/mem-no-width
1674             ((op #b10110110) (reg/mem nil :type 'sized-byte-reg/mem)))
1675   (:printer ext-reg-reg/mem-no-width
1676             ((op #b10110111) (reg/mem nil :type 'sized-word-reg/mem)))
1677   (:emitter (emit-move-with-extension segment dst src nil)))
1678
1679 ;;; The regular use of MOVSXD is with an operand size of :qword. This
1680 ;;; sign-extends the dword source into the qword destination register.
1681 ;;; If the operand size is :dword the instruction zero-extends the dword
1682 ;;; source into the qword destination register, i.e. it does the same as
1683 ;;; a dword MOV into a register.
1684 (define-instruction movsxd (segment dst src)
1685   (:printer reg-reg/mem ((op #b0110001) (width 1)
1686                          (reg/mem nil :type 'sized-dword-reg/mem)))
1687   (:emitter (emit-move-with-extension segment dst src :signed)))
1688
1689 ;;; this is not a real amd64 instruction, of course
1690 (define-instruction movzxd (segment dst src)
1691   ; (:printer reg-reg/mem ((op #x63) (reg nil :type 'reg)))
1692   (:emitter (emit-move-with-extension segment dst src nil)))
1693
1694 (define-instruction push (segment src)
1695   ;; register
1696   (:printer reg-no-width-default-qword ((op #b01010)))
1697   ;; register/memory
1698   (:printer reg/mem-default-qword ((op '(#b11111111 #b110))))
1699   ;; immediate
1700   (:printer byte ((op #b01101010) (imm nil :type 'signed-imm-byte))
1701             '(:name :tab imm))
1702   (:printer byte ((op #b01101000)
1703                   (imm nil :type 'signed-imm-data-default-qword))
1704             '(:name :tab imm))
1705   ;; ### segment registers?
1706
1707   (:emitter
1708    (cond ((integerp src)
1709           (cond ((<= -128 src 127)
1710                  (emit-byte segment #b01101010)
1711                  (emit-byte segment src))
1712                 (t
1713                  ;; A REX-prefix is not needed because the operand size
1714                  ;; defaults to 64 bits. The size of the immediate is 32
1715                  ;; bits and it is sign-extended.
1716                  (emit-byte segment #b01101000)
1717                  (emit-signed-dword segment src))))
1718          (t
1719           (let ((size (operand-size src)))
1720             (aver (or (eq size :qword) (eq size :word)))
1721             (maybe-emit-operand-size-prefix segment size)
1722             (maybe-emit-rex-for-ea segment src nil :operand-size :do-not-set)
1723             (cond ((register-p src)
1724                    (emit-byte-with-reg segment #b01010 (reg-tn-encoding src)))
1725                   (t
1726                    (emit-byte segment #b11111111)
1727                    (emit-ea segment src #b110 :allow-constants t))))))))
1728
1729 (define-instruction pop (segment dst)
1730   (:printer reg-no-width-default-qword ((op #b01011)))
1731   (:printer reg/mem-default-qword ((op '(#b10001111 #b000))))
1732   (:emitter
1733    (let ((size (operand-size dst)))
1734      (aver (or (eq size :qword) (eq size :word)))
1735      (maybe-emit-operand-size-prefix segment size)
1736      (maybe-emit-rex-for-ea segment dst nil :operand-size :do-not-set)
1737      (cond ((register-p dst)
1738             (emit-byte-with-reg segment #b01011 (reg-tn-encoding dst)))
1739            (t
1740             (emit-byte segment #b10001111)
1741             (emit-ea segment dst #b000))))))
1742
1743 (define-instruction xchg (segment operand1 operand2)
1744   ;; Register with accumulator.
1745   (:printer reg-no-width ((op #b10010)) '(:name :tab accum ", " reg))
1746   ;; Register/Memory with Register.
1747   (:printer reg-reg/mem ((op #b1000011)))
1748   (:emitter
1749    (let ((size (matching-operand-size operand1 operand2)))
1750      (maybe-emit-operand-size-prefix segment size)
1751      (labels ((xchg-acc-with-something (acc something)
1752                 (if (and (not (eq size :byte)) (register-p something))
1753                     (progn
1754                       (maybe-emit-rex-for-ea segment acc something)
1755                       (emit-byte-with-reg segment
1756                                           #b10010
1757                                           (reg-tn-encoding something)))
1758                     (xchg-reg-with-something acc something)))
1759               (xchg-reg-with-something (reg something)
1760                 (maybe-emit-rex-for-ea segment something reg)
1761                 (emit-byte segment (if (eq size :byte) #b10000110 #b10000111))
1762                 (emit-ea segment something (reg-tn-encoding reg))))
1763        (cond ((accumulator-p operand1)
1764               (xchg-acc-with-something operand1 operand2))
1765              ((accumulator-p operand2)
1766               (xchg-acc-with-something operand2 operand1))
1767              ((register-p operand1)
1768               (xchg-reg-with-something operand1 operand2))
1769              ((register-p operand2)
1770               (xchg-reg-with-something operand2 operand1))
1771              (t
1772               (error "bogus args to XCHG: ~S ~S" operand1 operand2)))))))
1773
1774 (define-instruction lea (segment dst src)
1775   (:printer reg-reg/mem ((op #b1000110) (width 1)))
1776   (:emitter
1777    (aver (or (dword-reg-p dst) (qword-reg-p dst)))
1778    (maybe-emit-rex-for-ea segment src dst
1779                           :operand-size :qword)
1780    (emit-byte segment #b10001101)
1781    (emit-ea segment src (reg-tn-encoding dst))))
1782
1783 (define-instruction cmpxchg (segment dst src &optional prefix)
1784   ;; Register/Memory with Register.
1785   (:printer ext-reg-reg/mem ((op #b1011000)) '(:name :tab reg/mem ", " reg))
1786   (:emitter
1787    (aver (register-p src))
1788    (emit-prefix segment prefix)
1789    (let ((size (matching-operand-size src dst)))
1790      (maybe-emit-operand-size-prefix segment size)
1791      (maybe-emit-rex-for-ea segment dst src)
1792      (emit-byte segment #b00001111)
1793      (emit-byte segment (if (eq size :byte) #b10110000 #b10110001))
1794      (emit-ea segment dst (reg-tn-encoding src)))))
1795
1796 \f
1797 ;;;; flag control instructions
1798
1799 ;;; CLC -- Clear Carry Flag.
1800 (define-instruction clc (segment)
1801   (:printer byte ((op #b11111000)))
1802   (:emitter
1803    (emit-byte segment #b11111000)))
1804
1805 ;;; CLD -- Clear Direction Flag.
1806 (define-instruction cld (segment)
1807   (:printer byte ((op #b11111100)))
1808   (:emitter
1809    (emit-byte segment #b11111100)))
1810
1811 ;;; CLI -- Clear Iterrupt Enable Flag.
1812 (define-instruction cli (segment)
1813   (:printer byte ((op #b11111010)))
1814   (:emitter
1815    (emit-byte segment #b11111010)))
1816
1817 ;;; CMC -- Complement Carry Flag.
1818 (define-instruction cmc (segment)
1819   (:printer byte ((op #b11110101)))
1820   (:emitter
1821    (emit-byte segment #b11110101)))
1822
1823 ;;; LAHF -- Load AH into flags.
1824 (define-instruction lahf (segment)
1825   (:printer byte ((op #b10011111)))
1826   (:emitter
1827    (emit-byte segment #b10011111)))
1828
1829 ;;; POPF -- Pop flags.
1830 (define-instruction popf (segment)
1831   (:printer byte ((op #b10011101)))
1832   (:emitter
1833    (emit-byte segment #b10011101)))
1834
1835 ;;; PUSHF -- push flags.
1836 (define-instruction pushf (segment)
1837   (:printer byte ((op #b10011100)))
1838   (:emitter
1839    (emit-byte segment #b10011100)))
1840
1841 ;;; SAHF -- Store AH into flags.
1842 (define-instruction sahf (segment)
1843   (:printer byte ((op #b10011110)))
1844   (:emitter
1845    (emit-byte segment #b10011110)))
1846
1847 ;;; STC -- Set Carry Flag.
1848 (define-instruction stc (segment)
1849   (:printer byte ((op #b11111001)))
1850   (:emitter
1851    (emit-byte segment #b11111001)))
1852
1853 ;;; STD -- Set Direction Flag.
1854 (define-instruction std (segment)
1855   (:printer byte ((op #b11111101)))
1856   (:emitter
1857    (emit-byte segment #b11111101)))
1858
1859 ;;; STI -- Set Interrupt Enable Flag.
1860 (define-instruction sti (segment)
1861   (:printer byte ((op #b11111011)))
1862   (:emitter
1863    (emit-byte segment #b11111011)))
1864 \f
1865 ;;;; arithmetic
1866
1867 (defun emit-random-arith-inst (name segment dst src opcode
1868                                     &optional allow-constants)
1869   (let ((size (matching-operand-size dst src)))
1870     (maybe-emit-operand-size-prefix segment size)
1871     (cond
1872      ((integerp src)
1873       (cond ((and (not (eq size :byte)) (<= -128 src 127))
1874              (maybe-emit-rex-for-ea segment dst nil)
1875              (emit-byte segment #b10000011)
1876              (emit-ea segment dst opcode :allow-constants allow-constants)
1877              (emit-byte segment src))
1878             ((accumulator-p dst)
1879              (maybe-emit-rex-for-ea segment dst nil)
1880              (emit-byte segment
1881                         (dpb opcode
1882                              (byte 3 3)
1883                              (if (eq size :byte)
1884                                  #b00000100
1885                                  #b00000101)))
1886              (emit-sized-immediate segment size src))
1887             (t
1888              (maybe-emit-rex-for-ea segment dst nil)
1889              (emit-byte segment (if (eq size :byte) #b10000000 #b10000001))
1890              (emit-ea segment dst opcode :allow-constants allow-constants)
1891              (emit-sized-immediate segment size src))))
1892      ((register-p src)
1893       (maybe-emit-rex-for-ea segment dst src)
1894       (emit-byte segment
1895                  (dpb opcode
1896                       (byte 3 3)
1897                       (if (eq size :byte) #b00000000 #b00000001)))
1898       (emit-ea segment dst (reg-tn-encoding src) :allow-constants allow-constants))
1899      ((register-p dst)
1900       (maybe-emit-rex-for-ea segment src dst)
1901       (emit-byte segment
1902                  (dpb opcode
1903                       (byte 3 3)
1904                       (if (eq size :byte) #b00000010 #b00000011)))
1905       (emit-ea segment src (reg-tn-encoding dst) :allow-constants allow-constants))
1906      (t
1907       (error "bogus operands to ~A" name)))))
1908
1909 (eval-when (:compile-toplevel :execute)
1910   (defun arith-inst-printer-list (subop)
1911     `((accum-imm ((op ,(dpb subop (byte 3 2) #b0000010))))
1912       (reg/mem-imm ((op (#b1000000 ,subop))))
1913       ;; The redundant encoding #x82 is invalid in 64-bit mode,
1914       ;; therefore we force WIDTH to 1.
1915       (reg/mem-imm ((op (#b1000001 ,subop)) (width 1)
1916                     (imm nil :type signed-imm-byte)))
1917       (reg-reg/mem-dir ((op ,(dpb subop (byte 3 1) #b000000)))))))
1918
1919 (define-instruction add (segment dst src &optional prefix)
1920   (:printer-list (arith-inst-printer-list #b000))
1921   (:emitter
1922    (emit-prefix segment prefix)
1923    (emit-random-arith-inst "ADD" segment dst src #b000)))
1924
1925 (define-instruction adc (segment dst src)
1926   (:printer-list (arith-inst-printer-list #b010))
1927   (:emitter (emit-random-arith-inst "ADC" segment dst src #b010)))
1928
1929 (define-instruction sub (segment dst src)
1930   (:printer-list (arith-inst-printer-list #b101))
1931   (:emitter (emit-random-arith-inst "SUB" segment dst src #b101)))
1932
1933 (define-instruction sbb (segment dst src)
1934   (:printer-list (arith-inst-printer-list #b011))
1935   (:emitter (emit-random-arith-inst "SBB" segment dst src #b011)))
1936
1937 (define-instruction cmp (segment dst src)
1938   (:printer-list (arith-inst-printer-list #b111))
1939   (:emitter (emit-random-arith-inst "CMP" segment dst src #b111 t)))
1940
1941 ;;; The one-byte encodings for INC and DEC are used as REX prefixes
1942 ;;; in 64-bit mode so we always use the two-byte form.
1943 (define-instruction inc (segment dst)
1944   (:printer reg/mem ((op '(#b1111111 #b000))))
1945   (:emitter
1946    (let ((size (operand-size dst)))
1947      (maybe-emit-operand-size-prefix segment size)
1948      (maybe-emit-rex-for-ea segment dst nil)
1949      (emit-byte segment (if (eq size :byte) #b11111110 #b11111111))
1950      (emit-ea segment dst #b000))))
1951
1952 (define-instruction dec (segment dst)
1953   (:printer reg/mem ((op '(#b1111111 #b001))))
1954   (:emitter
1955    (let ((size (operand-size dst)))
1956      (maybe-emit-operand-size-prefix segment size)
1957      (maybe-emit-rex-for-ea segment dst nil)
1958      (emit-byte segment (if (eq size :byte) #b11111110 #b11111111))
1959      (emit-ea segment dst #b001))))
1960
1961 (define-instruction neg (segment dst)
1962   (:printer reg/mem ((op '(#b1111011 #b011))))
1963   (:emitter
1964    (let ((size (operand-size dst)))
1965      (maybe-emit-operand-size-prefix segment size)
1966      (maybe-emit-rex-for-ea segment dst nil)
1967      (emit-byte segment (if (eq size :byte) #b11110110 #b11110111))
1968      (emit-ea segment dst #b011))))
1969
1970 (define-instruction mul (segment dst src)
1971   (:printer accum-reg/mem ((op '(#b1111011 #b100))))
1972   (:emitter
1973    (let ((size (matching-operand-size dst src)))
1974      (aver (accumulator-p dst))
1975      (maybe-emit-operand-size-prefix segment size)
1976      (maybe-emit-rex-for-ea segment src nil)
1977      (emit-byte segment (if (eq size :byte) #b11110110 #b11110111))
1978      (emit-ea segment src #b100))))
1979
1980 (define-instruction imul (segment dst &optional src1 src2)
1981   (:printer accum-reg/mem ((op '(#b1111011 #b101))))
1982   (:printer ext-reg-reg/mem-no-width ((op #b10101111)))
1983   (:printer reg-reg/mem ((op #b0110100) (width 1)
1984                          (imm nil :type 'signed-imm-data))
1985             '(:name :tab reg ", " reg/mem ", " imm))
1986   (:printer reg-reg/mem ((op #b0110101) (width 1)
1987                          (imm nil :type 'signed-imm-byte))
1988             '(:name :tab reg ", " reg/mem ", " imm))
1989   (:emitter
1990    (flet ((r/m-with-immed-to-reg (reg r/m immed)
1991             (let* ((size (matching-operand-size reg r/m))
1992                    (sx (and (not (eq size :byte)) (<= -128 immed 127))))
1993               (maybe-emit-operand-size-prefix segment size)
1994               (maybe-emit-rex-for-ea segment r/m reg)
1995               (emit-byte segment (if sx #b01101011 #b01101001))
1996               (emit-ea segment r/m (reg-tn-encoding reg))
1997               (if sx
1998                   (emit-byte segment immed)
1999                   (emit-sized-immediate segment size immed)))))
2000      (cond (src2
2001             (r/m-with-immed-to-reg dst src1 src2))
2002            (src1
2003             (if (integerp src1)
2004                 (r/m-with-immed-to-reg dst dst src1)
2005                 (let ((size (matching-operand-size dst src1)))
2006                   (maybe-emit-operand-size-prefix segment size)
2007                   (maybe-emit-rex-for-ea segment src1 dst)
2008                   (emit-byte segment #b00001111)
2009                   (emit-byte segment #b10101111)
2010                   (emit-ea segment src1 (reg-tn-encoding dst)))))
2011            (t
2012             (let ((size (operand-size dst)))
2013               (maybe-emit-operand-size-prefix segment size)
2014               (maybe-emit-rex-for-ea segment dst nil)
2015               (emit-byte segment (if (eq size :byte) #b11110110 #b11110111))
2016               (emit-ea segment dst #b101)))))))
2017
2018 (define-instruction div (segment dst src)
2019   (:printer accum-reg/mem ((op '(#b1111011 #b110))))
2020   (:emitter
2021    (let ((size (matching-operand-size dst src)))
2022      (aver (accumulator-p dst))
2023      (maybe-emit-operand-size-prefix segment size)
2024      (maybe-emit-rex-for-ea segment src nil)
2025      (emit-byte segment (if (eq size :byte) #b11110110 #b11110111))
2026      (emit-ea segment src #b110))))
2027
2028 (define-instruction idiv (segment dst src)
2029   (:printer accum-reg/mem ((op '(#b1111011 #b111))))
2030   (:emitter
2031    (let ((size (matching-operand-size dst src)))
2032      (aver (accumulator-p dst))
2033      (maybe-emit-operand-size-prefix segment size)
2034      (maybe-emit-rex-for-ea segment src nil)
2035      (emit-byte segment (if (eq size :byte) #b11110110 #b11110111))
2036      (emit-ea segment src #b111))))
2037
2038 (define-instruction bswap (segment dst)
2039   (:printer ext-reg-no-width ((op #b11001)))
2040   (:emitter
2041    (let ((size (operand-size dst)))
2042      (maybe-emit-rex-prefix segment size nil nil dst)
2043      (emit-byte segment #x0f)
2044      (emit-byte-with-reg segment #b11001 (reg-tn-encoding dst)))))
2045
2046 ;;; CBW -- Convert Byte to Word. AX <- sign_xtnd(AL)
2047 (define-instruction cbw (segment)
2048   (:printer x66-byte ((op #b10011000)))
2049   (:emitter
2050    (maybe-emit-operand-size-prefix segment :word)
2051    (emit-byte segment #b10011000)))
2052
2053 ;;; CWDE -- Convert Word To Double Word Extended. EAX <- sign_xtnd(AX)
2054 (define-instruction cwde (segment)
2055   (:printer byte ((op #b10011000)))
2056   (:emitter
2057    (maybe-emit-operand-size-prefix segment :dword)
2058    (emit-byte segment #b10011000)))
2059
2060 ;;; CDQE -- Convert Double Word To Quad Word Extended. RAX <- sign_xtnd(EAX)
2061 (define-instruction cdqe (segment)
2062   (:printer rex-byte ((op #b10011000)))
2063   (:emitter
2064    (maybe-emit-rex-prefix segment :qword nil nil nil)
2065    (emit-byte segment #b10011000)))
2066
2067 ;;; CWD -- Convert Word to Double Word. DX:AX <- sign_xtnd(AX)
2068 (define-instruction cwd (segment)
2069   (:printer x66-byte ((op #b10011001)))
2070   (:emitter
2071    (maybe-emit-operand-size-prefix segment :word)
2072    (emit-byte segment #b10011001)))
2073
2074 ;;; CDQ -- Convert Double Word to Quad Word. EDX:EAX <- sign_xtnd(EAX)
2075 (define-instruction cdq (segment)
2076   (:printer byte ((op #b10011001)))
2077   (:emitter
2078    (maybe-emit-operand-size-prefix segment :dword)
2079    (emit-byte segment #b10011001)))
2080
2081 ;;; CQO -- Convert Quad Word to Octaword. RDX:RAX <- sign_xtnd(RAX)
2082 (define-instruction cqo (segment)
2083   (:printer rex-byte ((op #b10011001)))
2084   (:emitter
2085    (maybe-emit-rex-prefix segment :qword nil nil nil)
2086    (emit-byte segment #b10011001)))
2087
2088 (define-instruction xadd (segment dst src &optional prefix)
2089   ;; Register/Memory with Register.
2090   (:printer ext-reg-reg/mem ((op #b1100000)) '(:name :tab reg/mem ", " reg))
2091   (:emitter
2092    (aver (register-p src))
2093    (emit-prefix segment prefix)
2094    (let ((size (matching-operand-size src dst)))
2095      (maybe-emit-operand-size-prefix segment size)
2096      (maybe-emit-rex-for-ea segment dst src)
2097      (emit-byte segment #b00001111)
2098      (emit-byte segment (if (eq size :byte) #b11000000 #b11000001))
2099      (emit-ea segment dst (reg-tn-encoding src)))))
2100
2101 \f
2102 ;;;; logic
2103
2104 (defun emit-shift-inst (segment dst amount opcode)
2105   (let ((size (operand-size dst)))
2106     (maybe-emit-operand-size-prefix segment size)
2107     (multiple-value-bind (major-opcode immed)
2108         (case amount
2109           (:cl (values #b11010010 nil))
2110           (1 (values #b11010000 nil))
2111           (t (values #b11000000 t)))
2112       (maybe-emit-rex-for-ea segment dst nil)
2113       (emit-byte segment
2114                  (if (eq size :byte) major-opcode (logior major-opcode 1)))
2115       (emit-ea segment dst opcode)
2116       (when immed
2117         (emit-byte segment amount)))))
2118
2119 (eval-when (:compile-toplevel :execute)
2120   (defun shift-inst-printer-list (subop)
2121     `((reg/mem ((op (#b1101000 ,subop)))
2122                (:name :tab reg/mem ", 1"))
2123       (reg/mem ((op (#b1101001 ,subop)))
2124                (:name :tab reg/mem ", " 'cl))
2125       (reg/mem-imm ((op (#b1100000 ,subop))
2126                     (imm nil :type imm-byte))))))
2127
2128 (define-instruction rol (segment dst amount)
2129   (:printer-list
2130    (shift-inst-printer-list #b000))
2131   (:emitter
2132    (emit-shift-inst segment dst amount #b000)))
2133
2134 (define-instruction ror (segment dst amount)
2135   (:printer-list
2136    (shift-inst-printer-list #b001))
2137   (:emitter
2138    (emit-shift-inst segment dst amount #b001)))
2139
2140 (define-instruction rcl (segment dst amount)
2141   (:printer-list
2142    (shift-inst-printer-list #b010))
2143   (:emitter
2144    (emit-shift-inst segment dst amount #b010)))
2145
2146 (define-instruction rcr (segment dst amount)
2147   (:printer-list
2148    (shift-inst-printer-list #b011))
2149   (:emitter
2150    (emit-shift-inst segment dst amount #b011)))
2151
2152 (define-instruction shl (segment dst amount)
2153   (:printer-list
2154    (shift-inst-printer-list #b100))
2155   (:emitter
2156    (emit-shift-inst segment dst amount #b100)))
2157
2158 (define-instruction shr (segment dst amount)
2159   (:printer-list
2160    (shift-inst-printer-list #b101))
2161   (:emitter
2162    (emit-shift-inst segment dst amount #b101)))
2163
2164 (define-instruction sar (segment dst amount)
2165   (:printer-list
2166    (shift-inst-printer-list #b111))
2167   (:emitter
2168    (emit-shift-inst segment dst amount #b111)))
2169
2170 (defun emit-double-shift (segment opcode dst src amt)
2171   (let ((size (matching-operand-size dst src)))
2172     (when (eq size :byte)
2173       (error "Double shifts can only be used with words."))
2174     (maybe-emit-operand-size-prefix segment size)
2175     (maybe-emit-rex-for-ea segment dst src)
2176     (emit-byte segment #b00001111)
2177     (emit-byte segment (dpb opcode (byte 1 3)
2178                             (if (eq amt :cl) #b10100101 #b10100100)))
2179     (emit-ea segment dst (reg-tn-encoding src))
2180     (unless (eq amt :cl)
2181       (emit-byte segment amt))))
2182
2183 (eval-when (:compile-toplevel :execute)
2184   (defun double-shift-inst-printer-list (op)
2185     `((ext-reg-reg/mem-no-width ((op ,(logior op #b100))
2186                                  (imm nil :type imm-byte)))
2187       (ext-reg-reg/mem-no-width ((op ,(logior op #b101)))
2188          (:name :tab reg/mem ", " reg ", " 'cl)))))
2189
2190 (define-instruction shld (segment dst src amt)
2191   (:declare (type (or (member :cl) (mod 64)) amt))
2192   (:printer-list (double-shift-inst-printer-list #b10100000))
2193   (:emitter
2194    (emit-double-shift segment #b0 dst src amt)))
2195
2196 (define-instruction shrd (segment dst src amt)
2197   (:declare (type (or (member :cl) (mod 64)) amt))
2198   (:printer-list (double-shift-inst-printer-list #b10101000))
2199   (:emitter
2200    (emit-double-shift segment #b1 dst src amt)))
2201
2202 (define-instruction and (segment dst src)
2203   (:printer-list
2204    (arith-inst-printer-list #b100))
2205   (:emitter
2206    (emit-random-arith-inst "AND" segment dst src #b100)))
2207
2208 (define-instruction test (segment this that)
2209   (:printer accum-imm ((op #b1010100)))
2210   (:printer reg/mem-imm ((op '(#b1111011 #b000))))
2211   (:printer reg-reg/mem ((op #b1000010)))
2212   (:emitter
2213    (let ((size (matching-operand-size this that)))
2214      (maybe-emit-operand-size-prefix segment size)
2215      (flet ((test-immed-and-something (immed something)
2216               (cond ((accumulator-p something)
2217                      (maybe-emit-rex-for-ea segment something nil)
2218                      (emit-byte segment
2219                                 (if (eq size :byte) #b10101000 #b10101001))
2220                      (emit-sized-immediate segment size immed))
2221                     (t
2222                      (maybe-emit-rex-for-ea segment something nil)
2223                      (emit-byte segment
2224                                 (if (eq size :byte) #b11110110 #b11110111))
2225                      (emit-ea segment something #b000)
2226                      (emit-sized-immediate segment size immed))))
2227             (test-reg-and-something (reg something)
2228               (maybe-emit-rex-for-ea segment something reg)
2229               (emit-byte segment (if (eq size :byte) #b10000100 #b10000101))
2230               (emit-ea segment something (reg-tn-encoding reg))))
2231        (cond ((integerp that)
2232               (test-immed-and-something that this))
2233              ((integerp this)
2234               (test-immed-and-something this that))
2235              ((register-p this)
2236               (test-reg-and-something this that))
2237              ((register-p that)
2238               (test-reg-and-something that this))
2239              (t
2240               (error "bogus operands for TEST: ~S and ~S" this that)))))))
2241
2242 (define-instruction or (segment dst src)
2243   (:printer-list
2244    (arith-inst-printer-list #b001))
2245   (:emitter
2246    (emit-random-arith-inst "OR" segment dst src #b001)))
2247
2248 (define-instruction xor (segment dst src)
2249   (:printer-list
2250    (arith-inst-printer-list #b110))
2251   (:emitter
2252    (emit-random-arith-inst "XOR" segment dst src #b110)))
2253
2254 (define-instruction not (segment dst)
2255   (:printer reg/mem ((op '(#b1111011 #b010))))
2256   (:emitter
2257    (let ((size (operand-size dst)))
2258      (maybe-emit-operand-size-prefix segment size)
2259      (maybe-emit-rex-for-ea segment dst nil)
2260      (emit-byte segment (if (eq size :byte) #b11110110 #b11110111))
2261      (emit-ea segment dst #b010))))
2262 \f
2263 ;;;; string manipulation
2264
2265 (define-instruction cmps (segment size)
2266   (:printer string-op ((op #b1010011)))
2267   (:emitter
2268    (maybe-emit-operand-size-prefix segment size)
2269    (maybe-emit-rex-prefix segment size nil nil nil)
2270    (emit-byte segment (if (eq size :byte) #b10100110 #b10100111))))
2271
2272 (define-instruction ins (segment acc)
2273   (:printer string-op ((op #b0110110)))
2274   (:emitter
2275    (let ((size (operand-size acc)))
2276      (aver (accumulator-p acc))
2277      (maybe-emit-operand-size-prefix segment size)
2278      (maybe-emit-rex-prefix segment size nil nil nil)
2279      (emit-byte segment (if (eq size :byte) #b01101100 #b01101101)))))
2280
2281 (define-instruction lods (segment acc)
2282   (:printer string-op ((op #b1010110)))
2283   (:emitter
2284    (let ((size (operand-size acc)))
2285      (aver (accumulator-p acc))
2286      (maybe-emit-operand-size-prefix segment size)
2287      (maybe-emit-rex-prefix segment size nil nil nil)
2288      (emit-byte segment (if (eq size :byte) #b10101100 #b10101101)))))
2289
2290 (define-instruction movs (segment size)
2291   (:printer string-op ((op #b1010010)))
2292   (:emitter
2293    (maybe-emit-operand-size-prefix segment size)
2294    (maybe-emit-rex-prefix segment size nil nil nil)
2295    (emit-byte segment (if (eq size :byte) #b10100100 #b10100101))))
2296
2297 (define-instruction outs (segment acc)
2298   (:printer string-op ((op #b0110111)))
2299   (:emitter
2300    (let ((size (operand-size acc)))
2301      (aver (accumulator-p acc))
2302      (maybe-emit-operand-size-prefix segment size)
2303      (maybe-emit-rex-prefix segment size nil nil nil)
2304      (emit-byte segment (if (eq size :byte) #b01101110 #b01101111)))))
2305
2306 (define-instruction scas (segment acc)
2307   (:printer string-op ((op #b1010111)))
2308   (:emitter
2309    (let ((size (operand-size acc)))
2310      (aver (accumulator-p acc))
2311      (maybe-emit-operand-size-prefix segment size)
2312      (maybe-emit-rex-prefix segment size nil nil nil)
2313      (emit-byte segment (if (eq size :byte) #b10101110 #b10101111)))))
2314
2315 (define-instruction stos (segment acc)
2316   (:printer string-op ((op #b1010101)))
2317   (:emitter
2318    (let ((size (operand-size acc)))
2319      (aver (accumulator-p acc))
2320      (maybe-emit-operand-size-prefix segment size)
2321      (maybe-emit-rex-prefix segment size nil nil nil)
2322      (emit-byte segment (if (eq size :byte) #b10101010 #b10101011)))))
2323
2324 (define-instruction xlat (segment)
2325   (:printer byte ((op #b11010111)))
2326   (:emitter
2327    (emit-byte segment #b11010111)))
2328
2329 \f
2330 ;;;; bit manipulation
2331
2332 (define-instruction bsf (segment dst src)
2333   (:printer ext-reg-reg/mem-no-width ((op #b10111100)))
2334   (:emitter
2335    (let ((size (matching-operand-size dst src)))
2336      (when (eq size :byte)
2337        (error "can't scan bytes: ~S" src))
2338      (maybe-emit-operand-size-prefix segment size)
2339      (maybe-emit-rex-for-ea segment src dst)
2340      (emit-byte segment #b00001111)
2341      (emit-byte segment #b10111100)
2342      (emit-ea segment src (reg-tn-encoding dst)))))
2343
2344 (define-instruction bsr (segment dst src)
2345   (:printer ext-reg-reg/mem-no-width ((op #b10111101)))
2346   (:emitter
2347    (let ((size (matching-operand-size dst src)))
2348      (when (eq size :byte)
2349        (error "can't scan bytes: ~S" src))
2350      (maybe-emit-operand-size-prefix segment size)
2351      (maybe-emit-rex-for-ea segment src dst)
2352      (emit-byte segment #b00001111)
2353      (emit-byte segment #b10111101)
2354      (emit-ea segment src (reg-tn-encoding dst)))))
2355
2356 (defun emit-bit-test-and-mumble (segment src index opcode)
2357   (let ((size (operand-size src)))
2358     (when (eq size :byte)
2359       (error "can't scan bytes: ~S" src))
2360     (maybe-emit-operand-size-prefix segment size)
2361     (cond ((integerp index)
2362            (maybe-emit-rex-for-ea segment src nil)
2363            (emit-byte segment #b00001111)
2364            (emit-byte segment #b10111010)
2365            (emit-ea segment src opcode)
2366            (emit-byte segment index))
2367           (t
2368            (maybe-emit-rex-for-ea segment src index)
2369            (emit-byte segment #b00001111)
2370            (emit-byte segment (dpb opcode (byte 3 3) #b10000011))
2371            (emit-ea segment src (reg-tn-encoding index))))))
2372
2373 (eval-when (:compile-toplevel :execute)
2374   (defun bit-test-inst-printer-list (subop)
2375     `((ext-reg/mem-imm ((op (#b1011101 ,subop))
2376                         (reg/mem nil :type reg/mem)
2377                         (imm nil :type imm-byte)
2378                         (width 0)))
2379       (ext-reg-reg/mem ((op ,(dpb subop (byte 3 2) #b1000001))
2380                         (width 1))
2381                        (:name :tab reg/mem ", " reg)))))
2382
2383 (define-instruction bt (segment src index)
2384   (:printer-list (bit-test-inst-printer-list #b100))
2385   (:emitter
2386    (emit-bit-test-and-mumble segment src index #b100)))
2387
2388 (define-instruction btc (segment src index)
2389   (:printer-list (bit-test-inst-printer-list #b111))
2390   (:emitter
2391    (emit-bit-test-and-mumble segment src index #b111)))
2392
2393 (define-instruction btr (segment src index)
2394   (:printer-list (bit-test-inst-printer-list #b110))
2395   (:emitter
2396    (emit-bit-test-and-mumble segment src index #b110)))
2397
2398 (define-instruction bts (segment src index)
2399   (:printer-list (bit-test-inst-printer-list #b101))
2400   (:emitter
2401    (emit-bit-test-and-mumble segment src index #b101)))
2402
2403 \f
2404 ;;;; control transfer
2405
2406 (define-instruction call (segment where)
2407   (:printer near-jump ((op #b11101000)))
2408   (:printer reg/mem-default-qword ((op '(#b11111111 #b010))))
2409   (:emitter
2410    (typecase where
2411      (label
2412       (emit-byte segment #b11101000) ; 32 bit relative
2413       (emit-back-patch segment
2414                        4
2415                        (lambda (segment posn)
2416                          (emit-signed-dword segment
2417                                             (- (label-position where)
2418                                                (+ posn 4))))))
2419      (fixup
2420       ;; There is no CALL rel64...
2421       (error "Cannot CALL a fixup: ~S" where))
2422      (t
2423       (maybe-emit-rex-for-ea segment where nil :operand-size :do-not-set)
2424       (emit-byte segment #b11111111)
2425       (emit-ea segment where #b010)))))
2426
2427 (defun emit-byte-displacement-backpatch (segment target)
2428   (emit-back-patch segment
2429                    1
2430                    (lambda (segment posn)
2431                      (let ((disp (- (label-position target) (1+ posn))))
2432                        (aver (<= -128 disp 127))
2433                        (emit-byte segment disp)))))
2434
2435 (define-instruction jmp (segment cond &optional where)
2436   ;; conditional jumps
2437   (:printer short-cond-jump ((op #b0111)) '('j cc :tab label))
2438   (:printer near-cond-jump () '('j cc :tab label))
2439   ;; unconditional jumps
2440   (:printer short-jump ((op #b1011)))
2441   (:printer near-jump ((op #b11101001)))
2442   (:printer reg/mem-default-qword ((op '(#b11111111 #b100))))
2443   (:emitter
2444    (cond (where
2445           (emit-chooser
2446            segment 6 2
2447            (lambda (segment posn delta-if-after)
2448              (let ((disp (- (label-position where posn delta-if-after)
2449                             (+ posn 2))))
2450                (when (<= -128 disp 127)
2451                  (emit-byte segment
2452                             (dpb (conditional-opcode cond)
2453                                  (byte 4 0)
2454                                  #b01110000))
2455                  (emit-byte-displacement-backpatch segment where)
2456                  t)))
2457            (lambda (segment posn)
2458              (let ((disp (- (label-position where) (+ posn 6))))
2459                (emit-byte segment #b00001111)
2460                (emit-byte segment
2461                           (dpb (conditional-opcode cond)
2462                                (byte 4 0)
2463                                #b10000000))
2464                (emit-signed-dword segment disp)))))
2465          ((label-p (setq where cond))
2466           (emit-chooser
2467            segment 5 0
2468            (lambda (segment posn delta-if-after)
2469              (let ((disp (- (label-position where posn delta-if-after)
2470                             (+ posn 2))))
2471                (when (<= -128 disp 127)
2472                  (emit-byte segment #b11101011)
2473                  (emit-byte-displacement-backpatch segment where)
2474                  t)))
2475            (lambda (segment posn)
2476              (let ((disp (- (label-position where) (+ posn 5))))
2477                (emit-byte segment #b11101001)
2478                (emit-signed-dword segment disp)))))
2479          ((fixup-p where)
2480           (emit-byte segment #b11101001)
2481           (emit-relative-fixup segment where))
2482          (t
2483           (unless (or (ea-p where) (tn-p where))
2484             (error "don't know what to do with ~A" where))
2485           ;; near jump defaults to 64 bit
2486           ;; w-bit in rex prefix is unnecessary
2487           (maybe-emit-rex-for-ea segment where nil :operand-size :do-not-set)
2488           (emit-byte segment #b11111111)
2489           (emit-ea segment where #b100)))))
2490
2491 (define-instruction ret (segment &optional stack-delta)
2492   (:printer byte ((op #b11000011)))
2493   (:printer byte ((op #b11000010) (imm nil :type 'imm-word-16))
2494             '(:name :tab imm))
2495   (:emitter
2496    (cond ((and stack-delta (not (zerop stack-delta)))
2497           (emit-byte segment #b11000010)
2498           (emit-word segment stack-delta))
2499          (t
2500           (emit-byte segment #b11000011)))))
2501
2502 (define-instruction jrcxz (segment target)
2503   (:printer short-jump ((op #b0011)))
2504   (:emitter
2505    (emit-byte segment #b11100011)
2506    (emit-byte-displacement-backpatch segment target)))
2507
2508 (define-instruction loop (segment target)
2509   (:printer short-jump ((op #b0010)))
2510   (:emitter
2511    (emit-byte segment #b11100010)       ; pfw this was 11100011, or jecxz!!!!
2512    (emit-byte-displacement-backpatch segment target)))
2513
2514 (define-instruction loopz (segment target)
2515   (:printer short-jump ((op #b0001)))
2516   (:emitter
2517    (emit-byte segment #b11100001)
2518    (emit-byte-displacement-backpatch segment target)))
2519
2520 (define-instruction loopnz (segment target)
2521   (:printer short-jump ((op #b0000)))
2522   (:emitter
2523    (emit-byte segment #b11100000)
2524    (emit-byte-displacement-backpatch segment target)))
2525 \f
2526 ;;;; conditional move
2527 (define-instruction cmov (segment cond dst src)
2528   (:printer cond-move ())
2529   (:emitter
2530    (aver (register-p dst))
2531    (let ((size (matching-operand-size dst src)))
2532      (aver (or (eq size :word) (eq size :dword) (eq size :qword)))
2533      (maybe-emit-operand-size-prefix segment size))
2534    (maybe-emit-rex-for-ea segment src dst)
2535    (emit-byte segment #b00001111)
2536    (emit-byte segment (dpb (conditional-opcode cond) (byte 4 0) #b01000000))
2537    (emit-ea segment src (reg-tn-encoding dst))))
2538
2539 ;;;; conditional byte set
2540
2541 (define-instruction set (segment dst cond)
2542   (:printer cond-set ())
2543   (:emitter
2544    (maybe-emit-rex-for-ea segment dst nil)
2545    (emit-byte segment #b00001111)
2546    (emit-byte segment (dpb (conditional-opcode cond) (byte 4 0) #b10010000))
2547    (emit-ea segment dst #b000)))
2548 \f
2549 ;;;; enter/leave
2550
2551 (define-instruction enter (segment disp &optional (level 0))
2552   (:declare (type (unsigned-byte 16) disp)
2553             (type (unsigned-byte 8) level))
2554   (:printer enter-format ((op #b11001000)))
2555   (:emitter
2556    (emit-byte segment #b11001000)
2557    (emit-word segment disp)
2558    (emit-byte segment level)))
2559
2560 (define-instruction leave (segment)
2561   (:printer byte ((op #b11001001)))
2562   (:emitter
2563    (emit-byte segment #b11001001)))
2564 \f
2565 ;;;; interrupt instructions
2566
2567 (defun snarf-error-junk (sap offset &optional length-only)
2568   (let* ((length (sb!sys:sap-ref-8 sap offset))
2569          (vector (make-array length :element-type '(unsigned-byte 8))))
2570     (declare (type sb!sys:system-area-pointer sap)
2571              (type (unsigned-byte 8) length)
2572              (type (simple-array (unsigned-byte 8) (*)) vector))
2573     (cond (length-only
2574            (values 0 (1+ length) nil nil))
2575           (t
2576            (sb!kernel:copy-ub8-from-system-area sap (1+ offset)
2577                                                 vector 0 length)
2578            (collect ((sc-offsets)
2579                      (lengths))
2580              (lengths 1)                ; the length byte
2581              (let* ((index 0)
2582                     (error-number (sb!c:read-var-integer vector index)))
2583                (lengths index)
2584                (loop
2585                  (when (>= index length)
2586                    (return))
2587                  (let ((old-index index))
2588                    (sc-offsets (sb!c:read-var-integer vector index))
2589                    (lengths (- index old-index))))
2590                (values error-number
2591                        (1+ length)
2592                        (sc-offsets)
2593                        (lengths))))))))
2594
2595 #|
2596 (defmacro break-cases (breaknum &body cases)
2597   (let ((bn-temp (gensym)))
2598     (collect ((clauses))
2599       (dolist (case cases)
2600         (clauses `((= ,bn-temp ,(car case)) ,@(cdr case))))
2601       `(let ((,bn-temp ,breaknum))
2602          (cond ,@(clauses))))))
2603 |#
2604
2605 (defun break-control (chunk inst stream dstate)
2606   (declare (ignore inst))
2607   (flet ((nt (x) (if stream (sb!disassem:note x dstate))))
2608     ;; XXX: {BYTE,WORD}-IMM-CODE below is a macro defined by the
2609     ;; DEFINE-INSTRUCTION-FORMAT for {BYTE,WORD}-IMM above.  Due to
2610     ;; the spectacular design for DEFINE-INSTRUCTION-FORMAT (involving
2611     ;; a call to EVAL in order to define the macros at compile-time
2612     ;; only) they do not even show up as symbols in the target core.
2613     (case #!-ud2-breakpoints (byte-imm-code chunk dstate)
2614           #!+ud2-breakpoints (word-imm-code chunk dstate)
2615       (#.error-trap
2616        (nt "error trap")
2617        (sb!disassem:handle-break-args #'snarf-error-junk stream dstate))
2618       (#.cerror-trap
2619        (nt "cerror trap")
2620        (sb!disassem:handle-break-args #'snarf-error-junk stream dstate))
2621       (#.breakpoint-trap
2622        (nt "breakpoint trap"))
2623       (#.pending-interrupt-trap
2624        (nt "pending interrupt trap"))
2625       (#.halt-trap
2626        (nt "halt trap"))
2627       (#.fun-end-breakpoint-trap
2628        (nt "function end breakpoint trap"))
2629       (#.single-step-around-trap
2630        (nt "single-step trap (around)"))
2631       (#.single-step-before-trap
2632        (nt "single-step trap (before)")))))
2633
2634 (define-instruction break (segment code)
2635   (:declare (type (unsigned-byte 8) code))
2636   #!-ud2-breakpoints (:printer byte-imm ((op #b11001100)) '(:name :tab code)
2637                                :control #'break-control)
2638   #!+ud2-breakpoints (:printer word-imm ((op #b0000101100001111)) '(:name :tab code)
2639                                :control #'break-control)
2640   (:emitter
2641    #!-ud2-breakpoints (emit-byte segment #b11001100)
2642    ;; On darwin, trap handling via SIGTRAP is unreliable, therefore we
2643    ;; throw a sigill with 0x0b0f instead and check for this in the
2644    ;; SIGILL handler and pass it on to the sigtrap handler if
2645    ;; appropriate
2646    #!+ud2-breakpoints (emit-word segment #b0000101100001111)
2647    (emit-byte segment code)))
2648
2649 (define-instruction int (segment number)
2650   (:declare (type (unsigned-byte 8) number))
2651   (:printer byte-imm ((op #b11001101)))
2652   (:emitter
2653    (etypecase number
2654      ((member 3)
2655       (emit-byte segment #b11001100))
2656      ((unsigned-byte 8)
2657       (emit-byte segment #b11001101)
2658       (emit-byte segment number)))))
2659
2660 (define-instruction iret (segment)
2661   (:printer byte ((op #b11001111)))
2662   (:emitter
2663    (emit-byte segment #b11001111)))
2664 \f
2665 ;;;; processor control
2666
2667 (define-instruction hlt (segment)
2668   (:printer byte ((op #b11110100)))
2669   (:emitter
2670    (emit-byte segment #b11110100)))
2671
2672 (define-instruction nop (segment)
2673   (:printer byte ((op #b10010000)))
2674   (:emitter
2675    (emit-byte segment #b10010000)))
2676
2677 (define-instruction wait (segment)
2678   (:printer byte ((op #b10011011)))
2679   (:emitter
2680    (emit-byte segment #b10011011)))
2681
2682 \f
2683 ;;;; miscellaneous hackery
2684
2685 (define-instruction byte (segment byte)
2686   (:emitter
2687    (emit-byte segment byte)))
2688
2689 (define-instruction word (segment word)
2690   (:emitter
2691    (emit-word segment word)))
2692
2693 (define-instruction dword (segment dword)
2694   (:emitter
2695    (emit-dword segment dword)))
2696
2697 (defun emit-header-data (segment type)
2698   (emit-back-patch segment
2699                    n-word-bytes
2700                    (lambda (segment posn)
2701                      (emit-qword segment
2702                                  (logior type
2703                                          (ash (+ posn
2704                                                  (component-header-length))
2705                                               (- n-widetag-bits
2706                                                  word-shift)))))))
2707
2708 (define-instruction simple-fun-header-word (segment)
2709   (:emitter
2710    (emit-header-data segment simple-fun-header-widetag)))
2711
2712 (define-instruction lra-header-word (segment)
2713   (:emitter
2714    (emit-header-data segment return-pc-header-widetag)))
2715 \f
2716 ;;;; Instructions required to do floating point operations using SSE
2717
2718 ;; Return a one- or two-element list of printers for SSE instructions.
2719 ;; The one-element list is used in the cases where the REX prefix is
2720 ;; really a prefix and thus automatically supported, the two-element
2721 ;; list is used when the REX prefix is used in an infix position.
2722 (eval-when (:compile-toplevel :execute)
2723   (defun sse-inst-printer-list (inst-format-stem prefix opcode
2724                                 &key more-fields printer)
2725     (let ((fields `(,@(when prefix
2726                         `((prefix ,prefix)))
2727                     (op ,opcode)
2728                     ,@more-fields))
2729           (inst-formats (if prefix
2730                             (list (symbolicate "EXT-" inst-format-stem)
2731                                   (symbolicate "EXT-REX-" inst-format-stem))
2732                             (list inst-format-stem))))
2733       (mapcar (lambda (inst-format)
2734                 `(,inst-format ,fields ,@(when printer
2735                                            (list printer))))
2736               inst-formats))))
2737
2738 (defun emit-sse-inst (segment dst src prefix opcode
2739                       &key operand-size (remaining-bytes 0))
2740   (when prefix
2741     (emit-byte segment prefix))
2742   (if operand-size
2743       (maybe-emit-rex-for-ea segment src dst :operand-size operand-size)
2744       (maybe-emit-rex-for-ea segment src dst))
2745   (emit-byte segment #x0f)
2746   (emit-byte segment opcode)
2747   (emit-ea segment src (reg-tn-encoding dst) :remaining-bytes remaining-bytes))
2748
2749 ;; 0110 0110:0000 1111:0111 00gg: 11 010 xmmreg:imm8
2750
2751 (defun emit-sse-inst-with-imm (segment dst/src imm
2752                                prefix opcode /i
2753                                &key operand-size)
2754   (aver (<= 0 /i 7))
2755   (when prefix
2756     (emit-byte segment prefix))
2757   (maybe-emit-rex-prefix segment operand-size dst/src nil nil)
2758   (emit-byte segment #x0F)
2759   (emit-byte segment opcode)
2760   (emit-byte segment (logior (ash (logior #b11000 /i) 3)
2761                              (reg-tn-encoding dst/src)))
2762   (emit-byte segment imm))
2763
2764 (macrolet
2765     ((define-imm-sse-instruction (name opcode /i)
2766          `(define-instruction ,name (segment dst/src imm)
2767             (:printer-list
2768              ',(sse-inst-printer-list 'xmm-imm #x66 opcode
2769                                       :more-fields `((/i ,/i))))
2770             (:emitter
2771              (emit-sse-inst-with-imm segment dst/src imm
2772                                      #x66 ,opcode ,/i
2773                                      :operand-size :do-not-set)))))
2774   (define-imm-sse-instruction pslldq #x73 7)
2775   (define-imm-sse-instruction psllw-imm #x71 6)
2776   (define-imm-sse-instruction pslld-imm #x72 6)
2777   (define-imm-sse-instruction psllq-imm #x73 6)
2778
2779   (define-imm-sse-instruction psraw-imm #x71 4)
2780   (define-imm-sse-instruction psrad-imm #x72 4)
2781
2782   (define-imm-sse-instruction psrldq #x73 3)
2783   (define-imm-sse-instruction psrlw-imm #x71 2)
2784   (define-imm-sse-instruction psrld-imm #x72 2)
2785   (define-imm-sse-instruction psrlq-imm #x73 2))
2786
2787 ;;; Emit an SSE instruction that has an XMM register as the destination
2788 ;;; operand and for which the size of the operands is implicitly given
2789 ;;; by the instruction.
2790 (defun emit-regular-sse-inst (segment dst src prefix opcode
2791                               &key (remaining-bytes 0))
2792   (aver (xmm-register-p dst))
2793   (emit-sse-inst segment dst src prefix opcode
2794                  :operand-size :do-not-set
2795                  :remaining-bytes remaining-bytes))
2796
2797 ;;; Instructions having an XMM register as the destination operand
2798 ;;; and an XMM register or a memory location as the source operand.
2799 ;;; The operand size is implicitly given by the instruction.
2800
2801 (macrolet ((define-regular-sse-inst (name prefix opcode)
2802              `(define-instruction ,name (segment dst src)
2803                 (:printer-list
2804                  ',(sse-inst-printer-list 'xmm-xmm/mem prefix opcode))
2805                 (:emitter
2806                  (emit-regular-sse-inst segment dst src ,prefix ,opcode)))))
2807   ;; logical
2808   (define-regular-sse-inst andpd    #x66 #x54)
2809   (define-regular-sse-inst andps    nil  #x54)
2810   (define-regular-sse-inst andnpd   #x66 #x55)
2811   (define-regular-sse-inst andnps   nil  #x55)
2812   (define-regular-sse-inst orpd     #x66 #x56)
2813   (define-regular-sse-inst orps     nil  #x56)
2814   (define-regular-sse-inst pand     #x66 #xdb)
2815   (define-regular-sse-inst pandn    #x66 #xdf)
2816   (define-regular-sse-inst por      #x66 #xeb)
2817   (define-regular-sse-inst pxor     #x66 #xef)
2818   (define-regular-sse-inst xorpd    #x66 #x57)
2819   (define-regular-sse-inst xorps    nil  #x57)
2820   ;; comparison
2821   (define-regular-sse-inst comisd   #x66 #x2f)
2822   (define-regular-sse-inst comiss   nil  #x2f)
2823   (define-regular-sse-inst ucomisd  #x66 #x2e)
2824   (define-regular-sse-inst ucomiss  nil  #x2e)
2825   ;; integer comparison
2826   (define-regular-sse-inst pcmpeqb  #x66 #x74)
2827   (define-regular-sse-inst pcmpeqw  #x66 #x75)
2828   (define-regular-sse-inst pcmpeqd  #x66 #x76)
2829   (define-regular-sse-inst pcmpgtb  #x66 #x64)
2830   (define-regular-sse-inst pcmpgtw  #x66 #x65)
2831   (define-regular-sse-inst pcmpgtd  #x66 #x66)
2832   ;; max/min
2833   (define-regular-sse-inst maxpd    #x66 #x5f)
2834   (define-regular-sse-inst maxps    nil  #x5f)
2835   (define-regular-sse-inst maxsd    #xf2 #x5f)
2836   (define-regular-sse-inst maxss    #xf3 #x5f)
2837   (define-regular-sse-inst minpd    #x66 #x5d)
2838   (define-regular-sse-inst minps    nil  #x5d)
2839   (define-regular-sse-inst minsd    #xf2 #x5d)
2840   (define-regular-sse-inst minss    #xf3 #x5d)
2841   ;; integer max/min
2842   (define-regular-sse-inst pmaxsw   #x66 #xee)
2843   (define-regular-sse-inst pmaxub   #x66 #xde)
2844   (define-regular-sse-inst pminsw   #x66 #xea)
2845   (define-regular-sse-inst pminub   #x66 #xda)
2846   ;; arithmetic
2847   (define-regular-sse-inst addpd    #x66 #x58)
2848   (define-regular-sse-inst addps    nil  #x58)
2849   (define-regular-sse-inst addsd    #xf2 #x58)
2850   (define-regular-sse-inst addss    #xf3 #x58)
2851   (define-regular-sse-inst divpd    #x66 #x5e)
2852   (define-regular-sse-inst divps    nil  #x5e)
2853   (define-regular-sse-inst divsd    #xf2 #x5e)
2854   (define-regular-sse-inst divss    #xf3 #x5e)
2855   (define-regular-sse-inst mulpd    #x66 #x59)
2856   (define-regular-sse-inst mulps    nil  #x59)
2857   (define-regular-sse-inst mulsd    #xf2 #x59)
2858   (define-regular-sse-inst mulss    #xf3 #x59)
2859   (define-regular-sse-inst rcpps    nil  #x53)
2860   (define-regular-sse-inst rcpss    #xf3 #x53)
2861   (define-regular-sse-inst rsqrtps  nil  #x52)
2862   (define-regular-sse-inst rsqrtss  #xf3 #x52)
2863   (define-regular-sse-inst sqrtpd   #x66 #x51)
2864   (define-regular-sse-inst sqrtps   nil  #x51)
2865   (define-regular-sse-inst sqrtsd   #xf2 #x51)
2866   (define-regular-sse-inst sqrtss   #xf3 #x51)
2867   (define-regular-sse-inst subpd    #x66 #x5c)
2868   (define-regular-sse-inst subps    nil  #x5c)
2869   (define-regular-sse-inst subsd    #xf2 #x5c)
2870   (define-regular-sse-inst subss    #xf3 #x5c)
2871   (define-regular-sse-inst unpckhpd #x66 #x15)
2872   (define-regular-sse-inst unpckhps nil  #x15)
2873   (define-regular-sse-inst unpcklpd #x66 #x14)
2874   (define-regular-sse-inst unpcklps nil  #x14)
2875   ;; integer arithmetic
2876   (define-regular-sse-inst paddb    #x66 #xfc)
2877   (define-regular-sse-inst paddw    #x66 #xfd)
2878   (define-regular-sse-inst paddd    #x66 #xfe)
2879   (define-regular-sse-inst paddq    #x66 #xd4)
2880   (define-regular-sse-inst paddsb   #x66 #xec)
2881   (define-regular-sse-inst paddsw   #x66 #xed)
2882   (define-regular-sse-inst paddusb  #x66 #xdc)
2883   (define-regular-sse-inst paddusw  #x66 #xdd)
2884   (define-regular-sse-inst pavgb    #x66 #xe0)
2885   (define-regular-sse-inst pavgw    #x66 #xe3)
2886   (define-regular-sse-inst pmaddwd  #x66 #xf5)
2887   (define-regular-sse-inst pmulhuw  #x66 #xe4)
2888   (define-regular-sse-inst pmulhw   #x66 #xe5)
2889   (define-regular-sse-inst pmullw   #x66 #xd5)
2890   (define-regular-sse-inst pmuludq  #x66 #xf4)
2891   (define-regular-sse-inst psadbw   #x66 #xf6)
2892   (define-regular-sse-inst psllw    #x66 #xf1)
2893   (define-regular-sse-inst pslld    #x66 #xf2)
2894   (define-regular-sse-inst psllq    #x66 #xf3)
2895   (define-regular-sse-inst psraw    #x66 #xe1)
2896   (define-regular-sse-inst psrad    #x66 #xe2)
2897   (define-regular-sse-inst psrlw    #x66 #xd1)
2898   (define-regular-sse-inst psrld    #x66 #xd2)
2899   (define-regular-sse-inst psrlq    #x66 #xd3)
2900   (define-regular-sse-inst psubb    #x66 #xf8)
2901   (define-regular-sse-inst psubw    #x66 #xf9)
2902   (define-regular-sse-inst psubd    #x66 #xfa)
2903   (define-regular-sse-inst psubq    #x66 #xfb)
2904   (define-regular-sse-inst psubsb   #x66 #xe8)
2905   (define-regular-sse-inst psubsw   #x66 #xe9)
2906   (define-regular-sse-inst psubusb  #x66 #xd8)
2907   (define-regular-sse-inst psubusw  #x66 #xd9)
2908   ;; conversion
2909   (define-regular-sse-inst cvtdq2pd #xf3 #xe6)
2910   (define-regular-sse-inst cvtdq2ps nil  #x5b)
2911   (define-regular-sse-inst cvtpd2dq #xf2 #xe6)
2912   (define-regular-sse-inst cvtpd2ps #x66 #x5a)
2913   (define-regular-sse-inst cvtps2dq #x66 #x5b)
2914   (define-regular-sse-inst cvtps2pd nil  #x5a)
2915   (define-regular-sse-inst cvtsd2ss #xf2 #x5a)
2916   (define-regular-sse-inst cvtss2sd #xf3 #x5a)
2917   (define-regular-sse-inst cvttpd2dq #x66 #xe6)
2918   (define-regular-sse-inst cvttps2dq #xf3 #x5b)
2919   ;; integer
2920   (define-regular-sse-inst packsswb  #x66 #x63)
2921   (define-regular-sse-inst packssdw  #x66 #x6b)
2922   (define-regular-sse-inst packuswb  #x66 #x67)
2923   (define-regular-sse-inst punpckhbw #x66 #x68)
2924   (define-regular-sse-inst punpckhwd #x66 #x69)
2925   (define-regular-sse-inst punpckhdq #x66 #x6a)
2926   (define-regular-sse-inst punpckhqdq #x66 #x6d)
2927   (define-regular-sse-inst punpcklbw #x66 #x60)
2928   (define-regular-sse-inst punpcklwd #x66 #x61)
2929   (define-regular-sse-inst punpckldq #x66 #x62)
2930   (define-regular-sse-inst punpcklqdq #x66 #x6c))
2931
2932 (macrolet ((define-xmm-shuffle-sse-inst (name prefix opcode n-bits radix)
2933                (let ((shuffle-pattern
2934                       (intern (format nil "SSE-SHUFFLE-PATTERN-~D-~D"
2935                                       n-bits radix))))
2936                  `(define-instruction ,name (segment dst src pattern)
2937                     (:printer-list
2938                      ',(sse-inst-printer-list
2939                         'xmm-xmm/mem prefix opcode
2940                         :more-fields `((imm nil :type ,shuffle-pattern))
2941                         :printer '(:name :tab reg ", " reg/mem ", " imm)))
2942
2943                     (:emitter
2944                      (aver (typep pattern '(unsigned-byte ,n-bits)))
2945                      (emit-regular-sse-inst segment dst src ,prefix ,opcode
2946                                             :remaining-bytes 1)
2947                      (emit-byte segment pattern))))))
2948   (define-xmm-shuffle-sse-inst pshufd  #x66 #x70 8 4)
2949   (define-xmm-shuffle-sse-inst pshufhw #xf3 #x70 8 4)
2950   (define-xmm-shuffle-sse-inst pshuflw #xf2 #x70 8 4)
2951   (define-xmm-shuffle-sse-inst shufpd  #x66 #xc6 2 2)
2952   (define-xmm-shuffle-sse-inst shufps  nil  #xc6 8 4))
2953
2954 ;; MASKMOVDQU (dst is DS:RDI)
2955 (define-instruction maskmovdqu (segment src mask)
2956   (:printer-list
2957    (sse-inst-printer-list 'xmm-xmm/mem #x66 #xf7))
2958   (:emitter
2959    (aver (xmm-register-p src))
2960    (aver (xmm-register-p mask))
2961    (emit-regular-sse-inst segment src mask #x66 #xf7)))
2962
2963 (macrolet ((define-comparison-sse-inst (name prefix opcode
2964                                         name-prefix name-suffix)
2965                `(define-instruction ,name (segment op x y)
2966                   (:printer-list
2967                    ',(sse-inst-printer-list
2968                       'xmm-xmm/mem prefix opcode
2969                       :more-fields '((imm nil :type sse-condition-code))
2970                       :printer `(,name-prefix imm ,name-suffix
2971                                  :tab reg ", " reg/mem)))
2972                   (:emitter
2973                    (let ((code (position op *sse-conditions*)))
2974                      (aver code)
2975                      (emit-regular-sse-inst segment x y ,prefix ,opcode
2976                                             :remaining-bytes 1)
2977                      (emit-byte segment code))))))
2978   (define-comparison-sse-inst cmppd #x66 #xc2 "CMP" "PD")
2979   (define-comparison-sse-inst cmpps nil  #xc2 "CMP" "PS")
2980   (define-comparison-sse-inst cmpsd #xf2 #xc2 "CMP" "SD")
2981   (define-comparison-sse-inst cmpss #xf3 #xc2 "CMP" "SS"))
2982
2983 ;;; MOVSD, MOVSS
2984 (macrolet ((define-movsd/ss-sse-inst (name prefix)
2985              `(define-instruction ,name (segment dst src)
2986                 (:printer-list
2987                  ',(sse-inst-printer-list 'xmm-xmm/mem-dir
2988                                           prefix #b0001000))
2989                 (:emitter
2990                  (cond ((xmm-register-p dst)
2991                         (emit-sse-inst segment dst src ,prefix #x10
2992                                        :operand-size :do-not-set))
2993                        (t
2994                         (aver (xmm-register-p src))
2995                         (emit-sse-inst segment src dst ,prefix #x11
2996                                        :operand-size :do-not-set)))))))
2997   (define-movsd/ss-sse-inst movsd #xf2)
2998   (define-movsd/ss-sse-inst movss #xf3))
2999
3000 ;;; Packed MOVs
3001 (macrolet ((define-mov-sse-inst (name prefix opcode-from opcode-to
3002                                       &key force-to-mem reg-reg-name)
3003                `(progn
3004                   ,(when reg-reg-name
3005                      `(define-instruction ,reg-reg-name (segment dst src)
3006                         (:emitter
3007                          (aver (xmm-register-p dst))
3008                          (aver (xmm-register-p src))
3009                          (emit-regular-sse-inst segment dst src
3010                                                 ,prefix ,opcode-from))))
3011                   (define-instruction ,name (segment dst src)
3012                     (:printer-list
3013                      '(,@(when opcode-from
3014                            (sse-inst-printer-list
3015                             'xmm-xmm/mem prefix opcode-from))
3016                        ,@(sse-inst-printer-list
3017                           'xmm-xmm/mem prefix opcode-to
3018                           :printer '(:name :tab reg/mem ", " reg))))
3019                     (:emitter
3020                      (cond ,@(when opcode-from
3021                                `(((xmm-register-p dst)
3022                                   ,(when force-to-mem
3023                                      `(aver (not (or (register-p src)
3024                                                      (xmm-register-p src)))))
3025                                   (emit-regular-sse-inst
3026                                    segment dst src ,prefix ,opcode-from))))
3027                            (t
3028                             (aver (xmm-register-p src))
3029                             ,(when force-to-mem
3030                                `(aver (not (or (register-p dst)
3031                                                (xmm-register-p dst)))))
3032                             (emit-regular-sse-inst segment src dst
3033                                                    ,prefix ,opcode-to))))))))
3034   ;; direction bit?
3035   (define-mov-sse-inst movapd #x66 #x28 #x29)
3036   (define-mov-sse-inst movaps nil  #x28 #x29)
3037   (define-mov-sse-inst movdqa #x66 #x6f #x7f)
3038   (define-mov-sse-inst movdqu #xf3 #x6f #x7f)
3039
3040   ;; streaming
3041   (define-mov-sse-inst movntdq #x66 nil #xe7 :force-to-mem t)
3042   (define-mov-sse-inst movntpd #x66 nil #x2b :force-to-mem t)
3043   (define-mov-sse-inst movntps nil  nil #x2b :force-to-mem t)
3044
3045   ;; use movhps for movlhps and movlps for movhlps
3046   (define-mov-sse-inst movhpd #x66 #x16 #x17 :force-to-mem t)
3047   (define-mov-sse-inst movhps nil  #x16 #x17 :reg-reg-name movlhps)
3048   (define-mov-sse-inst movlpd #x66 #x12 #x13 :force-to-mem t)
3049   (define-mov-sse-inst movlps nil  #x12 #x13 :reg-reg-name movhlps)
3050   (define-mov-sse-inst movupd #x66 #x10 #x11)
3051   (define-mov-sse-inst movups nil  #x10 #x11))
3052
3053 ;;; MOVQ
3054 (define-instruction movq (segment dst src)
3055   (:printer-list
3056    (append
3057     (sse-inst-printer-list 'xmm-xmm/mem #xf3 #x7e)
3058     (sse-inst-printer-list 'xmm-xmm/mem #x66 #xd6
3059                            :printer '(:name :tab reg/mem ", " reg))))
3060   (:emitter
3061    (cond ((xmm-register-p dst)
3062           (emit-sse-inst segment dst src #xf3 #x7e
3063                          :operand-size :do-not-set))
3064          (t
3065           (aver (xmm-register-p src))
3066           (emit-sse-inst segment src dst #x66 #xd6
3067                          :operand-size :do-not-set)))))
3068
3069 ;;; Instructions having an XMM register as the destination operand
3070 ;;; and a general-purpose register or a memory location as the source
3071 ;;; operand. The operand size is calculated from the source operand.
3072
3073 ;;; MOVD - Move a 32- or 64-bit value from a general-purpose register or
3074 ;;; a memory location to the low order 32 or 64 bits of an XMM register
3075 ;;; with zero extension or vice versa.
3076 ;;; We do not support the MMX version of this instruction.
3077 (define-instruction movd (segment dst src)
3078   (:printer-list
3079    (append
3080     (sse-inst-printer-list 'xmm-reg/mem #x66 #x6e)
3081     (sse-inst-printer-list 'xmm-reg/mem #x66 #x7e
3082                            :printer '(:name :tab reg/mem ", " reg))))
3083   (:emitter
3084    (cond ((xmm-register-p dst)
3085           (emit-sse-inst segment dst src #x66 #x6e))
3086          (t
3087           (aver (xmm-register-p src))
3088           (emit-sse-inst segment src dst #x66 #x7e)))))
3089
3090 (define-instruction pinsrw (segment dst src imm)
3091   (:printer-list
3092    (sse-inst-printer-list
3093     'xmm-reg/mem #x66 #xc4
3094     :more-fields '((imm nil :type imm-byte))
3095     :printer '(:name :tab reg ", " reg/mem ", " imm)))
3096   (:emitter
3097    (aver (xmm-register-p dst))
3098    (let ((src-size (operand-size src)))
3099      (aver (or (not (register-p src))
3100                (eq src-size :qword) (eq src-size :dword)))
3101      (emit-sse-inst segment dst src #x66 #xc4
3102                     :operand-size (if (register-p src) src-size :do-not-set)
3103                     :remaining-bytes 1))
3104    (emit-byte segment imm)))
3105
3106 (define-instruction pextrw (segment dst src imm)
3107   (:printer-list
3108    (sse-inst-printer-list
3109     'reg-xmm/mem #x66 #xc5
3110     :more-fields '((imm nil :type imm-byte))
3111     :printer '(:name :tab reg ", " reg/mem ", " imm)))
3112   (:emitter
3113    (aver (xmm-register-p src))
3114    (aver (register-p dst))
3115    (let ((dst-size (operand-size dst)))
3116      (aver (or (eq dst-size :qword) (eq dst-size :dword)))
3117      (emit-sse-inst segment dst src #x66 #xc5
3118                     :operand-size dst-size
3119                     :remaining-bytes 1))
3120    (emit-byte segment imm)))
3121
3122 (macrolet ((define-integer-source-sse-inst (name prefix opcode &key mem-only)
3123              `(define-instruction ,name (segment dst src)
3124                 (:printer-list
3125                  ',(sse-inst-printer-list 'xmm-reg/mem prefix opcode))
3126                 (:emitter
3127                  (aver (xmm-register-p dst))
3128                  ,(when mem-only
3129                     `(aver (not (or (register-p src)
3130                                     (xmm-register-p src)))))
3131                  (let ((src-size (operand-size src)))
3132                    (aver (or (eq src-size :qword) (eq src-size :dword))))
3133                  (emit-sse-inst segment dst src ,prefix ,opcode)))))
3134   (define-integer-source-sse-inst cvtsi2sd #xf2 #x2a)
3135   (define-integer-source-sse-inst cvtsi2ss #xf3 #x2a)
3136   ;; FIXME: memory operand is always a QWORD
3137   (define-integer-source-sse-inst cvtpi2pd #x66 #x2a :mem-only t)
3138   (define-integer-source-sse-inst cvtpi2ps nil  #x2a :mem-only t))
3139
3140 ;;; Instructions having a general-purpose register as the destination
3141 ;;; operand and an XMM register or a memory location as the source
3142 ;;; operand. The operand size is calculated from the destination
3143 ;;; operand.
3144
3145 (macrolet ((define-gpr-destination-sse-inst (name prefix opcode &key reg-only)
3146              `(define-instruction ,name (segment dst src)
3147                 (:printer-list
3148                  ',(sse-inst-printer-list 'reg-xmm/mem prefix opcode))
3149                 (:emitter
3150                  (aver (register-p dst))
3151                  ,(when reg-only
3152                     `(aver (xmm-register-p src)))
3153                  (let ((dst-size (operand-size dst)))
3154                    (aver (or (eq dst-size :qword) (eq dst-size :dword)))
3155                    (emit-sse-inst segment dst src ,prefix ,opcode
3156                                   :operand-size dst-size))))))
3157   (define-gpr-destination-sse-inst cvtsd2si  #xf2 #x2d)
3158   (define-gpr-destination-sse-inst cvtss2si  #xf3 #x2d)
3159   (define-gpr-destination-sse-inst cvttsd2si #xf2 #x2c)
3160   (define-gpr-destination-sse-inst cvttss2si #xf3 #x2c)
3161   (define-gpr-destination-sse-inst movmskpd  #x66 #x50 :reg-only t)
3162   (define-gpr-destination-sse-inst movmskps  nil  #x50 :reg-only t)
3163   (define-gpr-destination-sse-inst pmovmskb  #x66 #xd7 :reg-only t))
3164
3165 ;;; Other SSE instructions
3166
3167 ;; FIXME: is that right!?
3168 (define-instruction movnti (segment dst src)
3169   (:printer ext-reg-reg/mem-no-width ((op #xc3)))
3170   (:emitter
3171    (aver (not (or (register-p dst)
3172                   (xmm-register-p dst))))
3173    (aver (register-p src))
3174    (maybe-emit-rex-for-ea segment src dst)
3175    (emit-byte segment #x0f)
3176    (emit-byte segment #xc3)
3177    (emit-ea segment dst (reg-tn-encoding src))))
3178
3179 (define-instruction prefetch (segment type src)
3180   (:printer ext-reg/mem-no-width ((op '(#x18 0)))
3181             '("PREFETCHNTA" :tab reg/mem))
3182   (:printer ext-reg/mem-no-width ((op '(#x18 1)))
3183             '("PREFETCHT0" :tab reg/mem))
3184   (:printer ext-reg/mem-no-width ((op '(#x18 2)))
3185             '("PREFETCHT1" :tab reg/mem))
3186   (:printer ext-reg/mem-no-width ((op '(#x18 3)))
3187             '("PREFETCHT2" :tab reg/mem))
3188   (:emitter
3189    (aver (not (or (register-p src)
3190                   (xmm-register-p src))))
3191    (aver (eq (operand-size src) :byte))
3192    (let ((type (position type #(:nta :t0 :t1 :t2))))
3193      (aver type)
3194      (maybe-emit-rex-for-ea segment src nil)
3195      (emit-byte segment #x0f)
3196      (emit-byte segment #x18)
3197      (emit-ea segment src type))))
3198
3199 (define-instruction clflush (segment src)
3200   (:printer ext-reg/mem-no-width ((op '(#xae 7))))
3201   (:emitter
3202    (aver (not (or (register-p src)
3203                   (xmm-register-p src))))
3204    (aver (eq (operand-size src) :byte))
3205    (maybe-emit-rex-for-ea segment src nil)
3206    (emit-byte segment #x0f)
3207    (emit-byte segment #xae)
3208    (emit-ea segment src 7)))
3209
3210 (macrolet ((define-fence-instruction (name last-byte)
3211                `(define-instruction ,name (segment)
3212                   (:printer three-bytes ((op '(#x0f #xae ,last-byte))))
3213                   (:emitter
3214                    (emit-byte segment #x0f)
3215                    (emit-byte segment #xae)
3216                    (emit-byte segment ,last-byte)))))
3217   (define-fence-instruction lfence #b11101000)
3218   (define-fence-instruction mfence #b11110000)
3219   (define-fence-instruction sfence #b11111000))
3220
3221 (define-instruction pause (segment)
3222   (:printer two-bytes ((op '(#xf3 #x90))))
3223   (:emitter
3224    (emit-byte segment #xf3)
3225    (emit-byte segment #x90)))
3226
3227 (define-instruction ldmxcsr (segment src)
3228   (:printer ext-reg/mem-no-width ((op '(#xae 2))))
3229   (:emitter
3230    (aver (not (or (register-p src)
3231                   (xmm-register-p src))))
3232    (aver (eq (operand-size src) :dword))
3233    (maybe-emit-rex-for-ea segment src nil)
3234    (emit-byte segment #x0f)
3235    (emit-byte segment #xae)
3236    (emit-ea segment src 2)))
3237
3238 (define-instruction stmxcsr (segment dst)
3239   (:printer ext-reg/mem-no-width ((op '(#xae 3))))
3240   (:emitter
3241    (aver (not (or (register-p dst)
3242                   (xmm-register-p dst))))
3243    (aver (eq (operand-size dst) :dword))
3244    (maybe-emit-rex-for-ea segment dst nil)
3245    (emit-byte segment #x0f)
3246    (emit-byte segment #xae)
3247    (emit-ea segment dst 3)))
3248
3249 ;;;; Miscellany
3250
3251 (define-instruction cpuid (segment)
3252   (:printer two-bytes ((op '(#b00001111 #b10100010))))
3253   (:emitter
3254    (emit-byte segment #b00001111)
3255    (emit-byte segment #b10100010)))
3256
3257 (define-instruction rdtsc (segment)
3258   (:printer two-bytes ((op '(#b00001111 #b00110001))))
3259   (:emitter
3260    (emit-byte segment #b00001111)
3261    (emit-byte segment #b00110001)))
3262
3263 ;;;; Late VM definitions
3264
3265 (defun canonicalize-inline-constant (constant &aux (alignedp nil))
3266   (let ((first (car constant)))
3267     (when (eql first :aligned)
3268       (setf alignedp t)
3269       (pop constant)
3270       (setf first (car constant)))
3271     (typecase first
3272       (single-float (setf constant (list :single-float first)))
3273       (double-float (setf constant (list :double-float first)))
3274       ((complex single-float)
3275          (setf constant (list :complex-single-float first)))
3276       ((complex double-float)
3277          (setf constant (list :complex-double-float first)))))
3278   (destructuring-bind (type value) constant
3279     (ecase type
3280       ((:byte :word :dword :qword)
3281          (aver (integerp value))
3282          (cons type value))
3283       ((:base-char)
3284          (aver (base-char-p value))
3285          (cons :byte (char-code value)))
3286       ((:character)
3287          (aver (characterp value))
3288          (cons :dword (char-code value)))
3289       ((:single-float)
3290          (aver (typep value 'single-float))
3291          (cons (if alignedp :oword :dword)
3292                (ldb (byte 32 0) (single-float-bits value))))
3293       ((:double-float)
3294          (aver (typep value 'double-float))
3295          (cons (if alignedp :oword :qword)
3296                (ldb (byte 64 0) (logior (ash (double-float-high-bits value) 32)
3297                                         (double-float-low-bits value)))))
3298       ((:complex-single-float)
3299          (aver (typep value '(complex single-float)))
3300          (cons (if alignedp :oword :qword)
3301                (ldb (byte 64 0)
3302                     (logior (ash (single-float-bits (imagpart value)) 32)
3303                             (ldb (byte 32 0)
3304                                  (single-float-bits (realpart value)))))))
3305       ((:oword :sse)
3306          (aver (integerp value))
3307          (cons :oword value))
3308       ((:complex-double-float)
3309          (aver (typep value '(complex double-float)))
3310          (cons :oword
3311                (logior (ash (double-float-high-bits (imagpart value)) 96)
3312                        (ash (double-float-low-bits (imagpart value)) 64)
3313                        (ash (ldb (byte 32 0)
3314                                  (double-float-high-bits (realpart value)))
3315                             32)
3316                        (double-float-low-bits (realpart value))))))))
3317
3318 (defun inline-constant-value (constant)
3319   (let ((label (gen-label))
3320         (size  (ecase (car constant)
3321                  ((:byte :word :dword :qword) (car constant))
3322                  ((:oword) :qword))))
3323     (values label (make-ea size
3324                            :disp (make-fixup nil :code-object label)))))
3325
3326 (defun emit-constant-segment-header (constants optimize)
3327   (declare (ignore constants))
3328   (loop repeat (if optimize 64 16) do (inst byte #x90)))
3329
3330 (defun size-nbyte (size)
3331   (ecase size
3332     (:byte  1)
3333     (:word  2)
3334     (:dword 4)
3335     (:qword 8)
3336     (:oword 16)))
3337
3338 (defun sort-inline-constants (constants)
3339   (stable-sort constants #'> :key (lambda (constant)
3340                                     (size-nbyte (caar constant)))))
3341
3342 (defun emit-inline-constant (constant label)
3343   (let ((size (size-nbyte (car constant))))
3344     (emit-alignment (integer-length (1- size)))
3345     (emit-label label)
3346     (let ((val (cdr constant)))
3347       (loop repeat size
3348             do (inst byte (ldb (byte 8 0) val))
3349                (setf val (ash val -8))))))