Changeset 10198


Ignore:
Timestamp:
Jul 24, 2008, 11:55:06 PM (11 years ago)
Author:
rme
Message:

Remaining changes to this file from ia32 branch.

Remove a whole bunch of constants that defined cpu features and opcode
modifiers. These were derived from the GAS sources, but the way we
define opcodes doesn't use them.

Add a new pseudo operand called :self. It's used only in one case:
(movl ($ :self) (% reg)). The value of :self is the absolute address
of the entry point of the function being defined.

Remove the old opcode template list that was conditioned out.

Define register entries for x8632 and alter associated functions to
consult the appropriate entries based on target architecture.

Update match-template/match-template-types to exclude instructions not
applicable to the target architecture.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/X86/x86-asm.lisp

    r10188 r10198  
    105105(defmacro encode-opcode-flags (&rest flags)
    106106  (%encode-opcode-flags flags t))
    107 
    108 
    109 ;;; cpu feature flags
    110 (defconstant +Cpu086+ #x1)                ; Any old cpu will do  0 does the same
    111 (defconstant +Cpu186+ #x2)                ; i186 or better required
    112 (defconstant +Cpu286+ #x4)                ; i286 or better required
    113 (defconstant +Cpu386+ #x8)                ; i386 or better required
    114 (defconstant +Cpu486+ #x10)               ; i486 or better required
    115 (defconstant +Cpu586+ #x20)               ; i585 or better required
    116 (defconstant +Cpu686+ #x40)               ; i686 or better required
    117 (defconstant +CpuP4+ #x80)                ; Pentium4 or better required
    118 (defconstant +CpuK6+ #x100)               ; AMD K6 or better required
    119 (defconstant +CpuAthlon+ #x200)           ; AMD Athlon or better required
    120 (defconstant +CpuSledgehammer+ #x400)     ; Sledgehammer or better required
    121 (defconstant +CpuMMX+ #x800)              ; MMX support required
    122 (defconstant +CpuMMX2+ #x1000)            ; extended MMX support (with SSE or 3DNow!Ext) required
    123 (defconstant +CpuSSE+ #x2000)             ; Streaming SIMD extensions required
    124 (defconstant +CpuSSE2+ #x4000)            ; Streaming SIMD extensions 2 required
    125 (defconstant +Cpu3dnow+ #x8000)           ; 3dnow! support required
    126 (defconstant +Cpu3dnowA+ #x10000)         ; 3dnow!Extensions support required
    127 (defconstant +CpuPNI+ #x20000)            ; Prescott New Instructions required
    128 (defconstant +CpuPadLock+ #x40000)        ; VIA PadLock required
    129 ;;; These flags are set by gas depending on the flag-code.
    130 (defconstant +Cpu64+ #x4000000)           ; 64bit support required
    131 (defconstant +CpuNo64+ #x8000000)         ; Not supported in the 64bit mode
    132 ;;; The default value for unknown CPUs - enable all features to avoid problems.
    133 (defconstant +CpuUnknownFlags+ (logior +Cpu086+ +Cpu186+ +Cpu286+ +Cpu386+ +Cpu486+ +Cpu586+ +Cpu686+ +CpuP4+ +CpuSledgehammer+ +CpuMMX+ +CpuMMX2+ +CpuSSE+ +CpuSSE2+ +CpuPNI+ +Cpu3dnow+ +Cpu3dnowA+ +CpuK6+ +CpuAthlon+ +CpuPadLock+))
    134 
    135 (defparameter *cpu-feature-names*
    136   `((:Cpu086 . #x1) ; Any old cpu will do  0 does the same
    137     (:Cpu186 . #x2) ; i186 or better required
    138     (:Cpu286 . #x4) ; i286 or better required
    139     (:Cpu386 . #x8) ; i386 or better required
    140     (:Cpu486 . #x10) ; i486 or better required
    141     (:Cpu586 . #x20) ; i585 or better required
    142     (:Cpu686 . #x40) ; i686 or better required
    143     (:CpuP4 . #x80) ; Pentium4 or better required
    144     (:CpuK6 . #x100) ; AMD K6 or better required
    145     (:CpuAthlon . #x200) ; AMD Athlon or better required
    146     (:CpuSledgehammer . #x400) ; Sledgehammer or better required
    147     (:CpuMMX . #x800) ; MMX support required
    148     (:CpuMMX2 . #x1000) ; extended MMX support (with SSE or 3DNow!Ext) required
    149     (:CpuSSE . #x2000) ; Streaming SIMD extensions required
    150     (:CpuSSE2 . #x4000) ; Streaming SIMD extensions 2 required
    151     (:Cpu3dnow . #x8000) ; 3dnow! support required
    152     (:Cpu3dnowA . #x10000) ; 3dnow!Extensions support required
    153     (:CpuPNI . #x20000) ; Prescott New Instructions required
    154     (:CpuPadLock . #x40000) ; VIA PadLock required
    155     ;; These flags are set depending on the flag-code.
    156     (:Cpu64 . #x4000000) ; 64bit support required
    157     (:CpuNo64 . #x8000000))) ; Not supported in the 64bit mode
    158 
    159 (defun %encode-cpu-flags (flags)
    160   (flet ((encode-atomic-cpu-flag (f)
    161            (cdr (assoc f *cpu-feature-names* :test #'eq))))
    162     (if flags
    163       (if (atom flags)
    164         (encode-atomic-cpu-flag flags)
    165         (let* ((k 0))
    166           (dolist (flag flags k)
    167             (let* ((k0 (encode-atomic-cpu-flag flag)))
    168               (if k0
    169                 (setq k (logior k k0))
    170                 (return))))))
    171       1)))
    172          
    173 
    174 ;;; opcode-modifier bits:
    175 (defconstant +opcode-modifier-W+ #x1) ; set if operands can be words or dwords  encoded the canonical way
    176 (defconstant +opcode-modifier-D+ #x2) ; D = 0 if Reg --> Regmem  D = 1 if Regmem --> Reg:    MUST BE #x2
    177 (defconstant +opcode-modifier-Modrm+ #x4)
    178 (defconstant +opcode-modifier-FloatR+ #x8) ; src/dest swap for floats:   MUST BE #x8
    179 (defconstant +opcode-modifier-ShortForm+ #x10) ; register is in low 3 bits of opcode
    180 (defconstant +opcode-modifier-FloatMF+ #x20) ; FP insn memory format bit  sized by #x4
    181 (defconstant +opcode-modifier-Jump+ #x40) ; special case for jump insns.
    182 (defconstant +opcode-modifier-JumpDword+ #x80) ; call and jump
    183 (defconstant +opcode-modifier-JumpByte+ #x100) ; loop and jecxz
    184 (defconstant +opcode-modifier-JumpInterSegment+ #x200) ; special case for intersegment leaps/calls
    185 (defconstant +opcode-modifier-FloatD+ #x400) ; direction for float insns:  MUST BE #x400
    186 (defconstant +opcode-modifier-Seg2ShortForm+ #x800) ; encoding of load segment reg insns
    187 (defconstant +opcode-modifier-Seg3ShortForm+ #x1000) ; fs/gs segment register insns.
    188 (defconstant +opcode-modifier-Size16+ #x2000) ; needs size prefix if in 32-bit mode
    189 (defconstant +opcode-modifier-Size32+ #x4000) ; needs size prefix if in 16-bit mode
    190 (defconstant +opcode-modifier-Size64+ #x8000) ; needs size prefix if in 16-bit mode
    191 (defconstant +opcode-modifier-IgnoreSize+ #x10000) ; instruction ignores operand size prefix
    192 (defconstant +opcode-modifier-DefaultSize+ #x20000) ; default insn size depends on mode
    193 (defconstant +opcode-modifier-No-bSuf+ #x40000) ; b suffix on instruction illegal
    194 (defconstant +opcode-modifier-No-wSuf+ #x80000) ; w suffix on instruction illegal
    195 (defconstant +opcode-modifier-No-lSuf+ #x100000) ; l suffix on instruction illegal
    196 (defconstant +opcode-modifier-No-sSuf+ #x200000) ; s suffix on instruction illegal
    197 (defconstant +opcode-modifier-No-qSuf+ #x400000) ; q suffix on instruction illegal
    198 (defconstant +opcode-modifier-No-xSuf+ #x800000) ; x suffix on instruction illegal
    199 (defconstant +opcode-modifier-FWait+ #x1000000) ; instruction needs FWAIT
    200 (defconstant +opcode-modifier-IsString+ #x2000000) ; quick test for string instructions
    201 (defconstant +opcode-modifier-regKludge+ #x4000000) ; fake an extra reg operand for clr  imul
    202 (defconstant +opcode-modifier-IsPrefix+ #x8000000) ; opcode is a prefix
    203 (defconstant +opcode-modifier-ImmExt+ #x10000000) ; instruction has extension in 8 bit imm
    204 (defconstant +opcode-modifier-NoRex64+ #x20000000) ; instruction don't need Rex64 prefix.
    205 (defconstant +opcode-modifier-Rex64+ #x40000000) ; instruction require Rex64 prefix.
    206 (defconstant +opcode-modifier-Ugh+ #x80000000) ; deprecated fp insn  gets a warning
    207 
    208 
    209 (defconstant +opcode-modifier-NoSuf+ (logior +opcode-modifier-No-bSuf+
    210                                              +opcode-modifier-No-wSuf+
    211                                              +opcode-modifier-No-lSuf+
    212                                              +opcode-modifier-No-sSuf+
    213                                              +opcode-modifier-No-xSuf+
    214                                              +opcode-modifier-No-qSuf+))
    215 (defconstant +opcode-modifier-b-Suf+ (logior +opcode-modifier-No-wSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    216 (defconstant +opcode-modifier-w-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    217 (defconstant +opcode-modifier-l-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    218 (defconstant +opcode-modifier-q-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-xSuf+))
    219 (defconstant +opcode-modifier-x-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-qSuf+))
    220 (defconstant +opcode-modifier-bw-Suf+ (logior +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    221 (defconstant +opcode-modifier-bl-Suf+ (logior +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    222 (defconstant +opcode-modifier-wl-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    223 (defconstant +opcode-modifier-wlq-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
    224 (defconstant +opcode-modifier-lq-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
    225 (defconstant +opcode-modifier-wq-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
    226 (defconstant +opcode-modifier-sl-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    227 (defconstant +opcode-modifier-bwl-Suf+ (logior +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
    228 (defconstant +opcode-modifier-bwlq-Suf+ (logior +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
    229 (defconstant +opcode-modifier-FP+ +opcode-modifier-NoSuf+)
    230 (defconstant +opcode-modifier-l-FP+ +opcode-modifier-l-Suf+)
    231 (defconstant +opcode-modifier-q-FP+ (logior +opcode-modifier-q-Suf+ +opcode-modifier-NoRex64+))
    232 (defconstant +opcode-modifier-x-FP+ (logior +opcode-modifier-x-Suf+ +opcode-modifier-FloatMF+))
    233 (defconstant +opcode-modifier-sl-FP+ (logior +opcode-modifier-sl-Suf+ +opcode-modifier-FloatMF+))
    234 ;;; Someone forgot that the FloatR bit reverses the operation when not
    235 ;;; equal to the FloatD bit.  ie. Changing only FloatD results in the
    236 ;;; destination being swapped *and* the direction being reversed.
    237 (defconstant +opcode-modifier-FloatDR+ +opcode-modifier-FloatD+)
    238 
    239 (eval-when (:compile-toplevel :load-toplevel :execute)
    240 (defparameter *opcode-modifier-names*
    241   `((:w . ,+opcode-modifier-W+)
    242     (:d . ,+opcode-modifier-D+)
    243     (:modrm . ,+opcode-modifier-Modrm+)
    244     (:shortform . ,+opcode-modifier-ShortForm+)
    245     (:floatr . ,+opcode-modifier-FloatR+)
    246     (:floatmf . ,+opcode-modifier-FloatMF+)
    247     (:jump . ,+opcode-modifier-Jump+)
    248     (:jumpdword . ,+opcode-modifier-JumpDword+)
    249     (:jumpbyte . ,+opcode-modifier-JumpByte+)
    250     (:jumpintersegment . ,+opcode-modifier-JumpInterSegment+)
    251     (:floatd . ,+opcode-modifier-FloatD+)
    252     (:seg2shortform . ,+opcode-modifier-Seg2ShortForm+)
    253     (:seg3shortform . ,+opcode-modifier-Seg3ShortForm+)
    254     (:size16 . ,+opcode-modifier-Size16+)
    255     (:size32 . ,+opcode-modifier-Size32+)
    256     (:size64 . ,+opcode-modifier-Size64+)
    257     (:ignoresize . ,+opcode-modifier-IgnoreSize+)
    258     (:no-bsuf . ,+opcode-modifier-No-bsuf+)
    259     (:no-wsuf . ,+opcode-modifier-No-wsuf+)
    260     (:no-lsuf . ,+opcode-modifier-No-lsuf+)
    261     (:no-ssuf . ,+opcode-modifier-No-ssuf+)
    262     (:no-qsuf . ,+opcode-modifier-No-qsuf+)
    263     (:no-xsuf . ,+opcode-modifier-No-xsuf+)
    264     (:defaultsize . ,+opcode-modifier-DefaultSize+)
    265     (:fwait . ,+opcode-modifier-FWait+)
    266     (:isstring . ,+opcode-modifier-IsString+)
    267     (:regkludge . ,+opcode-modifier-regKludge+)
    268     (:isprefix . ,+opcode-modifier-IsPrefix+)
    269     (:immext . ,+opcode-modifier-ImmExt+)
    270     (:norex64 . ,+opcode-modifier-NoRex64+)
    271     (:rex64 . ,+opcode-modifier-Rex64+)
    272     (:ugh . ,+opcode-modifier-Ugh+)
    273     (:nosuf . ,+opcode-modifier-NoSuf+)
    274     (:b-suf . ,+opcode-modifier-b-Suf+)
    275     (:w-suf . ,+opcode-modifier-w-Suf+)
    276     (:l-suf . ,+opcode-modifier-l-Suf+)
    277     (:q-suf . ,+opcode-modifier-q-Suf+)
    278     (:x-suf . ,+opcode-modifier-x-suf+)
    279     (:wl-suf . ,+opcode-modifier-wl-Suf+)
    280     (:wlq-suf . ,+opcode-modifier-wlq-Suf+)
    281     (:lq-suf . ,+opcode-modifier-lq-Suf+)
    282     (:wq-suf . ,+opcode-modifier-wq-Suf+)
    283     (:sl-suf . ,+opcode-modifier-sl-Suf+)
    284     (:bwl-suf . ,+opcode-modifier-bwl-Suf+)
    285     (:bwlq-suf . ,+opcode-modifier-bwlq-Suf+)
    286     (:fp . ,+opcode-modifier-FP+)
    287     (:l-fp . ,+opcode-modifier-l-FP+)
    288     (:q-fp . ,+opcode-modifier-q-FP+)
    289     (:x-fp . ,+opcode-modifier-x-FP+)
    290     (:sl-fp . ,+opcode-modifier-sl-FP+)
    291     (:floatd . ,+opcode-modifier-FloatD+)
    292     (:floatdr . ,+opcode-modifier-FloatDR+)))
    293 
    294 
    295 ;;; By default, this returns NIL if the modifier can't be encoded.
    296 ;;; That's an error, but the caller can provide better error context.
    297 (defun %encode-opcode-modifier (mod &optional errorp)
    298   (flet ((encode-atomic-opcode-modifier (m)
    299            (if m
    300              (cdr (assoc m *opcode-modifier-names*))
    301              0)))
    302     (or
    303      (if (atom mod)
    304        (encode-atomic-opcode-modifier mod)
    305        (let* ((k 0))
    306          (dolist (m mod k)
    307            (let* ((k0 (encode-atomic-opcode-modifier m)))
    308              (if k0
    309                (setq k (logior k0 k))
    310                (return))))))
    311      (if errorp (error "Unknown x86 opcode modifier: ~s" mod)))))
    312 
    313 )
    314 (defmacro encode-opcode-modifier (&rest mod)
    315   (%encode-opcode-modifier mod t))
    316 
    317107
    318108;;; operand-types[i] bits
     
    366156(defconstant +operand-type-InvMem+ #x80000000)
    367157(defconstant +operand-type-Label+ #x100000000)
     158
     159;;; 4 bytes and a :reloc; otherwise just like a 32-bit immediate
     160(defconstant +operand-type-Self+ #x200000000)
    368161
    369162(defconstant +operand-type-Reg+ (logior +operand-type-Reg8+ +operand-type-Reg16+ +operand-type-Reg32+ +operand-type-Reg64+)) ; gen'l register
     
    434227    (:ByteMem . ,+operand-type-ByteMem+)
    435228    (:Label . ,+operand-type-Label+)
     229    (:Self . ,+operand-type-Self+)
    436230  ))
    437231
     
    557351(defstruct (x86-opcode-template (:constructor %make-x86-opcode-template))
    558352  mnemonic               ; fully qualified, includes suffix if applicable
    559   flags                  ; cpuflags
     353  flags                  ; opcode modifier and cpu type flags
    560354  ordinal                ; unique id
    561355  operand-types          ; as specific as possible
     
    575369        (declare (ignore class))
    576370        (types (%encode-operand-type type t))))))
    577 
    578 
    579371
    580372(defparameter *x86-operand-insert-function-keywords*
     
    601393    :insert-reg4-pseudo-rm-high
    602394    :insert-reg4-pseudo-rm-low
     395    :insert-self
    603396    ))
    604397
     
    609402        (declare (ignore type))
    610403        (classes (or (position class *x86-operand-insert-function-keywords*)
    611                      (error "Unknown operand class: ~s" class)))))))
     404                     (error "Unknown operand class: ~s" class)))))))
    612405
    613406(defun parse-x86-opcode-name (name&flags)
     
    743536                                (x86-memory-operand-type operand)))
    744537
    745 
    746 #+nil         
    747 (defmacro def-x8664-opcode (name&flags types-and-classes base-opcode
    748                                           modrm-byte
    749                                           rex-prefix
    750                                           &rest prefixes)
    751   `(%make-x86-opcode-template
    752     :mnemonic ,(parse-x86-opcode-name name&flags)
    753     :flags ,(parse-x86-opcode-flags name&flags)
    754     :operand-types ,(parse-x86-opcode-operand-types types-and-classes)
    755     :operand-classes ,(parse-x86-opcode-operand-classes types-and-classes)
    756     :base-opcode ,base-opcode
    757     :prefixes ',prefixes
    758     :rex-prefix ,rex-prefix
    759     :modrm-byte ,modrm-byte))
    760538
    761539(defmacro def-x86-opcode (name&flags types-and-classes base-opcode
     
    20121790   (def-x86-opcode movl ((:imm32s :insert-imm32s) (:reg32 :insert-opcode-reg))
    20131791     #xb8 nil #x00)
    2014    #+nil
    20151792   (def-x86-opcode movl ((:self :insert-self) (:reg32 :insert-opcode-reg))
    20161793     #xb8 nil #x00)
     
    36033380   ))
    36043381
    3605 #+nil
    3606 (defparameter *x86-opcode-templates*
    3607   (vector
    3608    ;; adc
    3609    (def-x8664-opcode adcq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    3610      #x11 #o300 #x48)
    3611    (def-x8664-opcode adcq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    3612      #x13 #o000 #x48)
    3613    (def-x8664-opcode adcq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    3614      #x11 #x00 #x48)
    3615    (def-x8664-opcode adcq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    3616      #x83 #o320 #x48)
    3617    (def-x8664-opcode adcq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    3618      #x15 nil #x48)
    3619    (def-x8664-opcode adcq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    3620      #x81 #o320 #x48)
    3621    (def-x8664-opcode adcq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3622      #x83 #o020 #x48)
    3623    (def-x8664-opcode adcq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    3624      #x81 #o020 #x48)
    3625 
    3626    (def-x8664-opcode adcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    3627      #x11 #o300 #x00)
    3628    (def-x8664-opcode adcl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    3629      #x13 #o000 #x00)
    3630    (def-x8664-opcode adcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    3631      #x11 #x00 #x00)
    3632    (def-x8664-opcode adcl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    3633      #x83 #o320 #x00)
    3634    (def-x8664-opcode adcl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    3635      #x15 nil nil)
    3636    (def-x8664-opcode adcl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    3637      #x81 #o320 #x00)
    3638    (def-x8664-opcode adcl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3639      #x83 #o020 #x00)
    3640    (def-x8664-opcode adcl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    3641      #x81 #o020 #x00)
    3642 
    3643    (def-x8664-opcode adcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    3644      #x11 #o300 #x00 #x66)
    3645    (def-x8664-opcode adcw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    3646      #x13 #o000 #x00 #x66)
    3647    (def-x8664-opcode adcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    3648      #x11 #x00 #x00 #x66)
    3649    (def-x8664-opcode adcw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    3650      #x83 #o320 #x00 #x66)
    3651    (def-x8664-opcode adcw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    3652      #x15 nil nil #x66)
    3653    (def-x8664-opcode adcw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    3654      #x81 #o320 #x00 #x66)
    3655    (def-x8664-opcode adcw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3656      #x83 #o020 #x00 #x66)
    3657    (def-x8664-opcode adcw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    3658      #x81 #o020 #x00 #x66)
    3659 
    3660    (def-x8664-opcode adcb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    3661      #x10 #o300 #x00)
    3662    (def-x8664-opcode adcb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    3663      #x12 #o000 #x00)
    3664    (def-x8664-opcode adcb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    3665      #x10 #x00 #x00)
    3666    (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:acc :insert-nothing))
    3667      #x14 nil nil)
    3668    (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    3669      #x80 #o320 #x00)
    3670    (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    3671      #x80 #o320 #x00)
    3672    (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3673      #x80 #o020 #x00)
    3674 
    3675    ;; add
    3676    (def-x8664-opcode addq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    3677      #x01 #o300 #x48)
    3678    (def-x8664-opcode addq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    3679      #x03 #o000 #x48)
    3680    (def-x8664-opcode addq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    3681      #x01 #x00 #x48)
    3682    (def-x8664-opcode addq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    3683      #x83 #o300 #x48)
    3684    (def-x8664-opcode addq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    3685      #x05 nil #x48)
    3686    (def-x8664-opcode addq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    3687      #x81 #o300 #x48)
    3688    (def-x8664-opcode addq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3689      #x83 #o000 #x48)
    3690    (def-x8664-opcode addq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    3691      #x81 #o000 #x48)
    3692 
    3693    (def-x8664-opcode addl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    3694      #x01 #o300 #x00)
    3695    (def-x8664-opcode addl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    3696      #x03 #o000 #x00)
    3697    (def-x8664-opcode addl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    3698      #x01 #x00 #x00)
    3699    (def-x8664-opcode addl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    3700      #x83 #o300 #x00)
    3701    (def-x8664-opcode addl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    3702      #x05 nil nil)
    3703    (def-x8664-opcode addl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    3704      #x81 #o300 #x00)
    3705    (def-x8664-opcode addl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3706      #x83 #o000 #x00)
    3707    (def-x8664-opcode addl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    3708      #x81 #o000 #x00)
    3709 
    3710    (def-x8664-opcode addw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    3711      #x01 #o300 #x00 #x66)
    3712    (def-x8664-opcode addw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    3713      #x03 #o000 #x00 #x66)
    3714    (def-x8664-opcode addw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    3715      #x01 #x00 #x00 #x66)
    3716    (def-x8664-opcode addw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    3717      #x83 #o300 #x00 #x66)
    3718    (def-x8664-opcode addw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    3719      #x05 nil nil #x66)
    3720    (def-x8664-opcode addw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    3721      #x81 #o300 #x00 #x66)
    3722    (def-x8664-opcode addw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3723      #x83 #o000 #x00 #x66)
    3724    (def-x8664-opcode addw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    3725      #x81 #o000 #x00 #x66)
    3726 
    3727    (def-x8664-opcode addb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    3728      #x00 #o300 #x00)
    3729    (def-x8664-opcode addb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    3730      #x02 #o000 #x00)
    3731    (def-x8664-opcode addb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    3732      #x00 #x00 #x00)
    3733    (def-x8664-opcode addb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
    3734      #x04 nil nil)
    3735    (def-x8664-opcode addb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    3736      #x80 #o300 #x00)
    3737    (def-x8664-opcode addb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3738      #x80 #o000 #x00)
    3739 
    3740    ;; and
    3741    (def-x8664-opcode andq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    3742      #x21 #o300 #x48)
    3743    (def-x8664-opcode andq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    3744      #x23 #o000 #x48)
    3745    (def-x8664-opcode andq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    3746      #x21 #x00 #x48)
    3747    (def-x8664-opcode andq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    3748      #x83 #o340 #x48)
    3749    (def-x8664-opcode andq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    3750      #x25 nil #x48)
    3751    (def-x8664-opcode andq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    3752      #x81 #o340 #x48)
    3753    (def-x8664-opcode andq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3754      #x83 #o040 #x48)
    3755    (def-x8664-opcode andq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    3756      #x81 #o040 #x48)
    3757 
    3758    (def-x8664-opcode andl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    3759      #x21 #o300 #x00)
    3760    (def-x8664-opcode andl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    3761      #x23 #o000 #x00)
    3762    (def-x8664-opcode andl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    3763      #x21 #x00 #x00)
    3764    (def-x8664-opcode andl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    3765      #x83 #o340 #x00)
    3766    (def-x8664-opcode andl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    3767      #x25 nil nil)
    3768    (def-x8664-opcode andl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    3769      #x81 #o340 #x00)
    3770    (def-x8664-opcode andl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3771      #x83 #o040 #x00)
    3772    (def-x8664-opcode andl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    3773      #x81 #o040 #x00)
    3774 
    3775    (def-x8664-opcode andw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    3776      #x21 #o300 #x00 #x66)
    3777    (def-x8664-opcode andw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    3778      #x23 #o000 #x00 #x66)
    3779    (def-x8664-opcode andw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    3780      #x21 #x00 #x00 #x66)
    3781    (def-x8664-opcode andw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    3782      #x83 #o340 #x00 #x66)
    3783    (def-x8664-opcode andw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    3784      #x25 nil nil #x66)
    3785    (def-x8664-opcode andw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    3786      #x81 #o340 #x00 #x66)
    3787    (def-x8664-opcode andw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3788      #x83 #o040 #x00 #x66)
    3789    (def-x8664-opcode andw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    3790      #x81 #o040 #x00 #x66)
    3791 
    3792    (def-x8664-opcode andb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    3793      #x20 #o300 #x00)
    3794    (def-x8664-opcode andb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    3795      #x22 #o000 #x00)
    3796    (def-x8664-opcode andb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    3797      #x20 #o000 #x00)
    3798    (def-x8664-opcode andb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
    3799      #x24 nil nil)
    3800    (def-x8664-opcode andb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    3801      #x80 #o340 #x00)
    3802    (def-x8664-opcode andb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    3803      #x80 #o040 #x00)
    3804 
    3805    ;; bsf
    3806    (def-x8664-opcode bsfq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    3807      #x0fbc #o300 #x48)
    3808    (def-x8664-opcode bsfq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    3809      #x0fbc #o000 #x48)
    3810 
    3811    (def-x8664-opcode bsfl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    3812      #x0fbc #o300 #x00)
    3813    (def-x8664-opcode bsfl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    3814      #x0fbc #o000 #x00)
    3815 
    3816    (def-x8664-opcode bsfw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    3817      #x0fbc #o300 #x00 #x66)
    3818    (def-x8664-opcode bsfw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    3819      #x0fbc #o000 #x00 #x66)
    3820 
    3821    ;; bsr
    3822    (def-x8664-opcode bsrq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    3823      #x0fbd #o300 #x48)
    3824    (def-x8664-opcode bsrq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    3825      #x0fbd #o000 #x48)
    3826 
    3827    (def-x8664-opcode bsrl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    3828      #x0fbd #o300 #x00)
    3829    (def-x8664-opcode bsrl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    3830      #x0fbd #o000 #x00)
    3831 
    3832    (def-x8664-opcode bsrw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    3833      #x0fbd #o300 #x00 #x66)
    3834    (def-x8664-opcode bsrw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    3835      #x0fbd #o000 #x00 #x66)
    3836 
    3837    ;; bswap
    3838    (def-x8664-opcode bswapq ((:reg64 :insert-opcode-reg))
    3839      #x0fc8 nil #x48)
    3840 
    3841    (def-x8664-opcode bswapl ((:reg64 :insert-opcode-reg))
    3842      #x0fc8 nil #x00)
    3843 
    3844    ;; bt
    3845    (def-x8664-opcode btq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    3846      #x0fba #o340 #x48)
    3847    (def-x8664-opcode btq ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3848      #x0fba #o040 #x48)
    3849    (def-x8664-opcode btq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    3850      #x0fa3 #o300 #x48)
    3851    (def-x8664-opcode btq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    3852      #x0fa3 #o000 #x48)
    3853 
    3854    (def-x8664-opcode btl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    3855      #x0fba #o340 #x00)
    3856    (def-x8664-opcode btl ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3857      #x0fba #o040 #x00)
    3858    (def-x8664-opcode btl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    3859      #x0fa3 #o300 #x00)
    3860    (def-x8664-opcode btl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    3861      #x0fa3 #o000 #x00)
    3862 
    3863    (def-x8664-opcode btw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    3864      #x0fba #o340 #x00 #x66)
    3865    (def-x8664-opcode btw ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3866      #x0fba #o040 #x00 #x66)
    3867    (def-x8664-opcode btw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    3868      #x0fa3 #o300 #x00 #x66)
    3869    (def-x8664-opcode btw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    3870      #x0fa3 #o000 #x00 #x66)
    3871 
    3872    ;; btc
    3873    (def-x8664-opcode btcq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    3874      #x0fba #o370 #x48)
    3875    (def-x8664-opcode btcq ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3876      #x0fba #o070 #x48)
    3877    (def-x8664-opcode btcq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    3878      #x0fbb #o300 #x48)
    3879    (def-x8664-opcode btcq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    3880      #x0fbb #o000 #x48)
    3881 
    3882    (def-x8664-opcode btcl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    3883      #x0fba #o370 #x00)
    3884    (def-x8664-opcode btcl ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3885      #x0fba #o070 #x00)
    3886    (def-x8664-opcode btcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    3887      #x0fbb #o300 #x00)
    3888    (def-x8664-opcode btcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    3889      #x0fbb #o000 #x00)
    3890 
    3891    (def-x8664-opcode btcw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    3892      #x0fba #o370 #x00 #x66)
    3893    (def-x8664-opcode btcw ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3894      #x0fba #o070 #x00 #x66)
    3895    (def-x8664-opcode btcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    3896      #x0fbb #o300 #x00 #x66)
    3897    (def-x8664-opcode btcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    3898      #x0fbb #o000 #x00 #x66)
    3899 
    3900    ;; btr
    3901    (def-x8664-opcode btrq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    3902      #x0fba #o360 #x48)
    3903    (def-x8664-opcode btrq ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3904      #x0fba #o060 #x48)
    3905    (def-x8664-opcode btrq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    3906      #x0fb3 #o300 #x48)
    3907    (def-x8664-opcode btrq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    3908      #x0fb3 #o000 #x48)
    3909 
    3910    (def-x8664-opcode btrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    3911      #x0fba #o360 #x00)
    3912    (def-x8664-opcode btrl ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3913      #x0fba #o060 #x00)
    3914    (def-x8664-opcode btrl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    3915      #x0fb3 #o300 #x00)
    3916    (def-x8664-opcode btrl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    3917      #x0fb3 #o000 #x00)
    3918 
    3919    (def-x8664-opcode btrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    3920      #x0fba #o360  #x00 #x66)
    3921    (def-x8664-opcode btrw ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3922      #x0fba #o060 #x00 #x66)
    3923    (def-x8664-opcode btrw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    3924      #x0fb3 #o300 #x00 #x66)
    3925    (def-x8664-opcode btrw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    3926      #x0fb3 #o000 #x00 #x66)
    3927 
    3928    ;; bts
    3929    (def-x8664-opcode btsq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    3930      #x0fba #o350 #x48)
    3931    (def-x8664-opcode btsq ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3932      #x0fba #o050 #x48)
    3933    (def-x8664-opcode btsq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    3934      #x0fab #o300 #x48)
    3935    (def-x8664-opcode btsq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    3936      #x0fab #o000 #x48)
    3937 
    3938    (def-x8664-opcode btsl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    3939      #x0fba #o350 #x00)
    3940    (def-x8664-opcode btsl ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3941      #x0fba #o050 #x00)
    3942    (def-x8664-opcode btsl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    3943      #x0fab #o300 #x00)
    3944    (def-x8664-opcode btsl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    3945      #x0fab #o000 #x00)
    3946 
    3947    (def-x8664-opcode btsw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    3948      #x0fba #o350  #x00 #x66)
    3949    (def-x8664-opcode btsw ((:imm8 :insert-imm8) (:anymem :insert-memory))
    3950      #x0fba #o050 #x00 #x66)
    3951    (def-x8664-opcode btsw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    3952      #x0fab #o300 #x00 #x66)
    3953    (def-x8664-opcode btsw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    3954      #x0fab #o000 #x00 #x66)
    3955 
    3956    ;; call
    3957    ;; Probably need to align CALL instructions within the containing function,
    3958    ;; so that return addresses are tagged appropriately.
    3959    (def-x8664-opcode call ((:label :insert-label))
    3960      #xe8 nil nil)
    3961 
    3962    (def-x8664-opcode call ((:reg64 :insert-modrm-rm))
    3963      #xff #o320 #x0)
    3964 
    3965    (def-x8664-opcode call ((:anymem :insert-memory))
    3966      #xff #o020 #x0)
    3967 
    3968    ;; cbtw
    3969    (def-x8664-opcode cbtw ()
    3970      #x98 nil nil #x66)
    3971 
    3972    ;; clc
    3973    (def-x8664-opcode clc ()
    3974      #xf8 nil nil)
    3975 
    3976    ;; cld
    3977    (def-x8664-opcode cld ()
    3978      #xfc nil nil)
    3979 
    3980    ;; cltd
    3981    (def-x8664-opcode cltd ()
    3982      #x99 nil nil)
    3983 
    3984  
    3985    ;; cltq
    3986    (def-x8664-opcode cltq ()
    3987      #x98 nil #x48)
    3988 
    3989    ;; cmc
    3990    (def-x8664-opcode cmc ()
    3991      #xf5 nil nil)
    3992 
    3993    ;; cmovCC
    3994    (def-x8664-opcode cmovccq
    3995        ((:imm8 :insert-cc) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    3996      #x0f40 #o300 #x48)
    3997    (def-x8664-opcode cmovccq
    3998        ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    3999      #x0f40 #o000 #x48)
    4000    (def-x8664-opcode cmovccl
    4001        ((:imm8 :insert-cc) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4002      #x0f40 #o300 #x00)
    4003    (def-x8664-opcode cmovccl
    4004        ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4005      #x0f40 #o000 #x00)
    4006    (def-x8664-opcode cmovccw
    4007        ((:imm8 :insert-cc) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4008      #x0f40 #o300 #x00 #x66)
    4009    (def-x8664-opcode cmovccw
    4010        ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4011      #x0f40 #o000 #x00 #x66)
    4012 
    4013    (def-x8664-opcode cmovoq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4014      #x0f40 #o300 #x48)
    4015    (def-x8664-opcode cmovoq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4016      #x0f40 #o000 #x48)
    4017    (def-x8664-opcode cmovol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4018      #x0f40 #o300 #x00)
    4019    (def-x8664-opcode cmovol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4020      #x0f40 #o000 #x00)
    4021    (def-x8664-opcode cmovow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4022      #x0f40 #o300 #x00 #x66)
    4023    (def-x8664-opcode cmovow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4024      #x0f40 #o000 #x00 #x66)
    4025 
    4026    (def-x8664-opcode cmovnoq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4027      #x0f41 #o300 #x48)
    4028    (def-x8664-opcode cmovnoq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4029      #x0f41 #o000 #x48)
    4030    (def-x8664-opcode cmovnol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4031      #x0f41 #o300 #x00)
    4032    (def-x8664-opcode cmovnol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4033      #x0f41 #o000 #x00)
    4034    (def-x8664-opcode cmovnow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4035      #x0f41 #o300 #x00 #x66)
    4036    (def-x8664-opcode cmovnow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4037      #x0f41 #o000 #x00 #x66)
    4038 
    4039    (def-x8664-opcode cmovbq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4040      #x0f42 #o300 #x48)
    4041    (def-x8664-opcode cmovbq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4042      #x0f42 #o000 #x48)
    4043    (def-x8664-opcode cmovbl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4044      #x0f42 #o300 #x00)
    4045    (def-x8664-opcode cmovbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4046      #x0f42 #o000 #x00)
    4047    (def-x8664-opcode cmovbw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4048      #x0f42 #o300 #x00 #x66)
    4049    (def-x8664-opcode cmovbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4050      #x0f42 #o000 #x00 #x66)
    4051 
    4052    (def-x8664-opcode cmovaeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4053      #x0f43 #o300 #x48)
    4054    (def-x8664-opcode cmovaeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4055      #x0f43 #o000 #x48)
    4056    (def-x8664-opcode cmovael ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4057      #x0f43 #o300 #x00)
    4058    (def-x8664-opcode cmovael ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4059      #x0f43 #o000 #x00)
    4060    (def-x8664-opcode cmovaew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4061      #x0f43 #o300 #x00 #x66)
    4062    (def-x8664-opcode cmovaew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4063      #x0f43 #o000 #x00 #x66)
    4064 
    4065    (def-x8664-opcode cmoveq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4066      #x0f44 #o300 #x48)
    4067    (def-x8664-opcode cmoveq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4068      #x0f44 #o000 #x48)
    4069    (def-x8664-opcode cmovel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4070      #x0f44 #o300 #x00)
    4071    (def-x8664-opcode cmovel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4072      #x0f44 #o000 #x00)
    4073    (def-x8664-opcode cmovew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4074      #x0f44 #o300 #x00 #x66)
    4075    (def-x8664-opcode cmovew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4076      #x0f44 #o000 #x00 #x66)
    4077 
    4078    (def-x8664-opcode cmovneq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4079      #x0f45 #o300 #x48)
    4080    (def-x8664-opcode cmovneq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4081      #x0f45 #o000 #x48)
    4082    (def-x8664-opcode cmovnel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4083      #x0f45 #o300 #x00)
    4084    (def-x8664-opcode cmovnel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4085      #x0f45 #o000 #x00)
    4086    (def-x8664-opcode cmovnew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4087      #x0f45 #o300 #x00 #x66)
    4088    (def-x8664-opcode cmovnew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4089      #x0f45 #o000 #x00 #x66)
    4090 
    4091    (def-x8664-opcode cmovbeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4092      #x0f46 #o300 #x48)
    4093    (def-x8664-opcode cmovbeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4094      #x0f46 #o000 #x48)
    4095    (def-x8664-opcode cmovbel ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-reg))
    4096      #x0f46 #o300 #x00)
    4097    (def-x8664-opcode cmovbel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4098      #x0f46 #o000 #x00)
    4099    (def-x8664-opcode cmovbew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4100      #x0f46 #o300 #x00 #x66)
    4101    (def-x8664-opcode cmovbew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4102      #x0f46 #o000 #x00 #x66)
    4103 
    4104    (def-x8664-opcode cmovaq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4105      #x0f47 #o300 #x48)
    4106    (def-x8664-opcode cmovaq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4107      #x0f47 #o000 #x48)
    4108    (def-x8664-opcode cmoval ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4109      #x0f47 #o300 #x00)
    4110    (def-x8664-opcode cmoval ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4111      #x0f47 #o000 #x00)
    4112    (def-x8664-opcode cmovaw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4113      #x0f47 #o300 #x00 #x66)
    4114    (def-x8664-opcode cmovaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4115      #x0f47 #o000 #x00 #x66)
    4116 
    4117    (def-x8664-opcode cmovsq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4118      #x0f48 #o300 #x48)
    4119    (def-x8664-opcode cmovsq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4120      #x0f48 #o000 #x48)
    4121    (def-x8664-opcode cmovsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4122      #x0f48 #o300 #x00)
    4123    (def-x8664-opcode cmovsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4124      #x0f48 #o000 #x00)
    4125    (def-x8664-opcode cmovsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4126      #x0f48 #o300 #x00 #x66)
    4127    (def-x8664-opcode cmovsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4128      #x0f48 #o000 #x00 #x66)
    4129 
    4130    (def-x8664-opcode cmovnsq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4131      #x0f49 #o300 #x48)
    4132    (def-x8664-opcode cmovnsq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4133      #x0f49 #o000 #x48)
    4134    (def-x8664-opcode cmovnsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4135      #x0f49 #o300 #x00)
    4136    (def-x8664-opcode cmovnsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4137      #x0f49 #o000 #x00)
    4138    (def-x8664-opcode cmovnsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4139      #x0f49 #o300 #x00 #x66)
    4140    (def-x8664-opcode cmovnsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4141      #x0f49 #o000 #x00 #x66)
    4142 
    4143    (def-x8664-opcode cmovpeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4144      #x0f4a #o300 #x48)
    4145    (def-x8664-opcode cmovpeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4146      #x0f4a #o000 #x48)
    4147    (def-x8664-opcode cmovpel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4148      #x0f4a #o300 #x00)
    4149    (def-x8664-opcode cmovpel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4150      #x0f4a #o000 #x00)
    4151    (def-x8664-opcode cmovpew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4152      #x0f4a #o300 #x00 #x66)
    4153    (def-x8664-opcode cmovpew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4154      #x0f4a #o000 #x00 #x66)
    4155 
    4156    (def-x8664-opcode cmovpoq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4157      #x0f4b #o300 #x48)
    4158    (def-x8664-opcode cmovpoq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4159      #x0f4b #o000 #x48)
    4160    (def-x8664-opcode cmovpol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4161      #x0f4b #o300 #x00)
    4162    (def-x8664-opcode cmovpol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4163      #x0f4b #o000 #x00)
    4164    (def-x8664-opcode cmovpow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4165      #x0f4b #o300 #x00 #x66)
    4166    (def-x8664-opcode cmovpow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4167      #x0f4b #o000 #x00 #x66)
    4168 
    4169    (def-x8664-opcode cmovlq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4170      #x0f4c #o300 #x48)
    4171    (def-x8664-opcode cmovlq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4172      #x0f4c #o000 #x48)
    4173    (def-x8664-opcode cmovll ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4174      #x0f4c #o300 #x00)
    4175    (def-x8664-opcode cmovll ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4176      #x0f4c #o000 #x00)
    4177    (def-x8664-opcode cmovlw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4178      #x0f4c #o300 #x00 #x66)
    4179    (def-x8664-opcode cmovlw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4180      #x0f4c #o000 #x00 #x66)
    4181 
    4182    (def-x8664-opcode cmovgeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4183      #x0f4d #o300 #x48)
    4184    (def-x8664-opcode cmovgeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4185      #x0f4d #o000 #x48)
    4186    (def-x8664-opcode cmovgel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4187      #x0f4d #o300 #x00)
    4188    (def-x8664-opcode cmovgel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4189      #x0f4d #o000 #x00)
    4190    (def-x8664-opcode cmovgew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4191      #x0f4d #o300 #x00 #x66)
    4192    (def-x8664-opcode cmovgew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4193      #x0f4d #o000 #x00 #x66)
    4194 
    4195    (def-x8664-opcode cmovleq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4196      #x0f4e #o300 #x48)
    4197    (def-x8664-opcode cmovleq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4198      #x0f4e #o000 #x48)
    4199    (def-x8664-opcode cmovlel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4200      #x0f4e #o300 #x00)
    4201    (def-x8664-opcode cmovlel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4202      #x0f4e #o000 #x00)
    4203    (def-x8664-opcode cmovlew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4204      #x0f4e #o300 #x00 #x66)
    4205    (def-x8664-opcode cmovlew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4206      #x0f4e #o000 #x00 #x66)
    4207 
    4208    (def-x8664-opcode cmovgq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4209      #x0f4f #o300 #x48)
    4210    (def-x8664-opcode cmovgq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4211      #x0f4f #o000 #x48)
    4212    (def-x8664-opcode cmovgl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4213      #x0f4f #o300 #x00)
    4214    (def-x8664-opcode cmovgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4215      #x0f4f #o000 #x00)
    4216    (def-x8664-opcode cmovgw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4217      #x0f4f #o300 #x00 #x66)
    4218    (def-x8664-opcode cmovgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4219      #x0f4f #o000 #x00 #x66)
    4220 
    4221 
    4222    ;; cmp
    4223 
    4224    (def-x8664-opcode cmpq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    4225      #x39 #o300 #x48)
    4226    (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4227      #x39 #o300 #x48)
    4228    (def-x8664-opcode cmpq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4229      #x3b #o000 #x48)
    4230    (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    4231      #x3b #o000 #x48)   
    4232    (def-x8664-opcode cmpq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    4233      #x39 #x00 #x48)
    4234    (def-x8664-opcode rcmpq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4235      #x39 #x00 #x48)
    4236    (def-x8664-opcode cmpq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    4237      #x83 #o370 #x48)
    4238    (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-rm) (:imm8s :insert-imm8s))
    4239      #x83 #o370 #x48)
    4240    (def-x8664-opcode cmpq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    4241      #x3d nil #x48)
    4242    (def-x8664-opcode rcmpq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    4243      #x3d nil #x48)
    4244    (def-x8664-opcode cmpq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    4245      #x81 #o370 #x48)
    4246    (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-rm) (:imm32s :insert-imm32s))
    4247      #x81 #o370 #x48)   
    4248    (def-x8664-opcode cmpq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4249      #x83 #o070 #x48)
    4250    (def-x8664-opcode rcmpq ((:anymem :insert-memory) (:imm8s :insert-imm8s))
    4251      #x83 #o070 #x48)
    4252    (def-x8664-opcode cmpq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    4253      #x81 #o070 #x48)
    4254    (def-x8664-opcode rcmpq ((:anymem :insert-memory) (:imm32s :insert-imm32s))
    4255      #x81 #o070 #x48)
    4256 
    4257    (def-x8664-opcode cmpl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    4258      #x39 #o300 #x00)
    4259    (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4260      #x39 #o300 #x00)   
    4261    (def-x8664-opcode cmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4262      #x3b #o000 #x00)
    4263    (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    4264      #x3b #o000 #x00)   
    4265    (def-x8664-opcode cmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    4266      #x39 #x00 #x00)
    4267    (def-x8664-opcode rcmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4268      #x39 #x00 #x00)   
    4269    (def-x8664-opcode cmpl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    4270      #x83 #o370 #x00)
    4271    (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm8s :insert-imm8s))
    4272      #x83 #o370 #x00)   
    4273    (def-x8664-opcode cmpl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    4274      #x3d nil nil)
    4275    (def-x8664-opcode rcmpl ((:acc :insert-nothing) (:imm32s :insert-imm32s))
    4276      #x3d nil nil)   
    4277    (def-x8664-opcode cmpl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    4278      #x81 #o370 #x00)
    4279    (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm32s :insert-imm32s))
    4280      #x81 #o370 #x00)   
    4281    (def-x8664-opcode cmpl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4282      #x83 #o070 #x00)
    4283    (def-x8664-opcode rcmpl ((:anymem :insert-memory) (:imm8s :insert-imm8s))
    4284      #x83 #o070 #x00)   
    4285    (def-x8664-opcode cmpl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    4286      #x81 #o070 #x00)
    4287    (def-x8664-opcode rcmpl ((:anymem :insert-memory) (:imm32s :insert-imm32s))
    4288      #x81 #o070 #x00)   
    4289 
    4290    (def-x8664-opcode cmpw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    4291      #x39 #o300 #x00 #x66)
    4292    (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4293      #x39 #o300 #x00 #x66)   
    4294    (def-x8664-opcode cmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4295      #x3b #o000 #x00 #x66)
    4296    (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    4297      #x3b #o000 #x00 #x66)   
    4298    (def-x8664-opcode cmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    4299      #x39 #x00 #x00 #x66)
    4300    (def-x8664-opcode rcmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4301      #x39 #x00 #x00 #x66)   
    4302    (def-x8664-opcode cmpw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    4303      #x83 #o370 #x00 #x66)
    4304    (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm8s :insert-imm8s))
    4305      #x83 #o370 #x00 #x66)   
    4306    (def-x8664-opcode cmpw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    4307      #x3d nil nil #x66)
    4308    (def-x8664-opcode rcmpw ((:acc :insert-nothing) (:imm16 :insert-imm16))
    4309      #x3d nil nil #x66)   
    4310    (def-x8664-opcode cmpw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    4311      #x81 #o370 #x00 #x66)
    4312    (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm16 :insert-imm16))
    4313      #x81 #o370 #x00 #x66)   
    4314    (def-x8664-opcode cmpw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4315      #x83 #o070 #x00 #x66)
    4316    (def-x8664-opcode rcmpw ((:anymem :insert-memory) (:imm8s :insert-imm8s))
    4317      #x83 #o070 #x00 #x66)   
    4318    (def-x8664-opcode cmpw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    4319      #x81 #o070 #x00 #x66)
    4320    (def-x8664-opcode rcmpw ((:anymem :insert-memory) (:imm16 :insert-imm16))
    4321      #x81 #o070 #x00 #x66)   
    4322 
    4323    (def-x8664-opcode cmpb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    4324      #x38 #o300 #x00)
    4325    (def-x8664-opcode rcmpb ((:reg8 :insert-modrm-rm) (:reg8 :insert-modrm-reg))
    4326      #x38 #o300 #x00)
    4327    (def-x8664-opcode cmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    4328      #x3a #o000 #x00)
    4329    (def-x8664-opcode rcmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    4330      #x3a #o000 #x00)
    4331    (def-x8664-opcode cmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    4332      #x38 #x00 #x00)
    4333    (def-x8664-opcode rcmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    4334      #x38 #x00 #x00)   
    4335    (def-x8664-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:acc :insert-nothing))
    4336      #x3c nil nil)
    4337    (def-x8664-opcode rcmpb ((:acc :insert-nothing) ((:imm8s :imm8) :insert-imm8s))
    4338      #x3c nil nil)
    4339    (def-x8664-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:reg8 :insert-modrm-rm))
    4340      #x80 #o370 #x00)
    4341    (def-x8664-opcode rcmpb ((:reg8 :insert-modrm-rm) ((:imm8s :imm8) :insert-imm8s))
    4342      #x80 #o370 #x00)
    4343    (def-x8664-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:anymem :insert-memory))
    4344      #x80 #o070 #x00)
    4345    (def-x8664-opcode rcmpb ((:anymem :insert-memory) ((:imm8s :imm8) :insert-imm8s))
    4346      #x80 #o070 #x00)
    4347 
    4348    ;; cmps
    4349    (def-x8664-opcode cmpsq ()
    4350      #xa7 nil #x48)
    4351 
    4352    (def-x8664-opcode cmpsl ()
    4353      #xa7 nil nil)
    4354 
    4355    (def-x8664-opcode cmpsw ()
    4356      #xa7 nil nil #x66)
    4357 
    4358    (def-x8664-opcode cmpsb ()
    4359      #xa6 nil nil)
    4360 
    4361    ;; cmpxchg
    4362    (def-x8664-opcode cmpxchgq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    4363      #x0fb1 #o300 #x48)
    4364    (def-x8664-opcode cmpxchgq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    4365      #x0fb1 #o000 #x48)
    4366 
    4367    (def-x8664-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    4368      #x0fb1 #o300 #x00)
    4369    (def-x8664-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    4370      #x0fb1 #o000 #x00)
    4371 
    4372    (def-x8664-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    4373      #x0fb1 #o300 #x00 #x66)
    4374    (def-x8664-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    4375      #x0fb1 #o000 #x00 #x66)
    4376 
    4377    (def-x8664-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    4378      #x0fb0 #o300 #x00)
    4379    (def-x8664-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    4380      #x0fb0 #o000 #x00)
    4381 
    4382    ;; cpuid
    4383    (def-x8664-opcode cpuid ()
    4384      #x0fa2 nil nil)
    4385 
    4386    ;; cqto
    4387    (def-x8664-opcode cqto ()
    4388      #x99 nil #x48)
    4389 
    4390    ;; cwtd
    4391    (def-x8664-opcode cwtd ()
    4392      #x99 nil nil #x66)
    4393 
    4394    ;; cwtl
    4395    (def-x8664-opcode cwtl ()
    4396      #x98 nil nil)
    4397 
    4398    ;; dec (not the 1-byte form).  This exists on x8664, but gas doesn't
    4399    ;; know that.
    4400    (def-x8664-opcode decq ((:reg64 :insert-modrm-rm))
    4401      #xff #o310 #x48)
    4402    (def-x8664-opcode decq ((:anymem :insert-memory))
    4403      #xff #o010 #x48)
    4404 
    4405    (def-x8664-opcode decl ((:reg32 :insert-modrm-rm))
    4406      #xff #o310 #x00)
    4407    (def-x8664-opcode decl ((:anymem :insert-memory))
    4408      #xff #o010 #x00)
    4409 
    4410    (def-x8664-opcode decw ((:reg16 :insert-modrm-rm))
    4411      #xff #o310 #x00 #x66)
    4412    (def-x8664-opcode decw ((:anymem :insert-memory))
    4413      #xff #o010 #x00 #x66)
    4414 
    4415    (def-x8664-opcode decb ((:reg8 :insert-modrm-rm))
    4416      #xfe #o310 #x00)
    4417    (def-x8664-opcode decb ((:anymem :insert-memory))
    4418      #xfe #o010 #x00)
    4419 
    4420    ;; div
    4421    (def-x8664-opcode divq ((:reg64 :insert-modrm-rm))
    4422      #xf7 #o360 #x48)
    4423    (def-x8664-opcode divq ((:anymem :insert-memory))
    4424      #xf7 #o060 #x48)
    4425 
    4426    (def-x8664-opcode divl ((:reg32 :insert-modrm-rm))
    4427      #xf7 #o360 #x00)
    4428    (def-x8664-opcode divl ((:anymem :insert-memory))
    4429      #xf7 #o060 #x00)
    4430 
    4431    (def-x8664-opcode divw ((:reg16 :insert-modrm-rm))
    4432      #xf7 #o360 #x00 #x66)
    4433    (def-x8664-opcode divw ((:anymem :insert-memory))
    4434      #xf7 #o060 #x00 #x66)
    4435 
    4436    (def-x8664-opcode divb ((:reg8 :insert-modrm-rm))
    4437      #xf6 #o360 #x00)
    4438    (def-x8664-opcode divl ((:anymem :insert-memory))
    4439      #xf6 #o060 #x00)
    4440 
    4441    ;; enter.
    4442 
    4443    (def-x8664-opcode enter ((:imm16 :insert-imm16) (:imm8 :insert-extra))
    4444      #xc8 nil nil)
    4445 
    4446    ;; hlt
    4447    (def-x8664-opcode hlt ()
    4448      #xf4 nil nil)
    4449 
    4450    ;; idiv.  Note that GAS doesn't know about newer(?) idiv forms
    4451    (def-x8664-opcode idivq ((:reg64 :insert-modrm-rm))
    4452      #xf7 #o370 #x48)
    4453    (def-x8664-opcode idivq ((:anymem :insert-memory))
    4454      #xf7 #o070 #x48)
    4455 
    4456    (def-x8664-opcode idivl ((:reg32 :insert-modrm-rm))
    4457      #xf7 #o370 #x00)
    4458    (def-x8664-opcode idivl ((:anymem :insert-memory))
    4459      #xf7 #o070 #x00)
    4460 
    4461    (def-x8664-opcode idivw ((:reg16 :insert-modrm-rm))
    4462      #xf7 #o370 #x00 #x66)
    4463    (def-x8664-opcode idivw ((:anymem :insert-memory))
    4464      #xf7 #o070 #x00 #x66)
    4465 
    4466    (def-x8664-opcode idivb ((:reg8 :insert-modrm-rm))
    4467      #xf6 #o370 #x00)
    4468    (def-x8664-opcode idivl ((:anymem :insert-memory))
    4469      #xf6 #o070 #x00)
    4470 
    4471    ;; imul
    4472    (def-x8664-opcode imulq ((:reg64 :insert-modrm-rm))
    4473      #xf7 #o350 #x48)
    4474    (def-x8664-opcode imulq ((:anymem :insert-memory))
    4475      #xf7 #o050 #x48)
    4476 
    4477    (def-x8664-opcode imulq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4478      #x6b #o300 #x48)
    4479    (def-x8664-opcode imulq ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4480      #x6b #o000 #x48)
    4481    (def-x8664-opcode imulq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4482      #x69 #o300 #x48)
    4483    (def-x8664-opcode imulq ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4484      #x69 #o000 #x48)
    4485    (def-x8664-opcode imulq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4486      #x0faf #o300 #x48)
    4487    (def-x8664-opcode imulq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4488      #x0faf #o000 #x48)   
    4489 
    4490    
    4491    (def-x8664-opcode imull ((:reg32 :insert-modrm-rm))
    4492      #xf7 #o350 #x00)
    4493    (def-x8664-opcode imull ((:anymem :insert-memory))
    4494      #xf7 #o050 #x00)
    4495 
    4496    (def-x8664-opcode imull ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4497      #x6b #o300 #x00)
    4498    (def-x8664-opcode imull ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4499      #x6b #o000 #x00)
    4500    (def-x8664-opcode imull ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4501      #x69 #o300 #x00)
    4502    (def-x8664-opcode imull ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4503      #x69 #o000 #x00)
    4504    (def-x8664-opcode imull ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4505      #x0faf #o300 #x00)
    4506    (def-x8664-opcode imull ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4507      #x0faf #o000 #x00)   
    4508    
    4509    (def-x8664-opcode imulw ((:reg16 :insert-modrm-rm))
    4510      #xf7 #o350 #x00 #x66)
    4511    (def-x8664-opcode imulw ((:anymem :insert-memory))
    4512      #xf7 #o050 #x00 #x66)
    4513 
    4514    (def-x8664-opcode imulw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4515      #x6b #o300 #x00 #x66)
    4516    (def-x8664-opcode imulw ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4517      #x6b #o000 #x00 #x66)
    4518    (def-x8664-opcode imulw ((:imm32s :insert-imm32s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4519      #x69 #o300 #x00 #x66)
    4520    (def-x8664-opcode imulw ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4521      #x69 #o000 #x00 #x66)
    4522    (def-x8664-opcode imulw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4523      #x0faf #o300 #x00 #x66)
    4524    (def-x8664-opcode imulw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4525      #x0faf #o000 #x00 #x66)   
    4526 
    4527    (def-x8664-opcode imulb ((:reg8 :insert-modrm-rm))
    4528      #xf6 #o350 #x00)
    4529    (def-x8664-opcode imulb ((:anymem :insert-memory))
    4530      #xf6 #o050 #x00)
    4531 
    4532    ;; inc (but not the one-byte form) is available on x86-64.
    4533    (def-x8664-opcode incq ((:reg64 :insert-modrm-rm))
    4534      #xff #o300 #x48)
    4535    (def-x8664-opcode incq ((:anymem :insert-memory))
    4536      #xff #o000 #x48)
    4537 
    4538    (def-x8664-opcode incl ((:reg32 :insert-modrm-rm))
    4539      #xff #o300 #x00)
    4540    (def-x8664-opcode incl ((:anymem :insert-memory))
    4541      #xff #o000 #x00)
    4542 
    4543    (def-x8664-opcode incw ((:reg16 :insert-modrm-rm))
    4544      #xff #o300 #x00 #x66)
    4545    (def-x8664-opcode incw ((:anymem :insert-memory))
    4546      #xff #o000 #x00 #x66)
    4547 
    4548    (def-x8664-opcode incb ((:reg8 :insert-modrm-rm))
    4549      #xfe #o300 #x00)
    4550    (def-x8664-opcode incb ((:anymem :insert-memory))
    4551      #xfe #o000 #x00)
    4552 
    4553    ;; int.  See also UUOs.
    4554    (def-x8664-opcode int ((:imm8 :insert-imm8-for-int))
    4555      #xcd nil nil)
    4556 
    4557    ;; Jcc.  Generate the short form here; maybe relax later.
    4558    (def-x8664-opcode (jcc :jump) ((:imm8 :insert-cc) (:label :insert-label))
    4559      #x70 nil nil)
    4560    (def-x8664-opcode (jcc.pt :jump) ((:imm8 :insert-cc) (:label :insert-label))
    4561      #x70 nil nil #x3e)
    4562    (def-x8664-opcode (jcc.pn :jump) ((:imm8 :insert-cc) (:label :insert-label))
    4563      #x70 nil nil #x2e)
    4564 
    4565    (def-x8664-opcode (jo :jump) ((:label :insert-label))
    4566      #x70 nil nil)
    4567    (def-x8664-opcode (jo.pt :jump) ((:label :insert-label))
    4568      #x70 nil nil #x3e)
    4569    (def-x8664-opcode (jo.pn :jump) ((:label :insert-label))
    4570      #x70 nil nil #x2e)
    4571    (def-x8664-opcode (jno :jump) ((:label :insert-label))
    4572      #x71 nil nil)
    4573    (def-x8664-opcode (jno.pt :jump) ((:label :insert-label))
    4574      #x71 nil nil #x3e)
    4575    (def-x8664-opcode (jno.pn :jump) ((:label :insert-label))
    4576      #x71 nil nil #x2e)
    4577    (def-x8664-opcode (jb :jump) ((:label :insert-label))
    4578      #x72 nil nil)
    4579    (def-x8664-opcode (jb.pt :jump) ((:label :insert-label))
    4580      #x72 nil nil #x3e)
    4581    (def-x8664-opcode (jb.pn :jump) ((:label :insert-label))
    4582      #x72 nil nil #x2e)
    4583    (def-x8664-opcode (jae :jump) ((:label :insert-label))
    4584      #x73 nil nil)
    4585    (def-x8664-opcode (jae.pt :jump) ((:label :insert-label))
    4586      #x73 nil nil #x3e)
    4587    (def-x8664-opcode (jae.pn :jump) ((:label :insert-label))
    4588      #x73 nil nil #x2e)
    4589    (def-x8664-opcode (je :jump) ((:label :insert-label))
    4590      #x74 nil nil)
    4591    (def-x8664-opcode (je.pt :jump) ((:label :insert-label))
    4592      #x74 nil nil #x3e)
    4593    (def-x8664-opcode (je.pn :jump) ((:label :insert-label))
    4594      #x74 nil nil #x2e)
    4595    (def-x8664-opcode (jz :jump) ((:label :insert-label))
    4596      #x74 nil nil)
    4597    (def-x8664-opcode (jz.pt :jump) ((:label :insert-label))
    4598      #x74 nil nil #x3e)
    4599    (def-x8664-opcode (jz.pn :jump) ((:label :insert-label))
    4600      #x74 nil nil #x2e)
    4601    (def-x8664-opcode (jne :jump) ((:label :insert-label))
    4602      #x75 nil nil)
    4603    (def-x8664-opcode (jne.pt :jump) ((:label :insert-label))
    4604      #x75 nil nil #x3e)
    4605    (def-x8664-opcode (jne.pn :jump) ((:label :insert-label))
    4606      #x75 nil nil #x2e)
    4607    (def-x8664-opcode (jnz :jump) ((:label :insert-label))
    4608      #x75 nil nil)
    4609    (def-x8664-opcode (jnz.pt :jump) ((:label :insert-label))
    4610      #x75 nil nil #x3e)
    4611    (def-x8664-opcode (jnz.pn :jump) ((:label :insert-label))
    4612      #x75 nil nil #x2e)
    4613    (def-x8664-opcode (jbe :jump) ((:label :insert-label))
    4614      #x76 nil nil)
    4615    (def-x8664-opcode (jbe.pt :jump) ((:label :insert-label))
    4616      #x76 nil nil #x3e)
    4617    (def-x8664-opcode (jbe.pn :jump) ((:label :insert-label))
    4618      #x76 nil nil #x2e)
    4619    (def-x8664-opcode (ja :jump) ((:label :insert-label))
    4620      #x77 nil nil)
    4621    (def-x8664-opcode (ja.pt :jump) ((:label :insert-label))
    4622      #x77 nil nil #x3e)
    4623    (def-x8664-opcode (ja.pn :jump) ((:label :insert-label))
    4624      #x77 nil nil #x2e)
    4625    (def-x8664-opcode (js :jump) ((:label :insert-label))
    4626      #x78 nil nil)
    4627    (def-x8664-opcode (js.pt :jump) ((:label :insert-label))
    4628      #x78 nil nil #x3e)
    4629    (def-x8664-opcode (js.pn :jump) ((:label :insert-label))
    4630      #x78 nil nil #x2e)
    4631    (def-x8664-opcode (jns :jump) ((:label :insert-label))
    4632      #x79 nil nil)
    4633    (def-x8664-opcode (jns.pt :jump) ((:label :insert-label))
    4634      #x79 nil nil #x3e)
    4635    (def-x8664-opcode (jns.pn :jump) ((:label :insert-label))
    4636      #x79 nil nil #x2e)
    4637    (def-x8664-opcode (jpe :jump) ((:label :insert-label))
    4638      #x7a nil nil)
    4639    (def-x8664-opcode (jpe.pt :jump) ((:label :insert-label))
    4640      #x7a nil nil #x3e)
    4641    (def-x8664-opcode (jpe.pn :jump) ((:label :insert-label))
    4642      #x7a nil nil #x2e)
    4643    (def-x8664-opcode (jpo :jump) ((:label :insert-label))
    4644      #x7b nil nil)
    4645    (def-x8664-opcode (jpo.pt :jump) ((:label :insert-label))
    4646      #x7b nil nil #x3e)
    4647    (def-x8664-opcode (jpo.pn :jump) ((:label :insert-label))
    4648      #x7b nil nil #x2e)
    4649    (def-x8664-opcode (jl :jump) ((:label :insert-label))
    4650      #x7c nil nil)
    4651    (def-x8664-opcode (jl.pt :jump) ((:label :insert-label))
    4652      #x7c nil nil #x3e)
    4653    (def-x8664-opcode (jl.pn :jump) ((:label :insert-label))
    4654      #x7c nil nil #x2e)
    4655    (def-x8664-opcode (jge :jump) ((:label :insert-label))
    4656      #x7d nil nil)
    4657    (def-x8664-opcode (jge.pt :jump) ((:label :insert-label))
    4658      #x7d nil nil #x3e)
    4659    (def-x8664-opcode (jge.pn :jump) ((:label :insert-label))
    4660      #x7d nil nil #x2e)
    4661    (def-x8664-opcode (jle :jump) ((:label :insert-label))
    4662      #x7e nil nil)
    4663    (def-x8664-opcode (jle.pt :jump) ((:label :insert-label))
    4664      #x7e nil nil #x3e)
    4665    (def-x8664-opcode (jle.pn :jump) ((:label :insert-label))
    4666      #x7e nil nil #x2e)
    4667    (def-x8664-opcode (jg :jump) ((:label :insert-label))
    4668      #x7f nil nil)
    4669    (def-x8664-opcode (jg.pt :jump) ((:label :insert-label))
    4670      #x7f nil nil #x3e)
    4671    (def-x8664-opcode (jg.pn :jump) ((:label :insert-label))
    4672      #x7f nil nil #x2e)
    4673 
    4674    ;; jmp .  Translating the 8-bit pc-relative version to the 32-bit
    4675    ;;        pc-relative version happens during relaxation.
    4676    (def-x8664-opcode (jmp :jump) ((:label :insert-label))
    4677      #xeb nil nil)
    4678 
    4679    (def-x8664-opcode jmp ((:reg64 :insert-modrm-rm))
    4680      #xff #o340 #x0)
    4681 
    4682    (def-x8664-opcode jmp ((:anymem :insert-memory))
    4683      #xff #o040 #x0)
    4684 
    4685    ;; lea
    4686    (def-x8664-opcode leaq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4687      #x8d 0 #x48)
    4688 
    4689    (def-x8664-opcode leal ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4690      #x8d 0 #x00)
    4691 
    4692    (def-x8664-opcode leaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4693      #x8d 0 #x00 #x66)
    4694 
    4695    ;; leave
    4696    (def-x8664-opcode leave ()
    4697      #xc9 nil nil)
    4698 
    4699    ;; lock
    4700    (def-x8664-opcode lock ()
    4701      #xf0 nil nil)
    4702 
    4703    ;; lods
    4704    (def-x8664-opcode lodsq ()
    4705      #xac nil #x48)
    4706 
    4707    (def-x8664-opcode lodsl ()
    4708      #xac nil nil)
    4709 
    4710    ;; loop
    4711    (def-x8664-opcode loopq ((:label :insert-label))
    4712      #xe2 nil #x48)
    4713 
    4714    (def-x8664-opcode loopl ((:label :insert-label))
    4715      #xe2 nil nil)
    4716 
    4717    (def-x8664-opcode loopzq ((:label :insert-label))
    4718      #xe1 nil #x48)
    4719 
    4720    (def-x8664-opcode loopzl ((:label :insert-label))
    4721      #xe1 nil nil)
    4722 
    4723    (def-x8664-opcode loopnzq ((:label :insert-label))
    4724      #xe0 nil #x48)
    4725 
    4726    (def-x8664-opcode loopnzl ((:label :insert-label))
    4727      #xe0 nil nil)
    4728 
    4729    ;; mov, including the MMX/XMM variants.
    4730    (def-x8664-opcode movq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
    4731      #x0f6f #o300 0)
    4732    (def-x8664-opcode movq ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
    4733      #x0f7f #o0 0)
    4734    (def-x8664-opcode movq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    4735      #x0f6f #o0 0)
    4736    (def-x8664-opcode movq ((:regxmm :insert-xmm-reg) (:regxmm :insert-xmm-rm))
    4737      #x0f7e #o300 0 #xf3)
    4738    (def-x8664-opcode movq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    4739      #x0f7e #o000 0 #xf3)
    4740    (def-x8664-opcode movq ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
    4741      #x0fd6 #o000 0 #x66)
    4742 
    4743    (def-x8664-opcode movq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    4744      #x89 #o300 #x48)
    4745    (def-x8664-opcode movq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4746      #x8b #o0 #x48)
    4747    (def-x8664-opcode movq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    4748      #x89 #o0 #x48)
    4749    (def-x8664-opcode movq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    4750      #xc7 #o300 #x48)
    4751    (def-x8664-opcode movq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    4752      #xc7 #o000 #x48)
    4753    (def-x8664-opcode movq ((:imm64 :insert-imm64) (:reg64 :insert-opcode-reg))
    4754      #xb8 nil #x48)
    4755 
    4756    (def-x8664-opcode movl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    4757      #x89 #o300 #x00)
    4758    (def-x8664-opcode movl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4759      #x8b #o0 #x00)
    4760    (def-x8664-opcode movl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    4761      #x89 #o0 #x00)
    4762    (def-x8664-opcode movl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    4763      #xc7 #o300 #x00)
    4764    (def-x8664-opcode movl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    4765      #xc7 #o000 #x00)
    4766 
    4767 
    4768    (def-x8664-opcode movw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    4769      #x89 #o300 #x00 #x66)
    4770    (def-x8664-opcode movw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4771      #x8b #o0 #x00  #x66)
    4772    (def-x8664-opcode movw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    4773      #x89 #o0 #x00 #x66)
    4774    (def-x8664-opcode movw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    4775      #xc7 #o300 #x00 #x66)
    4776    (def-x8664-opcode movw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    4777      #xc7 #o000 #x00 #x66)
    4778 
    4779    (def-x8664-opcode movb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    4780      #x88 #o300 0)
    4781    (def-x8664-opcode movb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    4782      #x8a #o0 0)
    4783    (def-x8664-opcode movb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    4784      #x88 #o0 0)
    4785    (def-x8664-opcode movb ((:imm8s :insert-imm8s) (:reg8 :insert-opcode-reg))
    4786      #xb0 nil 0)
    4787    (def-x8664-opcode movb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4788      #xc6 #o000 0)
    4789  
    4790    ;; movd
    4791    (def-x8664-opcode movd ((:reg64 :insert-modrm-rm) (:regmmx :insert-mmx-reg))
    4792      #x0f6e #o300 #x48)
    4793    (def-x8664-opcode movd ((:reg32 :insert-modrm-rm) (:regmmx :insert-mmx-reg))
    4794      #x0f6e #o300 0)
    4795    (def-x8664-opcode movd ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    4796      #x0f6e #o000 0)
    4797    (def-x8664-opcode movd ((:regmmx :insert-mmx-reg) (:reg64 :insert-modrm-rm))
    4798      #x0f7e #o300 #x48)
    4799    (def-x8664-opcode movd ((:regmmx :insert-mmx-reg) (:reg32 :insert-modrm-rm))
    4800      #x0f7e #o300 #x0)
    4801    (def-x8664-opcode movd ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
    4802      #x0f7e #o000 #x0)
    4803 
    4804    (def-x8664-opcode movd ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    4805      #x0f6e #o300 #x48 #x66)
    4806    (def-x8664-opcode movd ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    4807      #x0f6e #o300 0 #x66)
    4808    (def-x8664-opcode movd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    4809      #x0f6e #o000 0 #x66)
    4810    (def-x8664-opcode movd ((:regxmm :insert-xmm-reg) (:reg64 :insert-modrm-rm))
    4811      #x0f7e #o300 #x48 #x66)
    4812    (def-x8664-opcode movd ((:regxmm :insert-xmm-reg) (:reg32 :insert-modrm-rm))
    4813      #x0f7e #o300 #x0 #x66)
    4814    (def-x8664-opcode movd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
    4815      #x0f7e #o000 #x0 #x66)
    4816 
    4817    ;; sign-extending mov
    4818    (def-x8664-opcode movsbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4819      #x0fbe #o300 0)
    4820    (def-x8664-opcode movsbl ((:anymem :insert-memory)  (:reg32 :insert-modrm-reg))
    4821      #x0fbe #o000 0)
    4822    (def-x8664-opcode movsbw ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    4823      #x0fbe #o300 0 #x66)
    4824    (def-x8664-opcode movsbw ((:anymem :insert-memory) (:reg16 :insert-modrm-rm))
    4825      #x0fbe #o300 0 #x66)
    4826    (def-x8664-opcode movsbq ((:reg8 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4827      #x0fbe #o300 #x48)
    4828    (def-x8664-opcode movsbq ((:anymem :insert-memory)  (:reg64 :insert-modrm-reg))
    4829      #x0fbe #o000 #x48)
    4830    (def-x8664-opcode movswl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4831      #x0fbf #o300 0)
    4832    (def-x8664-opcode movswl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4833      #x0fbf #o000 0)
    4834    (def-x8664-opcode movswq ((:reg16 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4835      #x0fbf #o300 #x48)
    4836    (def-x8664-opcode movswq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4837      #x0fbf #o000 #x48)
    4838    (def-x8664-opcode movslq ((:reg32 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4839      #x63 #o300 #x48)
    4840    (def-x8664-opcode movslq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4841      #x63 #o000 #x48)
    4842 
    4843    ;; zero-extending MOVs
    4844    (def-x8664-opcode movzbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4845      #x0fb6 #o300 0)
    4846    (def-x8664-opcode movzbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4847      #x0fb6 #o000 0)
    4848    (def-x8664-opcode movzbw ((:reg8 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
    4849      #x0fb6 #o300 0 #x66)
    4850    (def-x8664-opcode movzbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4851      #x0fb6 #o300 0 #x66)
    4852    (def-x8664-opcode movzwl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
    4853      #x0fb7 #o300 0)
    4854    (def-x8664-opcode movzwl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4855      #x0fb7 #o000 0)
    4856    (def-x8664-opcode movzbq ((:reg8 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4857      #x0fb6 #o300 #x48)
    4858    (def-x8664-opcode movzbq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4859      #x0fb6 #o000 #x48)
    4860    (def-x8664-opcode movzwq ((:reg16 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
    4861      #x0fb7 #o300 #x48)
    4862    (def-x8664-opcode movzwq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4863      #x0fb7 #o000 #x48)
    4864 
    4865    ;; mul
    4866    (def-x8664-opcode mulq ((:reg64 :insert-modrm-rm))
    4867      #xf7 #o340 #x48)
    4868    (def-x8664-opcode mulq ((:anymem :insert-memory))
    4869      #xf7 #o040 #x48)
    4870 
    4871    (def-x8664-opcode mull ((:reg32 :insert-modrm-rm))
    4872      #xf7 #o340 #x00)
    4873    (def-x8664-opcode mull ((:anymem :insert-memory))
    4874      #xf7 #o040 #x00)
    4875 
    4876    (def-x8664-opcode mulw ((:reg16 :insert-modrm-rm))
    4877      #xf7 #o340 #x00 #x66)
    4878    (def-x8664-opcode mulw ((:anymem :insert-memory))
    4879      #xf7 #o040 #x00 #x66)
    4880 
    4881    (def-x8664-opcode mulb ((:reg8 :insert-modrm-rm))
    4882      #xf6 #o340 #x00)
    4883    (def-x8664-opcode mull ((:anymem :insert-memory))
    4884      #xf6 #o040 #x00)
    4885 
    4886    ;; neg
    4887    (def-x8664-opcode negq ((:reg64 :insert-modrm-rm))
    4888      #xf7 #o330 #x48)
    4889    (def-x8664-opcode negq ((:anymem :insert-memory))
    4890      #xf7 #o030 #x48)
    4891 
    4892    (def-x8664-opcode negl ((:reg32 :insert-modrm-rm))
    4893      #xf7 #o330 #x00)
    4894    (def-x8664-opcode negl ((:anymem :insert-memory))
    4895      #xf7 #o030 #x00)
    4896 
    4897    (def-x8664-opcode negw ((:reg16 :insert-modrm-rm))
    4898      #xf7 #o330 #x00 #x66)
    4899    (def-x8664-opcode negw ((:anymem :insert-memory))
    4900      #xf7 #o030 #x00 #x66)
    4901 
    4902    (def-x8664-opcode negb ((:reg8 :insert-modrm-rm))
    4903      #xf6 #o330 #x00)
    4904    (def-x8664-opcode negb ((:anymem :insert-memory))
    4905      #xf6 #o030 #x00)
    4906 
    4907    ;; nop
    4908    (def-x8664-opcode nop ()
    4909      #x90 nil nil)
    4910 
    4911    ;; not
    4912    (def-x8664-opcode notq ((:reg64 :insert-modrm-rm))
    4913      #xf7 #o320 #x48)
    4914    (def-x8664-opcode notq ((:anymem :insert-memory))
    4915      #xf7 #o020 #x48)
    4916    (def-x8664-opcode notl ((:reg32 :insert-modrm-rm))
    4917      #xf7 #o320 #x0)
    4918    (def-x8664-opcode notl ((:anymem :insert-memory))
    4919      #xf7 #o020 #x0)
    4920    (def-x8664-opcode notw ((:reg16 :insert-modrm-rm))
    4921      #xf7 #o320 #x0 #x66)
    4922    (def-x8664-opcode notw ((:anymem :insert-memory))
    4923      #xf7 #o020 #x0 #x66)
    4924    (def-x8664-opcode notb ((:reg8 :insert-modrm-rm))
    4925      #xf6 #o320 #x0)
    4926    (def-x8664-opcode notb ((:anymem :insert-memory))
    4927      #xf6 #o020 #x0)
    4928 
    4929    ;; or
    4930    (def-x8664-opcode orq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    4931      #x09 #o300 #x48)
    4932    (def-x8664-opcode orq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    4933      #x0b #o000 #x48)
    4934    (def-x8664-opcode orq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    4935      #x09 #x00 #x48)
    4936    (def-x8664-opcode orq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    4937      #x83 #o310 #x48)
    4938    (def-x8664-opcode orq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    4939      #x0d nil #x48)
    4940    (def-x8664-opcode orq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    4941      #x81 #o310 #x48)
    4942    (def-x8664-opcode orq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4943      #x83 #o010 #x48)
    4944    (def-x8664-opcode orq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    4945      #x81 #o010 #x48)
    4946 
    4947    (def-x8664-opcode orl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    4948      #x09 #o300 #x00)
    4949    (def-x8664-opcode orl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    4950      #x0b #o000 #x00)
    4951    (def-x8664-opcode orl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    4952      #x09 #x00 #x00)
    4953    (def-x8664-opcode orl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    4954      #x83 #o310 #x00)
    4955    (def-x8664-opcode orl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    4956      #x0d nil nil)
    4957    (def-x8664-opcode orl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    4958      #x81 #o310 #x00)
    4959    (def-x8664-opcode orl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4960      #x83 #o010 #x00)
    4961    (def-x8664-opcode orl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    4962      #x81 #o010 #x00)
    4963 
    4964    (def-x8664-opcode orw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    4965      #x09 #o300 #x00 #x66)
    4966    (def-x8664-opcode orw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    4967      #x0b #o000 #x00 #x66)
    4968    (def-x8664-opcode orw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    4969      #x09 #x00 #x00 #x66)
    4970    (def-x8664-opcode orw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    4971      #x83 #o310 #x00 #x66)
    4972    (def-x8664-opcode orw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    4973      #x0d nil nil #x66)
    4974    (def-x8664-opcode orw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    4975      #x81 #o310 #x00 #x66)
    4976    (def-x8664-opcode orw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4977      #x83 #o010 #x00 #x66)
    4978    (def-x8664-opcode orw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    4979      #x81 #o010 #x00 #x66)
    4980 
    4981    (def-x8664-opcode orb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    4982      #x08 #o300 #x00)
    4983    (def-x8664-opcode orb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    4984      #x0a #o000 #x00)
    4985    (def-x8664-opcode orb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    4986      #x08 #x00 #x00)
    4987    (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
    4988      #x0c nil nil)
    4989    (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    4990      #x80 #o310 #x00)
    4991    (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    4992      #x80 #o310 #x00)
    4993    (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    4994      #x80 #o010 #x00)
    4995 
    4996    ;; pop
    4997    (def-x8664-opcode popq ((:reg64 :insert-opcode-reg))
    4998      #x58 nil #x0)
    4999    (def-x8664-opcode popq ((:anymem :insert-memory))
    5000      #x8f #o000 #x0)
    5001    (def-x8664-opcode popw ((:reg16 :insert-opcode-reg))
    5002      #x58 nil #x0 #x66)
    5003    (def-x8664-opcode popw ((:anymem :insert-memory))
    5004      #x8f #o000 #x0 #x66)
    5005 
    5006    ;; popf
    5007    (def-x8664-opcode popfq ()
    5008      #x9d nil #x48)
    5009    (def-x8664-opcode popfl ()
    5010      #x9d nil nil)
    5011 
    5012    ;; push .  It's not clear how "pushw $imm16" is encoded.
    5013    (def-x8664-opcode pushq ((:reg64 :insert-opcode-reg))
    5014      #x50 nil #x0)
    5015    (def-x8664-opcode pushq ((:anymem :insert-memory))
    5016      #xff #o060 #x0)
    5017    (def-x8664-opcode pushq ((:imm8s :insert-imm8s))
    5018      #x6a nil nil)
    5019    (def-x8664-opcode pushq ((:imm32s :insert-imm32s))
    5020      #x68 nil nil)
    5021 
    5022    (def-x8664-opcode pushw ((:reg16 :insert-opcode-reg))
    5023      #x50 nil 0 #x66)
    5024    (def-x8664-opcode pushw ((:anymem :insert-memory))
    5025      #xff #o060 #x0 #x66)
    5026 
    5027    ;; pushf
    5028    (def-x8664-opcode pushfq ()
    5029      #x9c nil nil)
    5030    (def-x8664-opcode pushfw ()
    5031      #x9c nil nil #x66)
    5032 
    5033    ;; rcl.  Note that the :ShiftCount operand type only matches %cl.
    5034    (def-x8664-opcode rclq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
    5035      #xd1 #o320 #x48)
    5036    (def-x8664-opcode rclq ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5037      #xd1 #o020 #x48)
    5038    (def-x8664-opcode rclq ((:reg64 :insert-modrm-rm))
    5039      #xd1 #o320 #x48)
    5040    (def-x8664-opcode rclq ((:anymem :insert-memory))
    5041      #xd1 #o020 #x48)
    5042    (def-x8664-opcode rclq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    5043      #xc1 #o320 #x48)
    5044    (def-x8664-opcode rclq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
    5045      #xd3 #o320 #x48)
    5046  
    5047    (def-x8664-opcode rcll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
    5048      #xd1 #o320 #x0)
    5049    (def-x8664-opcode rcll ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5050      #xd1 #o020 #x0)
    5051    (def-x8664-opcode rcll ((:reg32 :insert-modrm-rm))
    5052      #xd1 #o320 #x0)
    5053    (def-x8664-opcode rcll ((:anymem :insert-memory))
    5054      #xd1 #o020 #x0)
    5055    (def-x8664-opcode rcll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    5056      #xc1 #o320 #x0)
    5057    (def-x8664-opcode rcll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
    5058      #xd3 #o320 #x0)
    5059 
    5060    (def-x8664-opcode rclw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
    5061      #xd1 #o320 #x0 #x66)
    5062    (def-x8664-opcode rclw ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5063      #xd1 #o020 #x0 #x66)
    5064    (def-x8664-opcode rclw ((:reg16 :insert-modrm-rm))
    5065      #xd1 #o320 #x0 #x66)
    5066    (def-x8664-opcode rclw ((:anymem :insert-memory))
    5067      #xd1 #o020 #x0 #x66)
    5068    (def-x8664-opcode rclw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    5069      #xc1 #o320 #x0 #x66)
    5070    (def-x8664-opcode rclw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
    5071      #xd3 #o320 #x0 #x66)
    5072 
    5073    (def-x8664-opcode rclb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
    5074      #xd0 #o320 #x0)
    5075    (def-x8664-opcode rclb ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5076      #xd0 #o020 #x0)
    5077    (def-x8664-opcode rclb ((:reg8 :insert-modrm-rm))
    5078      #xd0 #o320 #x0)
    5079    (def-x8664-opcode rclb ((:anymem :insert-memory))
    5080      #xd0 #o020 #x0)
    5081    (def-x8664-opcode rclb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    5082      #xc0 #o320 #x0)
    5083    (def-x8664-opcode rclb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
    5084      #xd2 #o320 #x0)
    5085 
    5086    ;; rcr
    5087    (def-x8664-opcode rcrq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
    5088      #xd1 #o330 #x48)
    5089    (def-x8664-opcode rcrq ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5090      #xd1 #o030 #x48)
    5091    (def-x8664-opcode rcrq ((:reg64 :insert-modrm-rm))
    5092      #xd1 #o330 #x48)
    5093    (def-x8664-opcode rcrq ((:anymem :insert-memory))
    5094      #xd1 #o030 #x48)
    5095    (def-x8664-opcode rcrq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    5096      #xc1 #o330 #x48)
    5097    (def-x8664-opcode rcrq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
    5098      #xd3 #o330 #x48)
    5099  
    5100    (def-x8664-opcode rcrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
    5101      #xd1 #o330 #x0)
    5102    (def-x8664-opcode rcrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5103      #xd1 #o030 #x0)
    5104    (def-x8664-opcode rcrl ((:reg32 :insert-modrm-rm))
    5105      #xd1 #o330 #x0)
    5106    (def-x8664-opcode rcrl ((:anymem :insert-memory))
    5107      #xd1 #o030 #x0)
    5108    (def-x8664-opcode rcrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    5109      #xc1 #o330 #x0)
    5110    (def-x8664-opcode rcrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
    5111      #xd3 #o330 #x0)
    5112 
    5113    (def-x8664-opcode rcrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
    5114      #xd1 #o330 #x0 #x66)
    5115    (def-x8664-opcode rcrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5116      #xd1 #o030 #x0 #x66)
    5117    (def-x8664-opcode rcrw ((:reg16 :insert-modrm-rm))
    5118      #xd1 #o330 #x0 #x66)
    5119    (def-x8664-opcode rcrw ((:anymem :insert-memory))
    5120      #xd1 #o030 #x0 #x66)
    5121    (def-x8664-opcode rcrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    5122      #xc1 #o330 #x0 #x66)
    5123    (def-x8664-opcode rcrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
    5124      #xd3 #o330 #x0 #x66)
    5125 
    5126    (def-x8664-opcode rcrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
    5127      #xd0 #o330 #x0)
    5128    (def-x8664-opcode rcrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5129      #xd0 #o030 #x0)
    5130    (def-x8664-opcode rcrb ((:reg8 :insert-modrm-rm))
    5131      #xd0 #o330 #x0)
    5132    (def-x8664-opcode rcrb ((:anymem :insert-memory))
    5133      #xd0 #o030 #x0)
    5134    (def-x8664-opcode rcrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    5135      #xc0 #o330 #x0)
    5136    (def-x8664-opcode rcrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
    5137      #xd2 #o330 #x0)
    5138 
    5139    ;; repe, repne.  These are really prefixes, that should
    5140    ;; only be used before string instructions.
    5141    (def-x8664-opcode repe ()
    5142      #xf3 nil nil)
    5143 
    5144    (def-x8664-opcode repne ()
    5145      #xf2 nil nil)
    5146 
    5147    ;; ret
    5148    (def-x8664-opcode ret ()
    5149      #xc3 nil nil)
    5150 
    5151    (def-x8664-opcode ret ((:imm16 :insert-imm16))
    5152      #xc2 nil nil)
    5153 
    5154    ;; rol
    5155    (def-x8664-opcode rolq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
    5156      #xd1 #o300 #x48)
    5157    (def-x8664-opcode rolq ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5158      #xd1 #o000 #x48)
    5159    (def-x8664-opcode rolq ((:reg64 :insert-modrm-rm))
    5160      #xd1 #o300 #x48)
    5161    (def-x8664-opcode rolq ((:anymem :insert-memory))
    5162      #xd1 #o000 #x48)
    5163    (def-x8664-opcode rolq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    5164      #xc1 #o300 #x48)
    5165    (def-x8664-opcode rolq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
    5166      #xd3 #o300 #x48)
    5167  
    5168    (def-x8664-opcode roll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
    5169      #xd1 #o300 #x0)
    5170    (def-x8664-opcode roll ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5171      #xd1 #o000 #x0)
    5172    (def-x8664-opcode roll ((:reg32 :insert-modrm-rm))
    5173      #xd1 #o300 #x0)
    5174    (def-x8664-opcode roll ((:anymem :insert-memory))
    5175      #xd1 #o000 #x0)
    5176    (def-x8664-opcode roll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    5177      #xc1 #o300 #x0)
    5178    (def-x8664-opcode roll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
    5179      #xd3 #o300 #x0)
    5180 
    5181    (def-x8664-opcode rolw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
    5182      #xd1 #o300 #x0 #x66)
    5183    (def-x8664-opcode rolw ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5184      #xd1 #o000 #x0 #x66)
    5185    (def-x8664-opcode rolw ((:reg16 :insert-modrm-rm))
    5186      #xd1 #o300 #x0 #x66)
    5187    (def-x8664-opcode rolw ((:anymem :insert-memory))
    5188      #xd1 #o000 #x0 #x66)
    5189    (def-x8664-opcode rolw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    5190      #xc1 #o300 #x0 #x66)
    5191    (def-x8664-opcode rolw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
    5192      #xd3 #o300 #x0 #x66)
    5193 
    5194    (def-x8664-opcode rolb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
    5195      #xd0 #o300 #x0)
    5196    (def-x8664-opcode rolb ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5197      #xd0 #o000 #x0)
    5198    (def-x8664-opcode rolb ((:reg8 :insert-modrm-rm))
    5199      #xd0 #o300 #x0)
    5200    (def-x8664-opcode rolb ((:anymem :insert-memory))
    5201      #xd0 #o000 #x0)
    5202    (def-x8664-opcode rolb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    5203      #xc0 #o300 #x0)
    5204    (def-x8664-opcode rolb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
    5205      #xd2 #o300 #x0)
    5206 
    5207    ;; ror
    5208    (def-x8664-opcode rorq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
    5209      #xd1 #o310 #x48)
    5210    (def-x8664-opcode rorq ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5211      #xd1 #o010 #x48)
    5212    (def-x8664-opcode rorq ((:reg64 :insert-modrm-rm))
    5213      #xd1 #o310 #x48)
    5214    (def-x8664-opcode rorq ((:anymem :insert-memory))
    5215      #xd1 #o010 #x48)
    5216    (def-x8664-opcode rorq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    5217      #xc1 #o310 #x48)
    5218    (def-x8664-opcode rorq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
    5219      #xd3 #o310 #x48)
    5220  
    5221    (def-x8664-opcode rorl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
    5222      #xd1 #o310 #x0)
    5223    (def-x8664-opcode rorl ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5224      #xd1 #o010 #x0)
    5225    (def-x8664-opcode rorl ((:reg32 :insert-modrm-rm))
    5226      #xd1 #o310 #x0)
    5227    (def-x8664-opcode rorl ((:anymem :insert-memory))
    5228      #xd1 #o010 #x0)
    5229    (def-x8664-opcode rorl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    5230      #xc1 #o310 #x0)
    5231    (def-x8664-opcode rorl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
    5232      #xd3 #o310 #x0)
    5233 
    5234    (def-x8664-opcode rorw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
    5235      #xd1 #o310 #x0 #x66)
    5236    (def-x8664-opcode rorw ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5237      #xd1 #o010 #x0 #x66)
    5238    (def-x8664-opcode rorw ((:reg16 :insert-modrm-rm))
    5239      #xd1 #o310 #x0 #x66)
    5240    (def-x8664-opcode rorw ((:anymem :insert-memory))
    5241      #xd1 #o010 #x0 #x66)
    5242    (def-x8664-opcode rorw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    5243      #xc1 #o310 #x0 #x66)
    5244    (def-x8664-opcode rorw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
    5245      #xd3 #o310 #x0 #x66)
    5246 
    5247    (def-x8664-opcode rorb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
    5248      #xd0 #o310 #x0)
    5249    (def-x8664-opcode rorb ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5250      #xd0 #o010 #x0)
    5251    (def-x8664-opcode rorb ((:reg8 :insert-modrm-rm))
    5252      #xd0 #o310 #x0)
    5253    (def-x8664-opcode rorb ((:anymem :insert-memory))
    5254      #xd0 #o010 #x0)
    5255    (def-x8664-opcode rorb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    5256      #xc0 #o310 #x0)
    5257    (def-x8664-opcode rorb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
    5258      #xd2 #o310 #x0)
    5259 
    5260    ;; sar
    5261    (def-x8664-opcode sarq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
    5262      #xd1 #o370 #x48)
    5263    (def-x8664-opcode sarq ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5264      #xd1 #o070 #x48)
    5265    (def-x8664-opcode sarq ((:reg64 :insert-modrm-rm))
    5266      #xd1 #o370 #x48)
    5267    (def-x8664-opcode sarq ((:anymem :insert-memory))
    5268      #xd1 #o070 #x48)
    5269    (def-x8664-opcode sarq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    5270      #xc1 #o370 #x48)
    5271    (def-x8664-opcode sarq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
    5272      #xd3 #o370 #x48)
    5273  
    5274    (def-x8664-opcode sarl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
    5275      #xd1 #o370 #x0)
    5276    (def-x8664-opcode sarl ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5277      #xd1 #o070 #x0)
    5278    (def-x8664-opcode sarl ((:reg32 :insert-modrm-rm))
    5279      #xd1 #o370 #x0)
    5280    (def-x8664-opcode sarl ((:anymem :insert-memory))
    5281      #xd1 #o070 #x0)
    5282    (def-x8664-opcode sarl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    5283      #xc1 #o370 #x0)
    5284    (def-x8664-opcode sarl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
    5285      #xd3 #o370 #x0)
    5286 
    5287    (def-x8664-opcode sarw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
    5288      #xd1 #o370 #x0 #x66)
    5289    (def-x8664-opcode sarw ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5290      #xd1 #o070 #x0 #x66)
    5291    (def-x8664-opcode sarw ((:reg16 :insert-modrm-rm))
    5292      #xd1 #o370 #x0 #x66)
    5293    (def-x8664-opcode sarw ((:anymem :insert-memory))
    5294      #xd1 #o070 #x0 #x66)
    5295    (def-x8664-opcode sarw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    5296      #xc1 #o370 #x0 #x66)
    5297    (def-x8664-opcode sarw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
    5298      #xd3 #o370 #x0 #x66)
    5299 
    5300    (def-x8664-opcode sarb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
    5301      #xd0 #o370 #x0)
    5302    (def-x8664-opcode sarb ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5303      #xd0 #o070 #x0)
    5304    (def-x8664-opcode sarb ((:reg8 :insert-modrm-rm))
    5305      #xd0 #o370 #x0)
    5306    (def-x8664-opcode sarb ((:anymem :insert-memory))
    5307      #xd0 #o070 #x0)
    5308    (def-x8664-opcode sarb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    5309      #xc0 #o370 #x0)
    5310    (def-x8664-opcode sarb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
    5311      #xd2 #o370 #x0)
    5312 
    5313    ;; sbb
    5314    (def-x8664-opcode sbbq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5315      #x19 #o300 #x48)
    5316    (def-x8664-opcode sbbq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    5317      #x1b #o000 #x48)
    5318    (def-x8664-opcode sbbq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5319      #x19 #x00 #x48)
    5320    (def-x8664-opcode sbbq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    5321      #x83 #o330 #x48)
    5322    (def-x8664-opcode sbbq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5323      #x1d nil #x48)
    5324    (def-x8664-opcode sbbq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    5325      #x81 #o330 #x48)
    5326    (def-x8664-opcode sbbq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5327      #x83 #o030 #x48)
    5328    (def-x8664-opcode sbbq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5329      #x81 #o030 #x48)
    5330 
    5331    (def-x8664-opcode sbbl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    5332      #x19 #o300 #x00)
    5333    (def-x8664-opcode sbbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    5334      #x1b #o000 #x00)
    5335    (def-x8664-opcode sbbl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    5336      #x19 #x00 #x00)
    5337    (def-x8664-opcode sbbl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    5338      #x83 #o330 #x00)
    5339    (def-x8664-opcode sbbl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5340      #x1d nil nil)
    5341    (def-x8664-opcode sbbl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    5342      #x81 #o330 #x00)
    5343    (def-x8664-opcode sbbl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5344      #x83 #o030 #x00)
    5345    (def-x8664-opcode sbbl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5346      #x81 #o030 #x00)
    5347 
    5348    (def-x8664-opcode sbbw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    5349      #x19 #o300 #x00 #x66)
    5350    (def-x8664-opcode sbbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    5351      #x1b #o000 #x00 #x66)
    5352    (def-x8664-opcode sbbw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    5353      #x19 #x00 #x00 #x66)
    5354    (def-x8664-opcode sbbw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    5355      #x83 #o330 #x00 #x66)
    5356    (def-x8664-opcode sbbw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    5357      #x1d nil nil #x66)
    5358    (def-x8664-opcode sbbw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    5359      #x81 #o330 #x00 #x66)
    5360    (def-x8664-opcode sbbw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5361      #x83 #o030 #x00 #x66)
    5362    (def-x8664-opcode sbbw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    5363      #x81 #o030 #x00 #x66)
    5364 
    5365    (def-x8664-opcode sbbb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    5366      #x18 #o300 #x00)
    5367    (def-x8664-opcode sbbb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    5368      #x1a #o000 #x00)
    5369    (def-x8664-opcode sbbb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    5370      #x18 #x00 #x00)
    5371    (def-x8664-opcode sbbb ((:imm8 :insert-imm8) (:acc :insert-nothing))
    5372      #x1c nil nil)
    5373    (def-x8664-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    5374      #x80 #o330 #x00)
    5375    (def-x8664-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    5376      #x80 #o330 #x00)
    5377    (def-x8664-opcode sbbb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5378      #x80 #o030 #x00)
    5379 
    5380    ;; scas
    5381    (def-x8664-opcode scasq ()
    5382      #xaf nil #x48)
    5383    (def-x8664-opcode scasl ()
    5384      #xaf nil nil)
    5385    (def-x8664-opcode scasw ()
    5386      #xaf nil nil #x66)
    5387    (def-x8664-opcode scasb ()
    5388      #xae nil nil)
    5389 
    5390 
    5391    ;; setcc
    5392    (def-x8664-opcode setcc ((:imm8 :insert-cc) (:reg8 :insert-modrm-rm))
    5393      #x0f90 #o300 0)     
    5394    (def-x8664-opcode seto ((:reg8 :insert-modrm-rm))
    5395      #x0f90 #o300 0)
    5396    (def-x8664-opcode seto ((:anymem :insert-memory))
    5397      #x0f90 #o000 0)
    5398    (def-x8664-opcode setno ((:reg8 :insert-modrm-rm))
    5399      #x0f91 #o300 0)
    5400    (def-x8664-opcode setno ((:anymem :insert-memory))
    5401      #x0f91 #o000 0)
    5402    (def-x8664-opcode setb ((:reg8 :insert-modrm-rm))
    5403      #x0f92 #o300 0)
    5404    (def-x8664-opcode setb ((:anymem :insert-memory))
    5405      #x0f92 #o000 0)
    5406    (def-x8664-opcode setc ((:reg8 :insert-modrm-rm))
    5407      #x0f92 #o300 0)
    5408    (def-x8664-opcode setc ((:anymem :insert-memory))
    5409      #x0f92 #o000 0)
    5410    (def-x8664-opcode setae ((:reg8 :insert-modrm-rm))
    5411      #x0f93 #o300 0)
    5412    (def-x8664-opcode setae ((:anymem :insert-memory))
    5413      #x0f93 #o000 0)
    5414    (def-x8664-opcode sete ((:reg8 :insert-modrm-rm))
    5415      #x0f94 #o300 0)
    5416    (def-x8664-opcode sete ((:anymem :insert-memory))
    5417      #x0f94 #o000 0)
    5418    (def-x8664-opcode setne ((:reg8 :insert-modrm-rm))
    5419      #x0f95 #o300 0)
    5420    (def-x8664-opcode setne ((:anymem :insert-memory))
    5421      #x0f95 #o000 0)
    5422    (def-x8664-opcode setbe ((:reg8 :insert-modrm-rm))
    5423      #x0f96 #o300 0)
    5424    (def-x8664-opcode setbe ((:anymem :insert-memory))
    5425      #x0f96 #o000 0)
    5426    (def-x8664-opcode seta ((:reg8 :insert-modrm-rm))
    5427      #x0f97 #o300 0)
    5428    (def-x8664-opcode seta ((:anymem :insert-memory))
    5429      #x0f97 #o000 0)
    5430    (def-x8664-opcode sets ((:reg8 :insert-modrm-rm))
    5431      #x0f98 #o300 0)
    5432    (def-x8664-opcode sets ((:anymem :insert-memory))
    5433      #x0f98 #o000 0)
    5434    (def-x8664-opcode setns ((:reg8 :insert-modrm-rm))
    5435      #x0f99 #o300 0)
    5436    (def-x8664-opcode setns ((:anymem :insert-memory))
    5437      #x0f99 #o000 0)
    5438    (def-x8664-opcode setpe ((:reg8 :insert-modrm-rm))
    5439      #x0f9a #o300 0)
    5440    (def-x8664-opcode setpe ((:anymem :insert-memory))
    5441      #x0f9a #o000 0)
    5442    (def-x8664-opcode setpo ((:reg8 :insert-modrm-rm))
    5443      #x0f9b #o300 0)
    5444    (def-x8664-opcode setpo ((:anymem :insert-memory))
    5445      #x0f9b #o000 0)
    5446    (def-x8664-opcode setl ((:reg8 :insert-modrm-rm))
    5447      #x0f9c #o300 0)
    5448    (def-x8664-opcode setl ((:anymem :insert-memory))
    5449      #x0f9c #o000 0)
    5450    (def-x8664-opcode setge ((:reg8 :insert-modrm-rm))
    5451      #x0f9d #o300 0)
    5452    (def-x8664-opcode setge ((:anymem :insert-memory))
    5453      #x0f9d #o000 0)
    5454    (def-x8664-opcode setle ((:reg8 :insert-modrm-rm))
    5455      #x0f9e #o300 0)
    5456    (def-x8664-opcode setle ((:anymem :insert-memory))
    5457      #x0f9e #o000 0)
    5458    (def-x8664-opcode setg ((:reg8 :insert-modrm-rm))
    5459      #x0f9f #o300 0)
    5460    (def-x8664-opcode setg ((:anymem :insert-memory))
    5461      #x0f9f #o000 0)
    5462 
    5463    ;; shl
    5464    (def-x8664-opcode shlq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
    5465      #xd1 #o340 #x48)
    5466    (def-x8664-opcode shlq ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5467      #xd1 #o040 #x48)
    5468    (def-x8664-opcode shlq ((:reg64 :insert-modrm-rm))
    5469      #xd1 #o340 #x48)
    5470    (def-x8664-opcode shlq ((:anymem :insert-memory))
    5471      #xd1 #o040 #x48)
    5472    (def-x8664-opcode shlq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    5473      #xc1 #o340 #x48)
    5474    (def-x8664-opcode shlq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
    5475      #xd3 #o340 #x48)
    5476  
    5477    (def-x8664-opcode shll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
    5478      #xd1 #o340 #x0)
    5479    (def-x8664-opcode shll ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5480      #xd1 #o040 #x0)
    5481    (def-x8664-opcode shll ((:reg32 :insert-modrm-rm))
    5482      #xd1 #o340 #x0)
    5483    (def-x8664-opcode shll ((:anymem :insert-memory))
    5484      #xd1 #o040 #x0)
    5485    (def-x8664-opcode shll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    5486      #xc1 #o340 #x0)
    5487    (def-x8664-opcode shll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
    5488      #xd3 #o340 #x0)
    5489 
    5490    (def-x8664-opcode shlw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
    5491      #xd1 #o340 #x0 #x66)
    5492    (def-x8664-opcode shlw ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5493      #xd1 #o040 #x0 #x66)
    5494    (def-x8664-opcode shlw ((:reg16 :insert-modrm-rm))
    5495      #xd1 #o340 #x0 #x66)
    5496    (def-x8664-opcode shlw ((:anymem :insert-memory))
    5497      #xd1 #o040 #x0 #x66)
    5498    (def-x8664-opcode shlw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    5499      #xc1 #o340 #x0 #x66)
    5500    (def-x8664-opcode shlw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
    5501      #xd3 #o340 #x0 #x66)
    5502 
    5503    (def-x8664-opcode shlb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
    5504      #xd0 #o340 #x0)
    5505    (def-x8664-opcode shlb ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5506      #xd0 #o040 #x0)
    5507    (def-x8664-opcode shlb ((:reg8 :insert-modrm-rm))
    5508      #xd0 #o340 #x0)
    5509    (def-x8664-opcode shlb ((:anymem :insert-memory))
    5510      #xd0 #o040 #x0)
    5511    (def-x8664-opcode shlb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    5512      #xc0 #o340 #x0)
    5513    (def-x8664-opcode shlb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
    5514      #xd2 #o340 #x0)
    5515 
    5516    ;; shld
    5517    (def-x8664-opcode shldq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5518      #x0fa4 #o300 #x48)
    5519    (def-x8664-opcode shldq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5520      #x0fa4 #o000 #x48)
    5521    (def-x8664-opcode shldq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5522      #x0fa5 #o300 #x48)
    5523    (def-x8664-opcode shldq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5524      #x0fa5 #o000 #x48)
    5525    (def-x8664-opcode shldq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5526      #x0fa5 #o300 #x48)
    5527    (def-x8664-opcode shldq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5528      #x0fa5 #o000 #x48)
    5529 
    5530    (def-x8664-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5531      #x0fa4 #o300 #x0)
    5532    (def-x8664-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5533      #x0fa4 #o000 #x0)
    5534    (def-x8664-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5535      #x0fa5 #o300 #x0)
    5536    (def-x8664-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5537      #x0fa5 #o000 #x0)
    5538    (def-x8664-opcode shldl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5539      #x0fa5 #o300 #x0)
    5540    (def-x8664-opcode shldl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5541      #x0fa5 #o000 #x0)
    5542 
    5543    (def-x8664-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5544      #x0fa4 #o300 #x0 #x66)
    5545    (def-x8664-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5546      #x0fa4 #o000 #x0 #x66)
    5547    (def-x8664-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5548      #x0fa5 #o300 #x0 #x66)
    5549    (def-x8664-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5550      #x0fa5 #o000 #x0 #x66)
    5551    (def-x8664-opcode shldw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5552      #x0fa5 #o300 #x0 #x66)
    5553    (def-x8664-opcode shldw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5554      #x0fa5 #o000 #x0 #x66)
    5555 
    5556    ;; shr
    5557    (def-x8664-opcode shrq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
    5558      #xd1 #o350 #x48)
    5559    (def-x8664-opcode shrq ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5560      #xd1 #o050 #x48)
    5561    (def-x8664-opcode shrq ((:reg64 :insert-modrm-rm))
    5562      #xd1 #o350 #x48)
    5563    (def-x8664-opcode shrq ((:anymem :insert-memory))
    5564      #xd1 #o050 #x48)
    5565    (def-x8664-opcode shrq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
    5566      #xc1 #o350 #x48)
    5567    (def-x8664-opcode shrq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
    5568      #xd3 #o350 #x48)
    5569  
    5570    (def-x8664-opcode shrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
    5571      #xd1 #o350 #x0)
    5572    (def-x8664-opcode shrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5573      #xd1 #o050 #x0)
    5574    (def-x8664-opcode shrl ((:reg32 :insert-modrm-rm))
    5575      #xd1 #o350 #x0)
    5576    (def-x8664-opcode shrl ((:anymem :insert-memory))
    5577      #xd1 #o050 #x0)
    5578    (def-x8664-opcode shrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
    5579      #xc1 #o350 #x0)
    5580    (def-x8664-opcode shrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
    5581      #xd3 #o350 #x0)
    5582 
    5583    (def-x8664-opcode shrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
    5584      #xd1 #o350 #x0 #x66)
    5585    (def-x8664-opcode shrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5586      #xd1 #o050 #x0 #x66)
    5587    (def-x8664-opcode shrw ((:reg16 :insert-modrm-rm))
    5588      #xd1 #o350 #x0 #x66)
    5589    (def-x8664-opcode shrw ((:anymem :insert-memory))
    5590      #xd1 #o050 #x0 #x66)
    5591    (def-x8664-opcode shrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
    5592      #xc1 #o350 #x0 #x66)
    5593    (def-x8664-opcode shrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
    5594      #xd3 #o350 #x0 #x66)
    5595 
    5596    (def-x8664-opcode shrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
    5597      #xd0 #o350 #x0)
    5598    (def-x8664-opcode shrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
    5599      #xd0 #o050 #x0)
    5600    (def-x8664-opcode shrb ((:reg8 :insert-modrm-rm))
    5601      #xd0 #o350 #x0)
    5602    (def-x8664-opcode shrb ((:anymem :insert-memory))
    5603      #xd0 #o050 #x0)
    5604    (def-x8664-opcode shrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
    5605      #xc0 #o350 #x0)
    5606    (def-x8664-opcode shrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
    5607      #xd2 #o350 #x0)
    5608 
    5609    ;; shrd
    5610    (def-x8664-opcode shrdq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5611      #x0fac #o300 #x48)
    5612    (def-x8664-opcode shrdq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5613      #x0fac #o000 #x48)
    5614    (def-x8664-opcode shrdq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5615      #x0fad #o300 #x48)
    5616    (def-x8664-opcode shrdq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5617      #x0fad #o000 #x48)
    5618    (def-x8664-opcode shrdq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5619      #x0fad #o300 #x48)
    5620    (def-x8664-opcode shrdq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5621      #x0fad #o000 #x48)
    5622 
    5623    (def-x8664-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5624      #x0fac #o300 #x0)
    5625    (def-x8664-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5626      #x0fac #o000 #x0)
    5627    (def-x8664-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5628      #x0fad #o300 #x0)
    5629    (def-x8664-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5630      #x0fad #o000 #x0)
    5631    (def-x8664-opcode shrdl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5632      #x0fad #o300 #x0)
    5633    (def-x8664-opcode shrdl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5634      #x0fad #o000 #x0)
    5635 
    5636    (def-x8664-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5637      #x0fac #o300 #x0 #x66)
    5638    (def-x8664-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5639      #x0fac #o000 #x0 #x66)
    5640    (def-x8664-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5641      #x0fad #o300 #x0 #x66)
    5642    (def-x8664-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5643      #x0fad #o000 #x0 #x66)
    5644    (def-x8664-opcode shrdw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5645      #x0fad #o300 #x0 #x66)
    5646    (def-x8664-opcode shrdw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5647      #x0fad #o000 #x0 #x66)
    5648 
    5649    ;; stc
    5650    (def-x8664-opcode stc ()
    5651      #xf9 nil nil)
    5652 
    5653    ;; std
    5654    (def-x8664-opcode std ()
    5655      #xfd nil nil)
    5656 
    5657    ;; sub
    5658    (def-x8664-opcode subq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5659      #x29 #o300 #x48)
    5660    (def-x8664-opcode subq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    5661      #x2b #o000 #x48)
    5662    (def-x8664-opcode subq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5663      #x29 #x00 #x48)
    5664    (def-x8664-opcode subq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    5665      #x83 #o350 #x48)
    5666    (def-x8664-opcode subq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5667      #x2d nil #x48)
    5668    (def-x8664-opcode subq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    5669      #x81 #o350 #x48)
    5670    (def-x8664-opcode subq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5671      #x83 #o050 #x48)
    5672    (def-x8664-opcode subq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5673      #x81 #o050 #x48)
    5674 
    5675    (def-x8664-opcode subl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    5676      #x29 #o300 #x00)
    5677    (def-x8664-opcode subl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    5678      #x2b #o000 #x00)
    5679    (def-x8664-opcode subl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    5680      #x29 #x00 #x00)
    5681    (def-x8664-opcode subl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    5682      #x83 #o350 #x00)
    5683    (def-x8664-opcode subl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5684      #x2d nil nil)
    5685    (def-x8664-opcode subl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    5686      #x81 #o350 #x00)
    5687    (def-x8664-opcode subl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5688      #x83 #o050 #x00)
    5689    (def-x8664-opcode subl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5690      #x81 #o050 #x00)
    5691 
    5692    (def-x8664-opcode subw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    5693      #x29 #o300 #x00 #x66)
    5694    (def-x8664-opcode subw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    5695      #x2b #o000 #x00 #x66)
    5696    (def-x8664-opcode subw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    5697      #x29 #x00 #x00 #x66)
    5698    (def-x8664-opcode subw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    5699      #x83 #o350 #x00 #x66)
    5700    (def-x8664-opcode subw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    5701      #x2d nil nil #x66)
    5702    (def-x8664-opcode subw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    5703      #x81 #o350 #x00 #x66)
    5704    (def-x8664-opcode subw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5705      #x83 #o050 #x00 #x66)
    5706    (def-x8664-opcode subw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    5707      #x81 #o050 #x00 #x66)
    5708 
    5709    (def-x8664-opcode subb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    5710      #x28 #o300 #x00)
    5711    (def-x8664-opcode subb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    5712      #x2a #o000 #x00)
    5713    (def-x8664-opcode subb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    5714      #x2a #x00 #x00)
    5715    (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
    5716      #x2c nil nil)
    5717    (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    5718      #x80 #o350 #x00)
    5719    (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    5720      #x80 #o350 #x00)
    5721    (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5722      #x80 #o050 #x00)
    5723 
    5724    ;; syscall
    5725    (def-x8664-opcode syscall ()
    5726      #x0f0f nil nil)
    5727 
    5728    ;; test
    5729    (def-x8664-opcode testq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5730      #x85 #o300 #x48)
    5731    (def-x8664-opcode testq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5732      #x85 #o000 #x48)
    5733    (def-x8664-opcode testq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    5734      #x87 #o000 #x48)
    5735    (def-x8664-opcode testq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5736      #xa9 nil #x48)
    5737    (def-x8664-opcode testq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    5738      #xf7 #o300 #x48)
    5739    (def-x8664-opcode testq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5740      #xf7 #o000 #x48)
    5741 
    5742    (def-x8664-opcode testl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    5743      #x85 #o300 #x00)
    5744    (def-x8664-opcode testl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    5745      #x85 #o000 #x00)
    5746    (def-x8664-opcode testl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    5747      #x87 #o000 #x00)
    5748    (def-x8664-opcode testl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5749      #xa9 nil #x00)
    5750    (def-x8664-opcode testl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    5751      #xf7 #o300 #x00)
    5752    (def-x8664-opcode testl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5753      #xf7 #o000 #x00)
    5754 
    5755 
    5756    (def-x8664-opcode testw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    5757      #x85 #o300 #x00 #x66)
    5758    (def-x8664-opcode testw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    5759      #x85 #o000 #x00 #x66)
    5760    (def-x8664-opcode testw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    5761      #x87 #o000 #x00 #x66)
    5762    (def-x8664-opcode testw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    5763      #xa9 nil #x00 #x66)
    5764    (def-x8664-opcode testw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    5765      #xf7 #o300 #x00 #x66)
    5766    (def-x8664-opcode testw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    5767      #xf7 #o000 #x00 #x66)
    5768 
    5769 
    5770    (def-x8664-opcode testb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    5771      #x84 #o300 #x00)
    5772    (def-x8664-opcode testb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    5773      #x84 #o000 #x00)
    5774    (def-x8664-opcode testb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    5775      #x86 #o000 #x00)
    5776    (def-x8664-opcode testb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
    5777      #xa8 nil #x00)
    5778    (def-x8664-opcode testb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    5779      #xf6 #o300 #x00)
    5780    (def-x8664-opcode testb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5781      #xf6 #o000 #x00)
    5782 
    5783    ;; ud2a (not to be confused with all of the other undefined/accidental
    5784    ;; instructions) is "officially undefined".
    5785    (def-x8664-opcode ud2a ()
    5786      #x0f0b nil nil)
    5787 
    5788    (def-x8664-opcode ud2b ()
    5789      #x0fb9 nil nil)
    5790 
    5791    ;; xadd
    5792    (def-x8664-opcode xaddq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5793      #x0fc1 #o300 #x48)
    5794    (def-x8664-opcode xaddq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5795      #x0fc1 #o000 #x48)
    5796 
    5797    (def-x8664-opcode xaddl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    5798      #x0fc1 #o300 #x00)
    5799    (def-x8664-opcode xaddl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    5800      #x0fc1 #o000 #x00)
    5801 
    5802    (def-x8664-opcode xaddw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    5803      #x0fc1 #o300 #x00 #x66)
    5804    (def-x8664-opcode xaddw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    5805      #x0fc1 #o000 #x00 #x66)
    5806 
    5807    (def-x8664-opcode xaddb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    5808      #x0fc0 #o300 #x00)
    5809    (def-x8664-opcode xaddb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    5810      #x0fc0 #o000 #x00)
    5811 
    5812    ;; xchg
    5813    ;; Allegedly, using the opcode #x9x to implement "(xchg (% eax) (% eax))"
    5814    ;; doesn't zero-extend eax to rax on x86-64.  (So don't special-case
    5815    ;; :acc as source or destination, and use #x86 and a modrm byte in all cases.)
    5816    (def-x8664-opcode xchgq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5817      #x87 #o300 #x48)
    5818    (def-x8664-opcode xchgq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5819      #x87 #o000 #x48)
    5820    (def-x8664-opcode xchgq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    5821      #x89 #o000 #x48)
    5822 
    5823    (def-x8664-opcode xchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    5824      #x87 #o300 #x00)
    5825    (def-x8664-opcode xchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    5826      #x87 #o000 #x00)
    5827    (def-x8664-opcode xchgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    5828      #x89 #o000 #x00)
    5829 
    5830    (def-x8664-opcode xchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    5831      #x87 #o300 #x00 #x66)
    5832    (def-x8664-opcode xchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    5833      #x87 #o000 #x00 #x66)
    5834    (def-x8664-opcode xchgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    5835      #x89 #o000 #x00 #x66)
    5836 
    5837    (def-x8664-opcode xchgl ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    5838      #x86 #o300 #x00)
    5839    (def-x8664-opcode xchgl ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    5840      #x86 #o000 #x00)
    5841    (def-x8664-opcode xchgl ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    5842      #x88 #o000 #x00)
    5843 
    5844    ;; xlat
    5845 
    5846    (def-x8664-opcode xlatb ()
    5847      #xd7 nil nil)
    5848 
    5849    ;; xor
    5850    (def-x8664-opcode xorq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
    5851      #x31 #o300 #x48)
    5852    (def-x8664-opcode xorq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    5853      #x33 #o000 #x48)
    5854    (def-x8664-opcode xorq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
    5855      #x31 #x00 #x48)
    5856    (def-x8664-opcode xorq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
    5857      #x83 #o360 #x48)
    5858    (def-x8664-opcode xorq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5859      #x35 nil #x48)
    5860    (def-x8664-opcode xorq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
    5861      #x81 #o360 #x48)
    5862    (def-x8664-opcode xorq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5863      #x83 #o060 #x48)
    5864    (def-x8664-opcode xorq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5865      #x81 #o060 #x48)
    5866 
    5867    (def-x8664-opcode xorl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
    5868      #x31 #o300 #x00)
    5869    (def-x8664-opcode xorl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    5870      #x33 #o000 #x00)
    5871    (def-x8664-opcode xorl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
    5872      #x31 #x00 #x00)
    5873    (def-x8664-opcode xorl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
    5874      #x83 #o360 #x00)
    5875    (def-x8664-opcode xorl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
    5876      #x35 nil nil)
    5877    (def-x8664-opcode xorl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
    5878      #x81 #o360 #x00)
    5879    (def-x8664-opcode xorl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5880      #x83 #o060 #x00)
    5881    (def-x8664-opcode xorl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
    5882      #x81 #o060 #x00)
    5883 
    5884    (def-x8664-opcode xorw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
    5885      #x31 #o300 #x00 #x66)
    5886    (def-x8664-opcode xorw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
    5887      #x33 #o000 #x00 #x66)
    5888    (def-x8664-opcode xorw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
    5889      #x31 #x00 #x00 #x66)
    5890    (def-x8664-opcode xorw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
    5891      #x83 #o360 #x00 #x66)
    5892    (def-x8664-opcode xorw ((:imm16 :insert-imm16) (:acc :insert-nothing))
    5893      #x35 nil nil #x66)
    5894    (def-x8664-opcode xorw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
    5895      #x81 #o360 #x00 #x66)
    5896    (def-x8664-opcode xorw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5897      #x83 #o060 #x00 #x66)
    5898    (def-x8664-opcode xorw ((:imm16 :insert-imm16) (:anymem :insert-memory))
    5899      #x81 #o060 #x00 #x66)
    5900 
    5901    (def-x8664-opcode xorb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
    5902      #x30 #o300 #x00)
    5903    (def-x8664-opcode xorb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
    5904      #x32 #o000 #x00)
    5905    (def-x8664-opcode xorb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
    5906      #x30 #x00 #x00)
    5907    (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
    5908      #x34 nil nil)
    5909    (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    5910      #x80 #o360 #x00)
    5911    (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
    5912      #x80 #o360 #x00)
    5913    (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
    5914      #x80 #o060 #x00)
    5915 
    5916    ;; fxsave
    5917    (def-x8664-opcode fxsaveq ((:anymem :insert-memory))
    5918      #x0fae #o000 0)
    5919 
    5920    ;; fxrstor
    5921    (def-x8664-opcode fxrstor ((:anymem :insert-memory))
    5922      #x0fae #o010 0)
    5923 
    5924    ;; clflush
    5925    (def-x8664-opcode clflush ((:anymem :insert-memory))
    5926      #x0fae #o070 0)
    5927 
    5928    ;; lfence
    5929    (def-x8664-opcode lfence ()
    5930      #x0fae #xe8 nil)
    5931 
    5932    ;; mfence
    5933    (def-x8664-opcode mfence ()
    5934      #x0fae #xf0 nil)
    5935    
    5936    ;; pause
    5937    (def-x8664-opcode pause ()
    5938      #xf390 nil nil)
    5939 
    5940    ;; I don't want to have to define all mmx/sse/sse2 instructions at the
    5941    ;; moment, but it wouldn't hurt to define those that the lisp is
    5942    ;; likely to use.
    5943 
    5944    ;; Useful mmx/sse2 instructions, other than movd/movq:
    5945 
    5946    ;; emms
    5947    (def-x8664-opcode emms ()
    5948      #x0f77 nil nil)
    5949 
    5950    ;; addsd
    5951    (def-x8664-opcode addsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5952      #x0f58 #o000 #x0 #xf2)
    5953    (def-x8664-opcode addsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5954      #x0f58 #o300 #x0 #xf2)
    5955    
    5956    ;; addss
    5957    (def-x8664-opcode addss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5958      #x0f58 #o000 #x0 #xf3)
    5959    (def-x8664-opcode addss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5960      #x0f58 #o300 #x0 #xf3)
    5961 
    5962    ;; subsd
    5963    (def-x8664-opcode subsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5964      #x0f5c #o000 #x0 #xf2)
    5965    (def-x8664-opcode subsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5966      #x0f5c #o300 #x0 #xf2)
    5967 
    5968    ;; subss
    5969    (def-x8664-opcode subss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5970      #x0f5c #o000 #x0 #xf3)
    5971    (def-x8664-opcode subss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5972      #x0f5c #o300 #x0 #xf3)
    5973 
    5974    ;; movapd
    5975    (def-x8664-opcode movapd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5976      #x0f28 #o300 #x0 #x66)
    5977    (def-x8664-opcode movapd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5978      #x0f28 #o000 #x0 #x66)
    5979    (def-x8664-opcode movapd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
    5980      #x0f29 #o000 #x0 #x66)
    5981    
    5982    ;; mulsd
    5983    (def-x8664-opcode mulsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5984      #x0f59 #o000 #x0 #xf2)
    5985    (def-x8664-opcode mulsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5986      #x0f59 #o300 #x0 #xf2)
    5987 
    5988    ;; mulss
    5989    (def-x8664-opcode mulss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5990      #x0f59 #o000 #x0 #xf3)
    5991    (def-x8664-opcode mulss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5992      #x0f59 #o300 #x0 #xf3)
    5993 
    5994    ;; divsd
    5995    (def-x8664-opcode divsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    5996      #x0f5e #o000 #x0 #xf2)
    5997    (def-x8664-opcode divsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    5998      #x0f5e #o300 #x0 #xf2)
    5999 
    6000    ;; divss
    6001    (def-x8664-opcode divss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6002      #x0f5e #o000 #x0 #xf3)
    6003    (def-x8664-opcode divss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6004      #x0f5e #o300 #x0 #xf3)
    6005 
    6006 
    6007    ;; sqrtsd
    6008    (def-x8664-opcode sqrtsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6009      #x0f51 #o000 #x0 #xf2)
    6010    (def-x8664-opcode sqrtsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6011      #x0f51 #o300 #x0 #xf2)
    6012 
    6013    ;; sqrtss
    6014    (def-x8664-opcode sqrtss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6015      #x0f51 #o000 #x0 #xf3)
    6016    (def-x8664-opcode sqrtss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6017      #x0f51 #o300 #x0 #xf3)
    6018    
    6019    ;; comisd
    6020    (def-x8664-opcode comisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6021      #x0f2f #o000 #x0 #x66)
    6022    (def-x8664-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6023      #x0f2f #o300 #x0 #x66)
    6024 
    6025    ;; ucomisd
    6026    (def-x8664-opcode ucomisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6027      #x0f2e #o000 #x0 #x66)
    6028    (def-x8664-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6029      #x0f2e #o300 #x0 u#x66)
    6030 
    6031    
    6032       ;; comiss
    6033    (def-x8664-opcode comiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6034      #x0f2f #o000 #x0)
    6035    (def-x8664-opcode comiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6036      #x0f2f #o300 #x0)
    6037 
    6038    ;; ucomiss
    6039    (def-x8664-opcode ucomiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6040      #x0f2e #o000 #x0)
    6041    (def-x8664-opcode ucomiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6042      #x0f2e #o300 #x0)
    6043 
    6044    ;; movsd
    6045    (def-x8664-opcode movsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6046      #x0f10 #o300 #x0 #xf2)
    6047    (def-x8664-opcode movsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6048      #x0f10 #o300 #x0 #xf2)
    6049    (def-x8664-opcode movsd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
    6050      #x0f11 #o000 #x0 #xf2)
    6051 
    6052    
    6053 
    6054    ;; movss
    6055    (def-x8664-opcode movss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6056      #x0f10 #o300 #x0 #xf3)
    6057    (def-x8664-opcode movss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6058      #x0f10 #o300 #x0 #xf3)
    6059    (def-x8664-opcode movss ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
    6060      #x0f11 #o000 #x0 #xf3)
    6061 
    6062    
    6063    ;;; cvtsd2si.  This does rounding (as opposed to truncation).
    6064    (def-x8664-opcode cvtsd2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
    6065      #x0f2d #o300 #x48 #xf2)
    6066    (def-x8664-opcode cvtsd2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    6067      #x0f2d #o000 #x48 #xf2)
    6068    (def-x8664-opcode cvtsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
    6069      #x0f2d #o300 #x00 #xf2)
    6070    (def-x8664-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    6071      #x0f2d #o000 #x00 #xf2)
    6072 
    6073    ;;; cvtss2si.  This does rounding (as opposed to truncation).
    6074    (def-x8664-opcode cvtss2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
    6075      #x0f2d #o300 #x48 #xf3)
    6076    (def-x8664-opcode cvtss2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    6077      #x0f2d #o000 #x48 #xf3)
    6078    (def-x8664-opcode cvtss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
    6079      #x0f2d #o300 #x00 #xf3)
    6080    (def-x8664-opcode cvtss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    6081      #x0f2d #o000 #x00 #xf3)
    6082    
    6083    ;;; cvttsd2si.  This does truncation (as opposed to rounding).
    6084    (def-x8664-opcode cvttsd2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
    6085      #x0f2c #o300 #x48 #xf2)
    6086    (def-x8664-opcode cvttsd2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    6087      #x0f2c #o000 #x48 #xf2)
    6088    (def-x8664-opcode cvttsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
    6089      #x0f2c #o300 #x00 #xf2)
    6090    (def-x8664-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    6091      #x0f2c #o000 #x00 #xf2)
    6092 
    6093    ;;; cvttss2si.  This does truncation (as opposed to rounding).
    6094    (def-x8664-opcode cvttss2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
    6095      #x0f2c #o300 #x48 #xf3)
    6096    (def-x8664-opcode cvttss2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
    6097      #x0f2c #o000 #x48 #xf3)
    6098    (def-x8664-opcode cvttss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
    6099      #x0f2c #o300 #x00 #xf3)
    6100    (def-x8664-opcode cvttss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
    6101      #x0f2c #o000 #x00 #xf3)
    6102 
    6103    ;; cvtsi2sd
    6104    (def-x8664-opcode cvtsi2sdq ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    6105      #x0f2a #o300 #x48 #xf2)
    6106    (def-x8664-opcode cvtsi2sdq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6107      #x0f2a #o000 #x48 #xf2)
    6108    (def-x8664-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    6109      #x0f2a #o300 #x00 #xf2)
    6110    (def-x8664-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6111      #x0f2a #o000 #x00 #xf2)
    6112    
    6113    ;; cvtsd2ss
    6114    (def-x8664-opcode cvtsd2ss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6115      #x0f5a #o300 #x0 #xf2)
    6116    (def-x8664-opcode cvtsd2ss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6117      #x0f5a #o000 #x0 #xf2)
    6118 
    6119    ;; cvtsi2sd
    6120    (def-x8664-opcode cvtsi2sdq ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    6121      #x0f2a #o300 #x48 #xf2)
    6122    (def-x8664-opcode cvtsi2sdq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6123      #x0f2a #o000 #x48 #xf2)
    6124    (def-x8664-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    6125      #x0f2a #o300 #x00 #xf2)
    6126    (def-x8664-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6127      #x0f2a #o000 #x00 #xf2)
    6128 
    6129    ;; cvtsi2ss
    6130    (def-x8664-opcode cvtsi2ssq ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    6131      #x0f2a #o300 #x48 #xf3)
    6132    (def-x8664-opcode cvtsi2ssq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6133      #x0f2a #o000 #x48 #xf3)
    6134    (def-x8664-opcode cvtsi2ssl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
    6135      #x0f2a #o300 #x00 #xf3)
    6136    (def-x8664-opcode cvtsi2ssl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6137      #x0f2a #o000 #x00 #xf3)
    6138 
    6139    ;;; cvtss2sd
    6140    (def-x8664-opcode cvtss2sd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
    6141      #x0f5a #o300 #x0 #xf3)
    6142    (def-x8664-opcode cvtss2sd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    6143      #x0f5a #o000 #x0 #xf3)
    6144    
    6145    ;; pand
    6146    (def-x8664-opcode pand ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
    6147      #x0fdb #o300 #x0)
    6148    (def-x8664-opcode pand ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    6149      #x0fdb #o000 #x0)
    6150    (def-x8664-opcode pand ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
    6151      #x0fef #o300 #x0 #x66)
    6152    (def-x8664-opcode pand ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
    6153      #x0fdb #o000 #x0 #x66)
    6154    
    6155    ;; pandn
    6156    (def-x8664-opcode pandn ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
    6157      #x0fdf #o300 #x0)
    6158    (def-x8664-opcode pandn ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    6159      #x0fdf #o000 #x0)
    6160    (def-x8664-opcode pandn ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
    6161      #x0fdf #o300 #x0 #x66)
    6162    (def-x8664-opcode pandn ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
    6163      #x0fdf #o000 #x0 #x66)
    6164 
    6165    ;; por
    6166    (def-x8664-opcode por ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
    6167      #x0feb #o300 #x0)
    6168    (def-x8664-opcode por ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    6169      #x0feb #o000 #x0)
    6170    (def-x8664-opcode por ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
    6171      #x0feb #o300 #x0 #x66)
    6172    (def-x8664-opcode por ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
    6173      #x0feb #o000 #x0 #x66)
    6174 
    6175    ;; pxor
    6176    (def-x8664-opcode pxor ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
    6177      #x0fef #o300 #x0)
    6178    (def-x8664-opcode pxor ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    6179      #x0fef #o000 #x0)
    6180    (def-x8664-opcode pxor ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
    6181      #x0fef #o300 #x0 #x66)
    6182    (def-x8664-opcode pxor ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
    6183      #x0fef #o000 #x0 #x66)
    6184 
    6185    ;; psllq
    6186    (def-x8664-opcode psllq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
    6187      #x0ff3 #o300 #x0)
    6188    (def-x8664-opcode psllq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    6189      #x0ff3 #o000 #x0)
    6190    (def-x8664-opcode psllq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
    6191      #x0ff3 #o300 #x0 #x66)
    6192    (def-x8664-opcode psllq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
    6193      #x0ff3 #o000 #x0 #x66)
    6194    (def-x8664-opcode psllq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
    6195      #x0f73 #o360 #o0 #x66)
    6196 
    6197    ;; psllw
    6198    
    6199    ;; pslld
    6200 
    6201    ;; pslldq
    6202    (def-x8664-opcode pslldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
    6203      #x0f73 #o370 #x0 #x66)
    6204    
    6205    ;; psrlq
    6206    (def-x8664-opcode psrlq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
    6207      #x0fd3 #o300 #x0)
    6208    (def-x8664-opcode psrlq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
    6209      #x0fd3 #o000 #x0)
    6210    (def-x8664-opcode psrlq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
    6211      #x0fd3 #o300 #x0 #x66)
    6212    (def-x8664-opcode psrlq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
    6213      #x0fd3 #o000 #x0 #x66)
    6214    (def-x8664-opcode psrlq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
    6215      #x0f73 #o320 #o0 #x66)
    6216 
    6217    ;; psrld
    6218 
    6219    ;; psrldq
    6220    (def-x8664-opcode psrldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
    6221      #x0f73 #o330 #x0 #x66)
    6222    
    6223    ;; psrlw
    6224    
    6225    ;;; End of list of useful mmx instructions
    6226    (def-x8664-opcode ldmxcsr ((:anymem :insert-memory))
    6227      #x0fae #o020 nil)
    6228 
    6229    (def-x8664-opcode stmxcsr ((:anymem :insert-memory))
    6230      #x0fae #o030 nil)
    6231 
    6232    ;; UUOs.  Expect lots more, some of which may take pseudo-operands.
    6233    (def-x8664-opcode uuo-error-slot-unbound ((:reg64 :insert-opcode-reg4)
    6234                                              (:reg64 :insert-reg4-pseudo-rm-high)
    6235                                              (:reg64 :insert-reg4-pseudo-rm-low))
    6236      #xcd70 0 nil)
    6237 
    6238    ;;; DON'T use #xcd8x: doing so will make Mach angry and confused.
    6239    
    6240    (def-x8664-opcode uuo-error-unbound ((:reg64 :insert-opcode-reg4))
    6241      #xcd90 nil 0)
    6242 
    6243    (def-x8664-opcode uuo-error-udf ((:reg64 :insert-opcode-reg4))
    6244      #xcda0 nil 0)
    6245    
    6246    (def-x8664-opcode uuo-error-reg-not-type ((:reg64 :insert-opcode-reg4) (:imm8 :insert-imm8))
    6247      #xcdb0 nil 0)
    6248    
    6249    (def-x8664-opcode uuo-error-too-few-args ()
    6250      #xcdc0 nil nil)
    6251    (def-x8664-opcode uuo-error-too-many-args ()
    6252      #xcdc1 nil nil)
    6253    (def-x8664-opcode uuo-error-wrong-number-of-args ()
    6254      #xcdc2 nil nil)
    6255    (def-x8664-opcode uuo-error-array-rank ((:reg64 :insert-reg4-pseudo-rm-high)
    6256                                            (:reg64 :insert-reg4-pseudo-rm-low))
    6257      #xcdc3 0 nil)
    6258 
    6259    (def-x8664-opcode uuo-gc-trap ()
    6260      #xcdc4 nil nil)
    6261    (def-x8664-opcode uuo-alloc ()
    6262      #xcdc5 nil nil)
    6263    (def-x8664-opcode uuo-error-not-callable ()
    6264      #xcdc6 nil nil)
    6265    (def-x8664-opcode uuo-error-udf-call ()
    6266      #xcdc7 nil nil)
    6267 
    6268    (def-x8664-opcode uuo-error-vector-bounds ((:reg64 :insert-reg4-pseudo-rm-high) (:reg64 :insert-reg4-pseudo-rm-low))
    6269      #xcdc8 0 nil)
    6270 
    6271    (def-x8664-opcode uuo-error-call-macro-or-special-operator ()
    6272      #xcdc9 nil nil)
    6273 
    6274    (def-x8664-opcode uuo-error-debug-trap ()
    6275      #xcdca nil nil)
    6276 
    6277    (def-x8664-opcode uuo-error-array-bounds ((:reg64 :insert-reg4-pseudo-rm-high) (:reg64 :insert-reg4-pseudo-rm-low))
    6278      #xcdcb 0 nil)
    6279 
    6280    (def-x8664-opcode uuo-error-eep-unresolved ((:reg64 :insert-reg4-pseudo-rm-high)
    6281                                                (:reg64 :insert-reg4-pseudo-rm-low))
    6282      #xcdcc 0 nil)
    6283 
    6284    (def-x8664-opcode uuo-error-debug-trap-with-string ()
    6285      #xcdcd nil nil)
    6286    
    6287    (def-x8664-opcode uuo-error-reg-not-tag ((:reg64 :insert-opcode-reg4) (:imm8 :insert-imm8))
    6288      #xcdd0 nil 0)
    6289    (def-x8664-opcode uuo-error-reg-not-list ((:reg64 :insert-opcode-reg4))
    6290      #xcde0 nil 0)
    6291    (def-x8664-opcode uuo-error-reg-not-fixnum ((:reg64 :insert-opcode-reg4))
    6292      #xcdf0 nil 0)
    6293 
    6294    ))
    62953382
    62963383(dotimes (i (length *x86-opcode-templates*))
     
    63453432    insert-xmm-rm
    63463433    insert-reg4-pseudo-rm-high
    6347     insert-reg4-pseudo-rm-low))
     3434    insert-reg4-pseudo-rm-low
     3435    insert-self
     3436))
    63483437
    63493438(initialize-x86-opcode-templates)
     
    70734162
    70744163(defun init-x86-registers ()
    7075   (flet ((hash-registers (vector hash 64p)
    7076            (dotimes (i (length vector))
    7077              (let* ((entry (svref vector i)))
    7078                (if (or 64p (not (logtest (reg-entry-reg-flags entry) +regrex+)))
    7079                  (setf (gethash (reg-entry-reg-name entry) hash)
    7080                        entry))))))
     4164  (labels ((ia32-p (entry)
     4165             (not (or (logtest (reg-entry-reg-flags entry)
     4166                               (logior +regrex+ +regrex64+))
     4167                      (logtest (reg-entry-reg-type entry)
     4168                               (encode-operand-type :reg64))
     4169                      ;; As a special case, exclude RIP, whose type is
     4170                      ;; *exactly* :BaseIndex
     4171                      (eql (reg-entry-reg-type entry)
     4172                           (encode-operand-type :BaseIndex)))))
     4173           (hash-registers (vector hash 64p)
     4174             (dotimes (i (length vector))
     4175               (let* ((entry (svref vector i)))
     4176                 (if (or 64p (ia32-p entry))
     4177                   (setf (gethash (reg-entry-reg-name entry) hash) entry))))))
    70814178    (hash-registers *x86-regtab* *x8632-registers* nil)
    70824179    (hash-registers *x86-float-regs* *x8632-registers* nil)
     
    72934390      (insert-imm8 instruction operand))))
    72944391
    7295 #+nil
    7296 (defun insert-self (instruction operand)
    7297   (setf (x86-immediate-operand-type operand)
    7298         (encode-operand-type :self))
    7299   (setf (x86-instruction-imm instruction) operand))
    7300 
    73014392(defun insert-label (instruction operand)
    73024393  (setf (x86-instruction-extra instruction)
    73034394        (x86::x86-label-operand-label operand)))
     4395
     4396(defun insert-self (instruction operand)
     4397  (setf (x86-immediate-operand-type operand)
     4398        (encode-operand-type :self))
     4399  (setf (x86-instruction-imm instruction) operand))
     4400
     4401(defparameter *x8632-register-entries*
     4402  (flet ((register-entry (name)
     4403           (let* ((r (gethash name *x8632-registers*)))
     4404             (unless r (error "unknown register ~s" name))
     4405             r)))
     4406    (vector
     4407     ;; 32-bit registers
     4408     (register-entry "eax")
     4409     (register-entry "ecx")
     4410     (register-entry "edx")
     4411     (register-entry "ebx")
     4412     (register-entry "esp")
     4413     (register-entry "ebp")
     4414     (register-entry "esi")
     4415     (register-entry "edi")
     4416     ;; 16-bit-registers
     4417     (register-entry "ax")
     4418     (register-entry "cx")
     4419     (register-entry "dx")
     4420     (register-entry "bx")
     4421     (register-entry "sp")
     4422     (register-entry "bp")
     4423     (register-entry "si")
     4424     (register-entry "di")
     4425     ;; 8-bit registers
     4426     (register-entry "al")
     4427     (register-entry "cl")
     4428     (register-entry "dl")
     4429     (register-entry "bl")
     4430     (register-entry "ah")
     4431     (register-entry "ch")
     4432     (register-entry "dh")
     4433     (register-entry "bh")
     4434       ;;; xmm registers
     4435     (register-entry "xmm0")
     4436     (register-entry "xmm1")
     4437     (register-entry "xmm2")
     4438     (register-entry "xmm3")
     4439     (register-entry "xmm4")
     4440     (register-entry "xmm5")
     4441     (register-entry "xmm6")
     4442     (register-entry "xmm7")
     4443     ;; MMX registers
     4444     (register-entry "mm0")
     4445     (register-entry "mm1")
     4446     (register-entry "mm2")
     4447     (register-entry "mm3")
     4448     (register-entry "mm4")
     4449     (register-entry "mm5")
     4450     (register-entry "mm6")
     4451     (register-entry "mm7")
     4452     ;; x87 FP regs.  May or may not be useful.
     4453     (register-entry "st[0]")
     4454     (register-entry "st[1]")
     4455     (register-entry "st[2]")
     4456     (register-entry "st[3]")
     4457     (register-entry "st[4]")
     4458     (register-entry "st[5]")
     4459     (register-entry "st[6]")
     4460     (register-entry "st[7]")
     4461     ;; Our friends, the segment registers
     4462     (register-entry "cs")
     4463     (register-entry "ds")
     4464     (register-entry "ss")
     4465     (register-entry "es")
     4466     (register-entry "fs")
     4467     (register-entry "gs")
     4468     )))
     4469
     4470(dotimes (i (length *x8632-register-entries*))
     4471  (let* ((entry (svref *x8632-register-entries* i)))
     4472    (when entry
     4473      (setf (reg-entry-ordinal32 entry) i))))
     4474
     4475(defconstant +x8632-32-bit-register+ #x0)
     4476(defconstant +x8632-16-bit-register+ #x8)
     4477(defconstant +x8632-8-bit-register+ #x10)
     4478(defconstant +x8632-xmm-register-offset+ #x18)
     4479(defconstant +x8632-mmx-register-offset+ #x20)
     4480(defconstant +x8632-fpu-register-offset+ #x28)
     4481(defconstant +x8632-segment-register-offset+ #x30)
    73044482
    73054483(defparameter *x8664-register-entries*
     
    74274605      (setf (reg-entry-ordinal64 entry) i))))
    74284606
    7429 
    7430 (defconstant +x86-64-bit-register+ #x00)
    7431 (defconstant +x86-32-bit-register+ #x10)
    7432 (defconstant +x86-16-bit-register+ #x20)
    7433 (defconstant +x86-8-bit-register+ #x30)
    7434 (defconstant +x86-xmm-register-offset+ #x40)
    7435 (defconstant +x86-mmx-register-offset+ #x50)
    7436 (defconstant +x86-fpu-register-offset+ #x58)
    7437 (defconstant +x86-segment-register-offset+ #x60)
     4607(defconstant +x8664-64-bit-register+ #x00)
     4608(defconstant +x8664-32-bit-register+ #x10)
     4609(defconstant +x8664-16-bit-register+ #x20)
     4610(defconstant +x8664-8-bit-register+ #x30)
     4611(defconstant +x8664-xmm-register-offset+ #x40)
     4612(defconstant +x8664-mmx-register-offset+ #x50)
     4613(defconstant +x8664-fpu-register-offset+ #x58)
     4614(defconstant +x8664-segment-register-offset+ #x60)
    74384615
    74394616(defun x86-segment-register (i)
    74404617  (if (and (typep i 'unsigned-byte)
    74414618           (< i 6))
    7442     (svref *x8664-register-entries* (+ +x86-segment-register-offset+ i))))
     4619      (ccl::target-arch-case
     4620       (:x8632
     4621        (svref *x8632-register-entries* (+ +x8632-segment-register-offset+ i)))
     4622       (:x8664
     4623        (svref *x8664-register-entries* (+ +x8664-segment-register-offset+ i))))))
    74434624
    74444625(defun x86-xmm-register (i)
    7445   (if (typep i '(mod 16))
    7446     (svref *x8664-register-entries* (+ +x86-xmm-register-offset+ i))))
     4626  (ccl::target-arch-case
     4627   (:x8632
     4628    (if (typep i '(mod 8))
     4629        (svref *x8632-register-entries* (+ +x8632-xmm-register-offset+ i))))
     4630   (:x8664
     4631    (if (typep i '(mod 16))
     4632        (svref *x8664-register-entries* (+ +x8664-xmm-register-offset+ i))))))
    74474633
    74484634(defun x86-mmx-register (i)
    74494635  (if (typep i '(mod 8))
    7450     (svref *x8664-register-entries* (+ +x86-mmx-register-offset+ i))))
     4636      (ccl::target-arch-case
     4637       (:x8632
     4638        (svref *x8632-register-entries* (+ +x8632-mmx-register-offset+ i)))
     4639       (:x8664
     4640        (svref *x8664-register-entries* (+ +x8664-mmx-register-offset+ i))))))
    74514641   
    74524642
    74534643(defun gpr-ordinal (r)
    7454   (or
    7455    (etypecase r
    7456      ((mod 64) r)
    7457      ((or string symbol)
    7458       (let* ((entry (gethash r *x8664-registers*)))
    7459         (if entry
    7460           (reg-entry-ordinal64 entry))))
    7461      (reg-entry (reg-entry-ordinal64 r))
    7462      (x86-register-operand
    7463       (reg-entry-ordinal64 (x86-register-operand-entry r))))
    7464    (error "Can't determine register ordinal of ~s" r)))
    7465 
     4644  (ccl::target-arch-case
     4645   (:x8632
     4646    (or
     4647     (etypecase r
     4648       ((mod 24) r)
     4649       ((or string symbol)
     4650        (let* ((entry (gethash r *x8632-registers*)))
     4651          (if entry
     4652            (reg-entry-ordinal32 entry))))
     4653       (reg-entry (reg-entry-ordinal32 r))
     4654       (x86-register-operand
     4655        (reg-entry-ordinal32 (x86-register-operand-entry r))))
     4656     (error "Can't determine register ordinal of ~s" r)))
     4657   (:x8664
     4658    (or
     4659     (etypecase r
     4660       ((mod 64) r)
     4661       ((or string symbol)
     4662        (let* ((entry (gethash r *x8664-registers*)))
     4663          (if entry
     4664            (reg-entry-ordinal64 entry))))
     4665       (reg-entry (reg-entry-ordinal64 r))
     4666       (x86-register-operand
     4667        (reg-entry-ordinal64 (x86-register-operand-entry r))))
     4668     (error "Can't determine register ordinal of ~s" r)))))
     4669   
    74664670
    74674671(defun x86-reg8 (r)
    7468   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    7469                                        (byte 4 0)
    7470                                        +x86-8-bit-register+)))
     4672  (ccl::target-arch-case
     4673   (:x8632
     4674    (svref *x8632-register-entries* (dpb (gpr-ordinal r)
     4675                                         (byte 3 0)
     4676                                         +x8632-8-bit-register+)))
     4677   (:x8664
     4678    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     4679                                         (byte 4 0)
     4680                                         +x8664-8-bit-register+)))))
    74714681
    74724682(defun x86-reg16 (r)
    7473   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    7474                                         (byte 4 0)
    7475                                         +x86-16-bit-register+)))
     4683  (ccl::target-arch-case
     4684   (:x8632
     4685    (svref *x8632-register-entries* (dpb (gpr-ordinal r)
     4686                                         (byte 3 0)
     4687                                         +x8632-16-bit-register+)))
     4688   (:x8664
     4689    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     4690                                         (byte 4 0)
     4691                                         +x8664-16-bit-register+)))))
    74764692
    74774693(defun x86-reg32 (r)
    7478   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    7479                                         (byte 4 0)
    7480                                         +x86-32-bit-register+)))       
     4694  (ccl::target-arch-case
     4695   (:x8632
     4696    (svref *x8632-register-entries* (dpb (gpr-ordinal r)
     4697                                         (byte 3 0)
     4698                                         +x8632-32-bit-register+)))
     4699   (:x8664
     4700    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     4701                                         (byte 4 0)
     4702                                         +x8664-32-bit-register+)))))
    74814703
    74824704(defun x86-reg64 (r)
    7483   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    7484                                         (byte 4 0)
    7485                                         +x86-64-bit-register+)))
    7486 
     4705  (ccl::target-arch-case
     4706   (:x8632
     4707    (error "x8632 doesn't have 64 bit register ~s" r))
     4708   (:x8664
     4709    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     4710                                         (byte 4 0)
     4711                                         +x8664-64-bit-register+)))))
    74874712
    74884713;;; This returns true if the template's operand types "match" the
     
    74924717  (format t "~& template = ~s, operand types = ~s" template (list type0 type1 type2))
    74934718  (ccl::target-arch-case
    7494 
     4719   (:x8632
     4720    (if (logtest (encode-opcode-flags :cpu64) (x86-opcode-template-flags template))
     4721      (return-from match-template-types nil)))
    74954722   (:x8664
    74964723    (if (logtest (encode-opcode-flags :cpuno64) (x86-opcode-template-flags template))
     
    75534780                                      template-type2)))))))))))))))
    75544781
    7555 #+nil 
    7556 (defun match-template (template parsed-operands)
    7557   (apply #'match-template-types template (mapcar #'x86-operand-type parsed-operands)))
    7558 
     4782;;; the format of operands in lap and in vinsns differs
     4783;;; #'x86-encode-vinsn-operand-type is for vinsns
     4784;;; #'x86-operand-type is for lap
    75594785(defun match-template (template parsed-operands)
    75604786  (let* ((flags (x86-opcode-template-flags template))
    7561         (operand-types (mapcar #'x86-operand-type parsed-operands))
    7562         (type0 (pop operand-types))
    7563         (type1 (pop operand-types))
    7564         (type2 (car operand-types)))
     4787        (operand-types (mapcar #'x86-operand-type parsed-operands))
     4788        (type0 (pop operand-types))
     4789        (type1 (pop operand-types))
     4790        (type2 (car operand-types)))
    75654791    #+debug
    75664792    (format t "~& template = ~s, operand types = ~s" template operand-types)
    75674793    (ccl::target-arch-case
    7568 
     4794     (:x8632
     4795      (if (not (logtest (encode-opcode-flags :cpu64) flags))
     4796        (match-template-types template type0 type1 type2)))
    75694797     (:x8664
    75704798      (if (not (logtest (encode-opcode-flags :cpuno64) flags))
    7571         (match-template-types template type0 type1 type2))))))
     4799        (match-template-types template type0 type1 type2))))))
    75724800
    75734801
Note: See TracChangeset for help on using the changeset viewer.