Changeset 10188


Ignore:
Timestamp:
Jul 23, 2008, 4:48:42 PM (11 years ago)
Author:
gb
Message:

More stuff from rme: maintain opcode flags (so that we can distinguish
between hardware variants, including 32/64-bit differences, vector
hardware, etc.) Better opcode definitions, some x87 stuff.

Slightly hard to bootstrap, so x86-64 new images soon.

Location:
trunk/source/compiler/X86
Files:
2 edited

Legend:

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

    r10180 r10188  
    6868(defconstant +REGMEM-FIELD-HAS-REG+ #x3) ; always = #x3
    6969(defconstant +REGMEM-FIELD-HAS-MEM+ (lognot +REGMEM-FIELD-HAS-REG+))
     70
     71(eval-when (:compile-toplevel :load-toplevel :execute)
     72
     73;;; By default, this returns NIL if the modifier can't be encoded.
     74;;; That's an error, but the caller can provide better error context.
     75
     76;;; first 16 bits for opcode modifier flags, rest for cpu
     77;;; features.
     78(defparameter *opcode-flags*           
     79  `((:jump . ,(ash 1 0))                ;special case for jump insns
     80    (:CpuNo64 . ,(ash 1 16))            ;not supported in 64 bit mode
     81    (:Cpu64 . ,(ash 1 17))              ;64 bit mode required
     82    (:CpuSSE . ,(ash 1 18))             ;SSE extensions required
     83    (:CpuSSE2 . ,(ash 1 19))            ;SSE2 extensions required
     84    (:CpuSSE3 . ,(ash 1 20))            ;SSE3 extensions required
     85))
     86
     87(defun %encode-opcode-flags (flags &optional errorp)
     88  (flet ((encode-atomic-flag (f)
     89           (if f
     90             (cdr (assoc f *opcode-flags*))
     91             0)))
     92    (or
     93     (if (atom flags)
     94       (encode-atomic-flag flags)
     95       (let* ((k 0))
     96         (dolist (f flags k)
     97           (let* ((k0 (encode-atomic-flag f)))
     98             (if k0
     99               (setq k (logior k0 k))
     100               (return))))))
     101     (if errorp (error "Unknown x86 opcode flags: ~s" flags)))))
     102
     103)
     104
     105(defmacro encode-opcode-flags (&rest flags)
     106  (%encode-opcode-flags flags t))
    70107
    71108
     
    581618  (if (atom name&flags)
    582619    0
    583     (%encode-opcode-modifier (cdr name&flags))))
     620    (%encode-opcode-flags (cdr name&flags))))
    584621
    585622)
     
    706743                                (x86-memory-operand-type operand)))
    707744
    708          
     745
     746#+nil         
    709747(defmacro def-x8664-opcode (name&flags types-and-classes base-opcode
    710748                                          modrm-byte
     
    721759    :modrm-byte ,modrm-byte))
    722760
    723 
    724 (defparameter *x8664-opcode-templates*
     761(defmacro def-x86-opcode (name&flags types-and-classes base-opcode
     762                          modrm-byte rex-prefix &rest prefixes)
     763  `(%make-x86-opcode-template
     764    :mnemonic ,(parse-x86-opcode-name name&flags)
     765    :flags ,(parse-x86-opcode-flags name&flags)
     766    :operand-types ,(parse-x86-opcode-operand-types types-and-classes)
     767    :operand-classes ,(parse-x86-opcode-operand-classes types-and-classes)
     768    :base-opcode ,base-opcode
     769    :prefixes ',prefixes
     770    :rex-prefix ,rex-prefix
     771    :modrm-byte ,modrm-byte))
     772
     773(defparameter *x86-opcode-templates*
     774  (vector
     775   ;; adc
     776   (def-x86-opcode (adcq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     777     #x11 #o300 #x48)
     778   (def-x86-opcode (adcq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     779     #x13 #o000 #x48)
     780   (def-x86-opcode (adcq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     781     #x11 #x00 #x48)
     782   (def-x86-opcode (adcq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     783     #x83 #o320 #x48)
     784   (def-x86-opcode (adcq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     785     #x15 nil #x48)
     786   (def-x86-opcode (adcq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     787     #x81 #o320 #x48)
     788   (def-x86-opcode (adcq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     789     #x83 #o020 #x48)
     790   (def-x86-opcode (adcq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     791     #x81 #o020 #x48)
     792
     793   (def-x86-opcode adcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     794     #x11 #o300 #x00)
     795   (def-x86-opcode adcl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     796     #x13 #o000 #x00)
     797   (def-x86-opcode adcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     798     #x11 #x00 #x00)
     799   (def-x86-opcode adcl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     800     #x83 #o320 #x00)
     801   (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     802     #x15 nil nil)
     803   (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     804     #x81 #o320 #x00)
     805   (def-x86-opcode adcl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     806     #x83 #o020 #x00)
     807   (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     808     #x81 #o020 #x00)
     809
     810   (def-x86-opcode adcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     811     #x11 #o300 #x00 #x66)
     812   (def-x86-opcode adcw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     813     #x13 #o000 #x00 #x66)
     814   (def-x86-opcode adcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     815     #x11 #x00 #x00 #x66)
     816   (def-x86-opcode adcw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     817     #x83 #o320 #x00 #x66)
     818   (def-x86-opcode adcw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     819     #x15 nil nil #x66)
     820   (def-x86-opcode adcw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     821     #x81 #o320 #x00 #x66)
     822   (def-x86-opcode adcw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     823     #x83 #o020 #x00 #x66)
     824   (def-x86-opcode adcw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     825     #x81 #o020 #x00 #x66)
     826
     827   (def-x86-opcode adcb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     828     #x10 #o300 #x00)
     829   (def-x86-opcode adcb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     830     #x12 #o000 #x00)
     831   (def-x86-opcode adcb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     832     #x10 #x00 #x00)
     833   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:acc :insert-nothing))
     834     #x14 nil nil)
     835   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     836     #x80 #o320 #x00)
     837   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     838     #x80 #o320 #x00)
     839   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:anymem :insert-memory))
     840     #x80 #o020 #x00)
     841
     842   ;; add
     843   (def-x86-opcode (addq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     844     #x01 #o300 #x48)
     845   (def-x86-opcode (addq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     846     #x03 #o000 #x48)
     847   (def-x86-opcode (addq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     848     #x01 #x00 #x48)
     849   (def-x86-opcode (addq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     850     #x83 #o300 #x48)
     851   (def-x86-opcode (addq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     852     #x05 nil #x48)
     853   (def-x86-opcode (addq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     854     #x81 #o300 #x48)
     855   (def-x86-opcode (addq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     856     #x83 #o000 #x48)
     857   (def-x86-opcode (addq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     858     #x81 #o000 #x48)
     859
     860   (def-x86-opcode addl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     861     #x01 #o300 #x00)
     862   (def-x86-opcode addl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     863     #x03 #o000 #x00)
     864   (def-x86-opcode addl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     865     #x01 #x00 #x00)
     866   (def-x86-opcode addl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     867     #x83 #o300 #x00)
     868   (def-x86-opcode addl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     869     #x05 nil nil)
     870   (def-x86-opcode addl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     871     #x81 #o300 #x00)
     872   (def-x86-opcode addl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     873     #x83 #o000 #x00)
     874   (def-x86-opcode addl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     875     #x81 #o000 #x00)
     876
     877   (def-x86-opcode addw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     878     #x01 #o300 #x00 #x66)
     879   (def-x86-opcode addw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     880     #x03 #o000 #x00 #x66)
     881   (def-x86-opcode addw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     882     #x01 #x00 #x00 #x66)
     883   (def-x86-opcode addw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     884     #x83 #o300 #x00 #x66)
     885   (def-x86-opcode addw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     886     #x05 nil nil #x66)
     887   (def-x86-opcode addw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     888     #x81 #o300 #x00 #x66)
     889   (def-x86-opcode addw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     890     #x83 #o000 #x00 #x66)
     891   (def-x86-opcode addw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     892     #x81 #o000 #x00 #x66)
     893
     894   (def-x86-opcode addb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     895     #x00 #o300 #x00)
     896   (def-x86-opcode addb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     897     #x02 #o000 #x00)
     898   (def-x86-opcode addb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     899     #x00 #x00 #x00)
     900   (def-x86-opcode addb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     901     #x04 nil nil)
     902   (def-x86-opcode addb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     903     #x80 #o300 #x00)
     904   (def-x86-opcode addb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     905     #x80 #o000 #x00)
     906
     907   ;; and
     908   (def-x86-opcode (andq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     909     #x21 #o300 #x48)
     910   (def-x86-opcode (andq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     911     #x23 #o000 #x48)
     912   (def-x86-opcode (andq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     913     #x21 #x00 #x48)
     914   (def-x86-opcode (andq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     915     #x83 #o340 #x48)
     916   (def-x86-opcode (andq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     917     #x25 nil #x48)
     918   (def-x86-opcode (andq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     919     #x81 #o340 #x48)
     920   (def-x86-opcode (andq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     921     #x83 #o040 #x48)
     922   (def-x86-opcode (andq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     923     #x81 #o040 #x48)
     924
     925   (def-x86-opcode andl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     926     #x21 #o300 #x00)
     927   (def-x86-opcode andl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     928     #x23 #o000 #x00)
     929   (def-x86-opcode andl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     930     #x21 #x00 #x00)
     931   (def-x86-opcode andl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     932     #x83 #o340 #x00)
     933   (def-x86-opcode andl (((:imm32s :imm32) :insert-imm32s) (:acc :insert-nothing))
     934     #x25 nil nil)
     935   (def-x86-opcode andl (((:imm32s :imm32) :insert-imm32s) (:reg32 :insert-modrm-rm))
     936     #x81 #o340 #x00)
     937   (def-x86-opcode andl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     938     #x83 #o040 #x00)
     939   (def-x86-opcode andl (((:imm32s :imm32) :insert-imm32s) (:anymem :insert-memory))
     940     #x81 #o040 #x00)
     941
     942   (def-x86-opcode andw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     943     #x21 #o300 #x00 #x66)
     944   (def-x86-opcode andw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     945     #x23 #o000 #x00 #x66)
     946   (def-x86-opcode andw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     947     #x21 #x00 #x00 #x66)
     948   (def-x86-opcode andw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     949     #x83 #o340 #x00 #x66)
     950   (def-x86-opcode andw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     951     #x25 nil nil #x66)
     952   (def-x86-opcode andw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     953     #x81 #o340 #x00 #x66)
     954   (def-x86-opcode andw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     955     #x83 #o040 #x00 #x66)
     956   (def-x86-opcode andw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     957     #x81 #o040 #x00 #x66)
     958
     959   (def-x86-opcode andb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     960     #x20 #o300 #x00)
     961   (def-x86-opcode andb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     962     #x22 #o000 #x00)
     963   (def-x86-opcode andb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     964     #x20 #o000 #x00)
     965   (def-x86-opcode andb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     966     #x24 nil nil)
     967   (def-x86-opcode andb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     968     #x80 #o340 #x00)
     969   (def-x86-opcode andb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     970     #x80 #o040 #x00)
     971
     972   ;; bsf
     973   (def-x86-opcode (bsfq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     974     #x0fbc #o300 #x48)
     975   (def-x86-opcode (bsfq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     976     #x0fbc #o000 #x48)
     977
     978   (def-x86-opcode bsfl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     979     #x0fbc #o300 #x00)
     980   (def-x86-opcode bsfl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     981     #x0fbc #o000 #x00)
     982
     983   (def-x86-opcode bsfw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     984     #x0fbc #o300 #x00 #x66)
     985   (def-x86-opcode bsfw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     986     #x0fbc #o000 #x00 #x66)
     987
     988   ;; bsr
     989   (def-x86-opcode (bsrq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     990     #x0fbd #o300 #x48)
     991   (def-x86-opcode (bsrq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     992     #x0fbd #o000 #x48)
     993
     994   (def-x86-opcode bsrl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     995     #x0fbd #o300 #x00)
     996   (def-x86-opcode bsrl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     997     #x0fbd #o000 #x00)
     998
     999   (def-x86-opcode bsrw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1000     #x0fbd #o300 #x00 #x66)
     1001   (def-x86-opcode bsrw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1002     #x0fbd #o000 #x00 #x66)
     1003
     1004   ;; bswap
     1005   (def-x86-opcode (bswapq :cpu64) ((:reg64 :insert-opcode-reg))
     1006     #x0fc8 nil #x48)
     1007
     1008   (def-x86-opcode bswapl ((:reg32 :insert-opcode-reg))
     1009     #x0fc8 nil #x00)
     1010
     1011   ;; bt
     1012   (def-x86-opcode (btq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     1013     #x0fba #o340 #x48)
     1014   (def-x86-opcode (btq :cpu64) ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1015     #x0fba #o040 #x48)
     1016   (def-x86-opcode (btq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     1017     #x0fa3 #o300 #x48)
     1018   (def-x86-opcode (btq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1019     #x0fa3 #o000 #x48)
     1020
     1021   (def-x86-opcode btl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1022     #x0fba #o340 #x00)
     1023   (def-x86-opcode btl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1024     #x0fba #o040 #x00)
     1025   (def-x86-opcode btl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1026     #x0fa3 #o300 #x00)
     1027   (def-x86-opcode btl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1028     #x0fa3 #o000 #x00)
     1029
     1030   (def-x86-opcode btw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1031     #x0fba #o340 #x00 #x66)
     1032   (def-x86-opcode btw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1033     #x0fba #o040 #x00 #x66)
     1034   (def-x86-opcode btw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1035     #x0fa3 #o300 #x00 #x66)
     1036   (def-x86-opcode btw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1037     #x0fa3 #o000 #x00 #x66)
     1038
     1039   ;; btc
     1040   (def-x86-opcode (btcq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     1041     #x0fba #o370 #x48)
     1042   (def-x86-opcode (btcq :cpu64) ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1043     #x0fba #o070 #x48)
     1044   (def-x86-opcode (btcq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     1045     #x0fbb #o300 #x48)
     1046   (def-x86-opcode (btcq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1047     #x0fbb #o000 #x48)
     1048
     1049   (def-x86-opcode btcl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1050     #x0fba #o370 #x00)
     1051   (def-x86-opcode btcl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1052     #x0fba #o070 #x00)
     1053   (def-x86-opcode btcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1054     #x0fbb #o300 #x00)
     1055   (def-x86-opcode btcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1056     #x0fbb #o000 #x00)
     1057
     1058   (def-x86-opcode btcw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1059     #x0fba #o370 #x00 #x66)
     1060   (def-x86-opcode btcw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1061     #x0fba #o070 #x00 #x66)
     1062   (def-x86-opcode btcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1063     #x0fbb #o300 #x00 #x66)
     1064   (def-x86-opcode btcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1065     #x0fbb #o000 #x00 #x66)
     1066
     1067   ;; btr
     1068   (def-x86-opcode (btrq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     1069     #x0fba #o360 #x48)
     1070   (def-x86-opcode (btrq :cpu64) ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1071     #x0fba #o060 #x48)
     1072   (def-x86-opcode (btrq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     1073     #x0fb3 #o300 #x48)
     1074   (def-x86-opcode (btrq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1075     #x0fb3 #o000 #x48)
     1076
     1077   (def-x86-opcode btrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1078     #x0fba #o360 #x00)
     1079   (def-x86-opcode btrl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1080     #x0fba #o060 #x00)
     1081   (def-x86-opcode btrl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1082     #x0fb3 #o300 #x00)
     1083   (def-x86-opcode btrl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1084     #x0fb3 #o000 #x00)
     1085
     1086   (def-x86-opcode btrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1087     #x0fba #o360  #x00 #x66)
     1088   (def-x86-opcode btrw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1089     #x0fba #o060 #x00 #x66)
     1090   (def-x86-opcode btrw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1091     #x0fb3 #o300 #x00 #x66)
     1092   (def-x86-opcode btrw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1093     #x0fb3 #o000 #x00 #x66)
     1094
     1095   ;; bts
     1096   (def-x86-opcode (btsq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     1097     #x0fba #o350 #x48)
     1098   (def-x86-opcode (btsq :cpu64) ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1099     #x0fba #o050 #x48)
     1100   (def-x86-opcode (btsq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     1101     #x0fab #o300 #x48)
     1102   (def-x86-opcode (btsq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1103     #x0fab #o000 #x48)
     1104
     1105   (def-x86-opcode btsl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1106     #x0fba #o350 #x00)
     1107   (def-x86-opcode btsl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1108     #x0fba #o050 #x00)
     1109   (def-x86-opcode btsl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1110     #x0fab #o300 #x00)
     1111   (def-x86-opcode btsl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1112     #x0fab #o000 #x00)
     1113
     1114   (def-x86-opcode btsw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1115     #x0fba #o350  #x00 #x66)
     1116   (def-x86-opcode btsw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1117     #x0fba #o050 #x00 #x66)
     1118   (def-x86-opcode btsw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1119     #x0fab #o300 #x00 #x66)
     1120   (def-x86-opcode btsw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1121     #x0fab #o000 #x00 #x66)
     1122
     1123   ;; call
     1124   ;; Probably need to align CALL instructions within the containing function,
     1125   ;; so that return addresses are tagged appropriately.
     1126   (def-x86-opcode call ((:label :insert-label))
     1127     #xe8 nil nil)
     1128
     1129   (def-x86-opcode (call :cpu64) ((:reg64 :insert-modrm-rm))
     1130     #xff #o320 #x0)
     1131   (def-x86-opcode (call :cpuno64) ((:reg32 :insert-modrm-rm))
     1132     #xff #o320 #x0)
     1133
     1134   (def-x86-opcode call ((:anymem :insert-memory))
     1135     #xff #o020 #x0)
     1136
     1137   ;; cbtw
     1138   (def-x86-opcode cbtw ()
     1139     #x98 nil nil #x66)
     1140
     1141   ;; clc
     1142   (def-x86-opcode clc ()
     1143     #xf8 nil nil)
     1144
     1145   ;; cld
     1146   (def-x86-opcode cld ()
     1147     #xfc nil nil)
     1148
     1149   ;; cltd
     1150   (def-x86-opcode cltd ()
     1151     #x99 nil nil)
     1152
     1153 
     1154   ;; cltq
     1155   (def-x86-opcode (cltq :cpu64) ()
     1156     #x98 nil #x48)
     1157
     1158   ;; cmc
     1159   (def-x86-opcode cmc ()
     1160     #xf5 nil nil)
     1161
     1162   ;; cmovCC
     1163   (def-x86-opcode (cmovccq :cpu64)
     1164       ((:imm8 :insert-cc) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1165     #x0f40 #o300 #x48)
     1166   (def-x86-opcode (cmovccq :cpu64)
     1167       ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1168     #x0f40 #o000 #x48)
     1169   (def-x86-opcode cmovccl
     1170       ((:imm8 :insert-cc) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1171     #x0f40 #o300 #x00)
     1172   (def-x86-opcode cmovccl
     1173       ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1174     #x0f40 #o000 #x00)
     1175   (def-x86-opcode cmovccw
     1176       ((:imm8 :insert-cc) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1177     #x0f40 #o300 #x00 #x66)
     1178   (def-x86-opcode cmovccw
     1179       ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1180     #x0f40 #o000 #x00 #x66)
     1181
     1182   (def-x86-opcode (cmovoq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1183     #x0f40 #o300 #x48)
     1184   (def-x86-opcode (cmovoq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1185     #x0f40 #o000 #x48)
     1186   (def-x86-opcode cmovol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1187     #x0f40 #o300 #x00)
     1188   (def-x86-opcode cmovol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1189     #x0f40 #o000 #x00)
     1190   (def-x86-opcode cmovow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1191     #x0f40 #o300 #x00 #x66)
     1192   (def-x86-opcode cmovow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1193     #x0f40 #o000 #x00 #x66)
     1194
     1195   (def-x86-opcode (cmovnoq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1196     #x0f41 #o300 #x48)
     1197   (def-x86-opcode (cmovnoq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1198     #x0f41 #o000 #x48)
     1199   (def-x86-opcode cmovnol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1200     #x0f41 #o300 #x00)
     1201   (def-x86-opcode cmovnol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1202     #x0f41 #o000 #x00)
     1203   (def-x86-opcode cmovnow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1204     #x0f41 #o300 #x00 #x66)
     1205   (def-x86-opcode cmovnow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1206     #x0f41 #o000 #x00 #x66)
     1207
     1208   (def-x86-opcode (cmovbq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1209     #x0f42 #o300 #x48)
     1210   (def-x86-opcode (cmovbq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1211     #x0f42 #o000 #x48)
     1212   (def-x86-opcode cmovbl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1213     #x0f42 #o300 #x00)
     1214   (def-x86-opcode cmovbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1215     #x0f42 #o000 #x00)
     1216   (def-x86-opcode cmovbw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1217     #x0f42 #o300 #x00 #x66)
     1218   (def-x86-opcode cmovbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1219     #x0f42 #o000 #x00 #x66)
     1220
     1221   (def-x86-opcode (cmovcq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1222     #x0f42 #o300 #x48)
     1223   (def-x86-opcode (cmovcq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1224     #x0f42 #o000 #x48)
     1225   (def-x86-opcode cmovcl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1226     #x0f42 #o300 #x00)
     1227   (def-x86-opcode cmovcl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1228     #x0f42 #o000 #x00)
     1229   (def-x86-opcode cmovcw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1230     #x0f42 #o300 #x00 #x66)
     1231   (def-x86-opcode cmovcw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1232     #x0f42 #o000 #x00 #x66)
     1233
     1234   (def-x86-opcode (cmovaeq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1235     #x0f43 #o300 #x48)
     1236   (def-x86-opcode (cmovaeq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1237     #x0f43 #o000 #x48)
     1238   (def-x86-opcode cmovael ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1239     #x0f43 #o300 #x00)
     1240   (def-x86-opcode cmovael ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1241     #x0f43 #o000 #x00)
     1242   (def-x86-opcode cmovaew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1243     #x0f43 #o300 #x00 #x66)
     1244   (def-x86-opcode cmovaew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1245     #x0f43 #o000 #x00 #x66)
     1246
     1247   (def-x86-opcode (cmovncq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1248     #x0f43 #o300 #x48)
     1249   (def-x86-opcode (cmovncq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1250     #x0f43 #o000 #x48)
     1251   (def-x86-opcode cmovncl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1252     #x0f43 #o300 #x00)
     1253   (def-x86-opcode cmovncl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1254     #x0f43 #o000 #x00)
     1255   (def-x86-opcode cmovncw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1256     #x0f43 #o300 #x00 #x66)
     1257   (def-x86-opcode cmovncw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1258     #x0f43 #o000 #x00 #x66)
     1259
     1260   (def-x86-opcode (cmoveq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1261     #x0f44 #o300 #x48)
     1262   (def-x86-opcode (cmoveq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1263     #x0f44 #o000 #x48)
     1264   (def-x86-opcode cmovel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1265     #x0f44 #o300 #x00)
     1266   (def-x86-opcode cmovel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1267     #x0f44 #o000 #x00)
     1268   (def-x86-opcode cmovew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1269     #x0f44 #o300 #x00 #x66)
     1270   (def-x86-opcode cmovew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1271     #x0f44 #o000 #x00 #x66)
     1272
     1273   (def-x86-opcode (cmovzq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1274     #x0f44 #o300 #x48)
     1275   (def-x86-opcode (cmovzq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1276     #x0f44 #o000 #x48)
     1277   (def-x86-opcode cmovzl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1278     #x0f44 #o300 #x00)
     1279   (def-x86-opcode cmovzl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1280     #x0f44 #o000 #x00)
     1281   (def-x86-opcode cmovzw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1282     #x0f44 #o300 #x00 #x66)
     1283   (def-x86-opcode cmovzw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1284     #x0f44 #o000 #x00 #x66)
     1285
     1286   (def-x86-opcode (cmovneq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1287     #x0f45 #o300 #x48)
     1288   (def-x86-opcode (cmovneq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1289     #x0f45 #o000 #x48)
     1290   (def-x86-opcode cmovnel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1291     #x0f45 #o300 #x00)
     1292   (def-x86-opcode cmovnel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1293     #x0f45 #o000 #x00)
     1294   (def-x86-opcode cmovnew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1295     #x0f45 #o300 #x00 #x66)
     1296   (def-x86-opcode cmovnew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1297     #x0f45 #o000 #x00 #x66)
     1298
     1299   (def-x86-opcode (cmovnzq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1300     #x0f45 #o300 #x48)
     1301   (def-x86-opcode (cmovnzq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1302     #x0f45 #o000 #x48)
     1303   (def-x86-opcode cmovnzl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1304     #x0f45 #o300 #x00)
     1305   (def-x86-opcode cmovnzl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1306     #x0f45 #o000 #x00)
     1307   (def-x86-opcode cmovnzw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1308     #x0f45 #o300 #x00 #x66)
     1309   (def-x86-opcode cmovnzw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1310     #x0f45 #o000 #x00 #x66)
     1311
     1312   (def-x86-opcode (cmovbeq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1313     #x0f46 #o300 #x48)
     1314   (def-x86-opcode (cmovbeq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1315     #x0f46 #o000 #x48)
     1316   (def-x86-opcode cmovbel ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-reg))
     1317     #x0f46 #o300 #x00)
     1318   (def-x86-opcode cmovbel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1319     #x0f46 #o000 #x00)
     1320   (def-x86-opcode cmovbew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1321     #x0f46 #o300 #x00 #x66)
     1322   (def-x86-opcode cmovbew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1323     #x0f46 #o000 #x00 #x66)
     1324
     1325   (def-x86-opcode (cmovaq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1326     #x0f47 #o300 #x48)
     1327   (def-x86-opcode (cmovaq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1328     #x0f47 #o000 #x48)
     1329   (def-x86-opcode cmoval ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1330     #x0f47 #o300 #x00)
     1331   (def-x86-opcode cmoval ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1332     #x0f47 #o000 #x00)
     1333   (def-x86-opcode cmovaw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1334     #x0f47 #o300 #x00 #x66)
     1335   (def-x86-opcode cmovaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1336     #x0f47 #o000 #x00 #x66)
     1337
     1338   (def-x86-opcode (cmovsq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1339     #x0f48 #o300 #x48)
     1340   (def-x86-opcode (cmovsq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1341     #x0f48 #o000 #x48)
     1342   (def-x86-opcode cmovsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1343     #x0f48 #o300 #x00)
     1344   (def-x86-opcode cmovsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1345     #x0f48 #o000 #x00)
     1346   (def-x86-opcode cmovsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1347     #x0f48 #o300 #x00 #x66)
     1348   (def-x86-opcode cmovsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1349     #x0f48 #o000 #x00 #x66)
     1350
     1351   (def-x86-opcode (cmovnsq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1352     #x0f49 #o300 #x48)
     1353   (def-x86-opcode (cmovnsq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1354     #x0f49 #o000 #x48)
     1355   (def-x86-opcode cmovnsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1356     #x0f49 #o300 #x00)
     1357   (def-x86-opcode cmovnsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1358     #x0f49 #o000 #x00)
     1359   (def-x86-opcode cmovnsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1360     #x0f49 #o300 #x00 #x66)
     1361   (def-x86-opcode cmovnsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1362     #x0f49 #o000 #x00 #x66)
     1363
     1364   (def-x86-opcode (cmovpeq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1365     #x0f4a #o300 #x48)
     1366   (def-x86-opcode (cmovpeq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1367     #x0f4a #o000 #x48)
     1368   (def-x86-opcode cmovpel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1369     #x0f4a #o300 #x00)
     1370   (def-x86-opcode cmovpel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1371     #x0f4a #o000 #x00)
     1372   (def-x86-opcode cmovpew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1373     #x0f4a #o300 #x00 #x66)
     1374   (def-x86-opcode cmovpew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1375     #x0f4a #o000 #x00 #x66)
     1376
     1377   (def-x86-opcode (cmovpoq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1378     #x0f4b #o300 #x48)
     1379   (def-x86-opcode (cmovpoq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1380     #x0f4b #o000 #x48)
     1381   (def-x86-opcode cmovpol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1382     #x0f4b #o300 #x00)
     1383   (def-x86-opcode cmovpol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1384     #x0f4b #o000 #x00)
     1385   (def-x86-opcode cmovpow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1386     #x0f4b #o300 #x00 #x66)
     1387   (def-x86-opcode cmovpow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1388     #x0f4b #o000 #x00 #x66)
     1389
     1390   (def-x86-opcode (cmovlq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1391     #x0f4c #o300 #x48)
     1392   (def-x86-opcode (cmovlq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1393     #x0f4c #o000 #x48)
     1394   (def-x86-opcode cmovll ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1395     #x0f4c #o300 #x00)
     1396   (def-x86-opcode cmovll ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1397     #x0f4c #o000 #x00)
     1398   (def-x86-opcode cmovlw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1399     #x0f4c #o300 #x00 #x66)
     1400   (def-x86-opcode cmovlw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1401     #x0f4c #o000 #x00 #x66)
     1402
     1403   (def-x86-opcode (cmovgeq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1404     #x0f4d #o300 #x48)
     1405   (def-x86-opcode (cmovgeq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1406     #x0f4d #o000 #x48)
     1407   (def-x86-opcode cmovgel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1408     #x0f4d #o300 #x00)
     1409   (def-x86-opcode cmovgel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1410     #x0f4d #o000 #x00)
     1411   (def-x86-opcode cmovgew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1412     #x0f4d #o300 #x00 #x66)
     1413   (def-x86-opcode cmovgew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1414     #x0f4d #o000 #x00 #x66)
     1415
     1416   (def-x86-opcode (cmovleq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1417     #x0f4e #o300 #x48)
     1418   (def-x86-opcode (cmovleq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1419     #x0f4e #o000 #x48)
     1420   (def-x86-opcode cmovlel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1421     #x0f4e #o300 #x00)
     1422   (def-x86-opcode cmovlel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1423     #x0f4e #o000 #x00)
     1424   (def-x86-opcode cmovlew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1425     #x0f4e #o300 #x00 #x66)
     1426   (def-x86-opcode cmovlew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1427     #x0f4e #o000 #x00 #x66)
     1428
     1429   (def-x86-opcode (cmovgq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1430     #x0f4f #o300 #x48)
     1431   (def-x86-opcode (cmovgq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1432     #x0f4f #o000 #x48)
     1433   (def-x86-opcode cmovgl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1434     #x0f4f #o300 #x00)
     1435   (def-x86-opcode cmovgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1436     #x0f4f #o000 #x00)
     1437   (def-x86-opcode cmovgw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1438     #x0f4f #o300 #x00 #x66)
     1439   (def-x86-opcode cmovgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1440     #x0f4f #o000 #x00 #x66)
     1441
     1442
     1443   ;; cmp
     1444
     1445   (def-x86-opcode (cmpq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     1446     #x39 #o300 #x48)
     1447   (def-x86-opcode (rcmpq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1448     #x39 #o300 #x48)
     1449   (def-x86-opcode (cmpq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1450     #x3b #o000 #x48)
     1451   (def-x86-opcode (rcmpq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1452     #x3b #o000 #x48)   
     1453   (def-x86-opcode (cmpq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1454     #x39 #x00 #x48)
     1455   (def-x86-opcode (rcmpq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1456     #x39 #x00 #x48)
     1457   (def-x86-opcode (cmpq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     1458     #x83 #o370 #x48)
     1459   (def-x86-opcode (rcmpq :cpu64) ((:reg64 :insert-modrm-rm) (:imm8s :insert-imm8s))
     1460     #x83 #o370 #x48)
     1461   (def-x86-opcode (cmpq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     1462     #x3d nil #x48)
     1463   (def-x86-opcode (rcmpq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     1464     #x3d nil #x48)
     1465   (def-x86-opcode (cmpq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     1466     #x81 #o370 #x48)
     1467   (def-x86-opcode (rcmpq :cpu64) ((:reg64 :insert-modrm-rm) (:imm32s :insert-imm32s))
     1468     #x81 #o370 #x48)   
     1469   (def-x86-opcode (cmpq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1470     #x83 #o070 #x48)
     1471   (def-x86-opcode (rcmpq :cpu64) ((:anymem :insert-memory) (:imm8s :insert-imm8s))
     1472     #x83 #o070 #x48)
     1473   (def-x86-opcode (cmpq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     1474     #x81 #o070 #x48)
     1475   (def-x86-opcode (rcmpq :cpu64) ((:anymem :insert-memory) (:imm32s :insert-imm32s))
     1476     #x81 #o070 #x48)
     1477
     1478   (def-x86-opcode cmpl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1479     #x39 #o300 #x00)
     1480   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1481     #x39 #o300 #x00)   
     1482   (def-x86-opcode cmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1483     #x3b #o000 #x00)
     1484   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1485     #x3b #o000 #x00)   
     1486   (def-x86-opcode cmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1487     #x39 #x00 #x00)
     1488   (def-x86-opcode rcmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1489     #x39 #x00 #x00)   
     1490   (def-x86-opcode cmpl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     1491     #x83 #o370 #x00)
     1492   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm8s :insert-imm8s))
     1493     #x83 #o370 #x00)   
     1494   (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     1495     #x3d nil nil)
     1496   (def-x86-opcode rcmpl ((:acc :insert-nothing) (:imm32s :insert-imm32s))
     1497     #x3d nil nil)   
     1498   (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     1499     #x81 #o370 #x00)
     1500   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm32s :insert-imm32s))
     1501     #x81 #o370 #x00)   
     1502   (def-x86-opcode cmpl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1503     #x83 #o070 #x00)
     1504   (def-x86-opcode rcmpl ((:anymem :insert-memory) (:imm8s :insert-imm8s))
     1505     #x83 #o070 #x00)   
     1506   (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     1507     #x81 #o070 #x00)
     1508   (def-x86-opcode rcmpl ((:anymem :insert-memory) (:imm32s :insert-imm32s))
     1509     #x81 #o070 #x00)   
     1510
     1511   (def-x86-opcode cmpw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1512     #x39 #o300 #x00 #x66)
     1513   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1514     #x39 #o300 #x00 #x66)   
     1515   (def-x86-opcode cmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1516     #x3b #o000 #x00 #x66)
     1517   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1518     #x3b #o000 #x00 #x66)   
     1519   (def-x86-opcode cmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1520     #x39 #x00 #x00 #x66)
     1521   (def-x86-opcode rcmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1522     #x39 #x00 #x00 #x66)   
     1523   (def-x86-opcode cmpw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     1524     #x83 #o370 #x00 #x66)
     1525   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm8s :insert-imm8s))
     1526     #x83 #o370 #x00 #x66)   
     1527   (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     1528     #x3d nil nil #x66)
     1529   (def-x86-opcode rcmpw ((:acc :insert-nothing) (:imm16 :insert-imm16))
     1530     #x3d nil nil #x66)   
     1531   (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     1532     #x81 #o370 #x00 #x66)
     1533   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm16 :insert-imm16))
     1534     #x81 #o370 #x00 #x66)   
     1535   (def-x86-opcode cmpw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1536     #x83 #o070 #x00 #x66)
     1537   (def-x86-opcode rcmpw ((:anymem :insert-memory) (:imm8s :insert-imm8s))
     1538     #x83 #o070 #x00 #x66)   
     1539   (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     1540     #x81 #o070 #x00 #x66)
     1541   (def-x86-opcode rcmpw ((:anymem :insert-memory) (:imm16 :insert-imm16))
     1542     #x81 #o070 #x00 #x66)   
     1543
     1544   (def-x86-opcode cmpb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     1545     #x38 #o300 #x00)
     1546   (def-x86-opcode rcmpb ((:reg8 :insert-modrm-rm) (:reg8 :insert-modrm-reg))
     1547     #x38 #o300 #x00)
     1548   (def-x86-opcode cmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     1549     #x3a #o000 #x00)
     1550   (def-x86-opcode rcmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1551     #x3a #o000 #x00)
     1552   (def-x86-opcode cmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1553     #x38 #x00 #x00)
     1554   (def-x86-opcode rcmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     1555     #x38 #x00 #x00)   
     1556   (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:acc :insert-nothing))
     1557     #x3c nil nil)
     1558   (def-x86-opcode rcmpb ((:acc :insert-nothing) ((:imm8s :imm8) :insert-imm8s))
     1559     #x3c nil nil)
     1560   (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:reg8 :insert-modrm-rm))
     1561     #x80 #o370 #x00)
     1562   (def-x86-opcode rcmpb ((:reg8 :insert-modrm-rm) ((:imm8s :imm8) :insert-imm8s))
     1563     #x80 #o370 #x00)
     1564   (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:anymem :insert-memory))
     1565     #x80 #o070 #x00)
     1566   (def-x86-opcode rcmpb ((:anymem :insert-memory) ((:imm8s :imm8) :insert-imm8s))
     1567     #x80 #o070 #x00)
     1568
     1569   ;; cmps
     1570   (def-x86-opcode (cmpsq :cpu64) ()
     1571     #xa7 nil #x48)
     1572
     1573   (def-x86-opcode cmpsl ()
     1574     #xa7 nil nil)
     1575
     1576   (def-x86-opcode cmpsw ()
     1577     #xa7 nil nil #x66)
     1578
     1579   (def-x86-opcode cmpsb ()
     1580     #xa6 nil nil)
     1581
     1582   ;; cmpxchg
     1583   (def-x86-opcode (cmpxchgq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     1584     #x0fb1 #o300 #x48)
     1585   (def-x86-opcode (cmpxchgq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1586     #x0fb1 #o000 #x48)
     1587
     1588   (def-x86-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1589     #x0fb1 #o300 #x00)
     1590   (def-x86-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1591     #x0fb1 #o000 #x00)
     1592
     1593   (def-x86-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1594     #x0fb1 #o300 #x00 #x66)
     1595   (def-x86-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1596     #x0fb1 #o000 #x00 #x66)
     1597
     1598   (def-x86-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1599     #x0fb0 #o300 #x00)
     1600   (def-x86-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1601     #x0fb0 #o000 #x00)
     1602
     1603   ;; cpuid
     1604   (def-x86-opcode cpuid ()
     1605     #x0fa2 nil nil)
     1606
     1607   ;; cqto
     1608   (def-x86-opcode (cqto :cpu64) ()
     1609     #x99 nil #x48)
     1610
     1611   ;; cwtd
     1612   (def-x86-opcode cwtd ()
     1613     #x99 nil nil #x66)
     1614
     1615   ;; cwtl
     1616   (def-x86-opcode cwtl ()
     1617     #x98 nil nil)
     1618
     1619   ;; dec (not the 1-byte form).  This exists on x8664, but gas doesn't
     1620   ;; know that.
     1621   (def-x86-opcode (decq :cpu64) ((:reg64 :insert-modrm-rm))
     1622     #xff #o310 #x48)
     1623   (def-x86-opcode (decq :cpu64) ((:anymem :insert-memory))
     1624     #xff #o010 #x48)
     1625
     1626   (def-x86-opcode (decl :cpuno64) ((:reg32 :insert-opcode-reg))
     1627     #x48 nil nil)
     1628   ;; This is valid in 32 bit too, but use it only on x86-64
     1629   (def-x86-opcode (decl :cpu64) ((:reg32 :insert-modrm-rm))
     1630     #xff #o310 #x00)
     1631   (def-x86-opcode decl ((:anymem :insert-memory))
     1632     #xff #o010 #x00)
     1633
     1634   (def-x86-opcode (decw :cpuno64) ((:reg16 :insert-opcode-reg))
     1635     #x48 nil nil #x66)
     1636   ;; This is valud in 32 bit too, but use it only on x86-64
     1637   (def-x86-opcode (decw :cpu64) ((:reg16 :insert-modrm-rm))
     1638     #xff #o310 #x00 #x66)
     1639   (def-x86-opcode decw ((:anymem :insert-memory))
     1640     #xff #o010 #x00 #x66)
     1641
     1642   (def-x86-opcode decb ((:reg8 :insert-modrm-rm))
     1643     #xfe #o310 #x00)
     1644   (def-x86-opcode decb ((:anymem :insert-memory))
     1645     #xfe #o010 #x00)
     1646
     1647   ;; div
     1648   (def-x86-opcode (divq :cpu64) ((:reg64 :insert-modrm-rm))
     1649     #xf7 #o360 #x48)
     1650   (def-x86-opcode (divq :cpu64) ((:anymem :insert-memory))
     1651     #xf7 #o060 #x48)
     1652
     1653   (def-x86-opcode divl ((:reg32 :insert-modrm-rm))
     1654     #xf7 #o360 #x00)
     1655   (def-x86-opcode divl ((:anymem :insert-memory))
     1656     #xf7 #o060 #x00)
     1657
     1658   (def-x86-opcode divw ((:reg16 :insert-modrm-rm))
     1659     #xf7 #o360 #x00 #x66)
     1660   (def-x86-opcode divw ((:anymem :insert-memory))
     1661     #xf7 #o060 #x00 #x66)
     1662
     1663   (def-x86-opcode divb ((:reg8 :insert-modrm-rm))
     1664     #xf6 #o360 #x00)
     1665   (def-x86-opcode divl ((:anymem :insert-memory))
     1666     #xf6 #o060 #x00)
     1667
     1668   ;; enter.
     1669
     1670   (def-x86-opcode enter ((:imm16 :insert-imm16) (:imm8 :insert-extra))
     1671     #xc8 nil nil)
     1672
     1673   ;; hlt
     1674   (def-x86-opcode hlt ()
     1675     #xf4 nil nil)
     1676
     1677   ;; idiv.  Note that GAS doesn't know about newer(?) idiv forms
     1678   (def-x86-opcode (idivq :cpu64) ((:reg64 :insert-modrm-rm))
     1679     #xf7 #o370 #x48)
     1680   (def-x86-opcode (idivq :cpu64) ((:anymem :insert-memory))
     1681     #xf7 #o070 #x48)
     1682
     1683   (def-x86-opcode idivl ((:reg32 :insert-modrm-rm))
     1684     #xf7 #o370 #x00)
     1685   (def-x86-opcode idivl ((:anymem :insert-memory))
     1686     #xf7 #o070 #x00)
     1687
     1688   (def-x86-opcode idivw ((:reg16 :insert-modrm-rm))
     1689     #xf7 #o370 #x00 #x66)
     1690   (def-x86-opcode idivw ((:anymem :insert-memory))
     1691     #xf7 #o070 #x00 #x66)
     1692
     1693   (def-x86-opcode idivb ((:reg8 :insert-modrm-rm))
     1694     #xf6 #o370 #x00)
     1695   (def-x86-opcode idivl ((:anymem :insert-memory))
     1696     #xf6 #o070 #x00)
     1697
     1698   ;; imul
     1699   (def-x86-opcode (imulq :cpu64) ((:reg64 :insert-modrm-rm))
     1700     #xf7 #o350 #x48)
     1701   (def-x86-opcode (imulq :cpu64) ((:anymem :insert-memory))
     1702     #xf7 #o050 #x48)
     1703
     1704   (def-x86-opcode (imulq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1705     #x6b #o300 #x48)
     1706   (def-x86-opcode (imulq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1707     #x6b #o000 #x48)
     1708   (def-x86-opcode (imulq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1709     #x69 #o300 #x48)
     1710   (def-x86-opcode (imulq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1711     #x69 #o000 #x48)
     1712   (def-x86-opcode (imulq :cpu64) ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     1713     #x0faf #o300 #x48)
     1714   (def-x86-opcode (imulq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1715     #x0faf #o000 #x48)   
     1716
     1717   
     1718   (def-x86-opcode imull ((:reg32 :insert-modrm-rm))
     1719     #xf7 #o350 #x00)
     1720   (def-x86-opcode imull ((:anymem :insert-memory))
     1721     #xf7 #o050 #x00)
     1722
     1723   (def-x86-opcode imull ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1724     #x6b #o300 #x00)
     1725   (def-x86-opcode imull ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1726     #x6b #o000 #x00)
     1727   (def-x86-opcode imull ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1728     #x69 #o300 #x00)
     1729   (def-x86-opcode imull ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1730     #x69 #o000 #x00)
     1731   (def-x86-opcode imull ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1732     #x0faf #o300 #x00)
     1733   (def-x86-opcode imull ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1734     #x0faf #o000 #x00)   
     1735   
     1736   (def-x86-opcode imulw ((:reg16 :insert-modrm-rm))
     1737     #xf7 #o350 #x00 #x66)
     1738   (def-x86-opcode imulw ((:anymem :insert-memory))
     1739     #xf7 #o050 #x00 #x66)
     1740
     1741   (def-x86-opcode imulw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1742     #x6b #o300 #x00 #x66)
     1743   (def-x86-opcode imulw ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1744     #x6b #o000 #x00 #x66)
     1745   (def-x86-opcode imulw ((:imm32s :insert-imm32s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1746     #x69 #o300 #x00 #x66)
     1747   (def-x86-opcode imulw ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1748     #x69 #o000 #x00 #x66)
     1749   (def-x86-opcode imulw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1750     #x0faf #o300 #x00 #x66)
     1751   (def-x86-opcode imulw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1752     #x0faf #o000 #x00 #x66)   
     1753
     1754   (def-x86-opcode imulb ((:reg8 :insert-modrm-rm))
     1755     #xf6 #o350 #x00)
     1756   (def-x86-opcode imulb ((:anymem :insert-memory))
     1757     #xf6 #o050 #x00)
     1758
     1759   ;; inc (but not the one-byte form) is available on x86-64.
     1760   (def-x86-opcode (incq :cpu64) ((:reg64 :insert-modrm-rm))
     1761     #xff #o300 #x48)
     1762   (def-x86-opcode (incq :cpu64) ((:anymem :insert-memory))
     1763     #xff #o000 #x48)
     1764
     1765   (def-x86-opcode (incl :cpuno64) ((:reg32 :insert-opcode-reg))
     1766     #x40 nil nil)
     1767   ;; This is valid in 32-bit too, but use it only on x86-64
     1768   (def-x86-opcode (incl :cpu64) ((:reg32 :insert-modrm-rm))
     1769     #xff #o300 #x00)
     1770   (def-x86-opcode incl ((:anymem :insert-memory))
     1771     #xff #o000 #x00)
     1772
     1773   (def-x86-opcode (incw :cpuno64) ((:reg16 :insert-opcode-reg))
     1774     #x40 nil nil #x66)
     1775   ;; This is valid in 32-bit too, but use it only on x86-64
     1776   (def-x86-opcode (incw :cpu64) ((:reg16 :insert-modrm-rm))
     1777     #xff #o300 #x00 #x66)
     1778   (def-x86-opcode incw ((:anymem :insert-memory))
     1779     #xff #o000 #x00 #x66)
     1780
     1781   (def-x86-opcode incb ((:reg8 :insert-modrm-rm))
     1782     #xfe #o300 #x00)
     1783   (def-x86-opcode incb ((:anymem :insert-memory))
     1784     #xfe #o000 #x00)
     1785
     1786   ;; int.  See also UUOs.
     1787   (def-x86-opcode int ((:imm8 :insert-imm8-for-int))
     1788     #xcd nil nil)
     1789
     1790   ;; Jcc.  Generate the short form here; maybe relax later.
     1791   (def-x86-opcode (jcc :jump) ((:imm8 :insert-cc) (:label :insert-label))
     1792     #x70 nil nil)
     1793   (def-x86-opcode (jcc.pt :jump) ((:imm8 :insert-cc) (:label :insert-label))
     1794     #x70 nil nil #x3e)
     1795   (def-x86-opcode (jcc.pn :jump) ((:imm8 :insert-cc) (:label :insert-label))
     1796     #x70 nil nil #x2e)
     1797
     1798   (def-x86-opcode (jo :jump) ((:label :insert-label))
     1799     #x70 nil nil)
     1800   (def-x86-opcode (jo.pt :jump) ((:label :insert-label))
     1801     #x70 nil nil #x3e)
     1802   (def-x86-opcode (jo.pn :jump) ((:label :insert-label))
     1803     #x70 nil nil #x2e)
     1804   (def-x86-opcode (jno :jump) ((:label :insert-label))
     1805     #x71 nil nil)
     1806   (def-x86-opcode (jno.pt :jump) ((:label :insert-label))
     1807     #x71 nil nil #x3e)
     1808   (def-x86-opcode (jno.pn :jump) ((:label :insert-label))
     1809     #x71 nil nil #x2e)
     1810   (def-x86-opcode (jb :jump) ((:label :insert-label))
     1811     #x72 nil nil)
     1812   (def-x86-opcode (jb.pt :jump) ((:label :insert-label))
     1813     #x72 nil nil #x3e)
     1814   (def-x86-opcode (jb.pn :jump) ((:label :insert-label))
     1815     #x72 nil nil #x2e)
     1816   (def-x86-opcode (jc :jump) ((:label :insert-label))
     1817     #x72 nil nil)
     1818   (def-x86-opcode (jc.pt :jump) ((:label :insert-label))
     1819     #x72 nil nil #x3e)
     1820   (def-x86-opcode (jc.pn :jump) ((:label :insert-label))
     1821     #x72 nil nil #x2e)
     1822   (def-x86-opcode (jae :jump) ((:label :insert-label))
     1823     #x73 nil nil)
     1824   (def-x86-opcode (jae.pt :jump) ((:label :insert-label))
     1825     #x73 nil nil #x3e)
     1826   (def-x86-opcode (jae.pn :jump) ((:label :insert-label))
     1827     #x73 nil nil #x2e)
     1828   (def-x86-opcode (jnc :jump) ((:label :insert-label))
     1829     #x73 nil nil)
     1830   (def-x86-opcode (jnc.pt :jump) ((:label :insert-label))
     1831     #x73 nil nil #x3e)
     1832   (def-x86-opcode (jnc.pn :jump) ((:label :insert-label))
     1833     #x73 nil nil #x2e)
     1834   (def-x86-opcode (je :jump) ((:label :insert-label))
     1835     #x74 nil nil)
     1836   (def-x86-opcode (je.pt :jump) ((:label :insert-label))
     1837     #x74 nil nil #x3e)
     1838   (def-x86-opcode (je.pn :jump) ((:label :insert-label))
     1839     #x74 nil nil #x2e)
     1840   (def-x86-opcode (jz :jump) ((:label :insert-label))
     1841     #x74 nil nil)
     1842   (def-x86-opcode (jz.pt :jump) ((:label :insert-label))
     1843     #x74 nil nil #x3e)
     1844   (def-x86-opcode (jz.pn :jump) ((:label :insert-label))
     1845     #x74 nil nil #x2e)
     1846   (def-x86-opcode (jne :jump) ((:label :insert-label))
     1847     #x75 nil nil)
     1848   (def-x86-opcode (jne.pt :jump) ((:label :insert-label))
     1849     #x75 nil nil #x3e)
     1850   (def-x86-opcode (jne.pn :jump) ((:label :insert-label))
     1851     #x75 nil nil #x2e)
     1852   (def-x86-opcode (jnz :jump) ((:label :insert-label))
     1853     #x75 nil nil)
     1854   (def-x86-opcode (jnz.pt :jump) ((:label :insert-label))
     1855     #x75 nil nil #x3e)
     1856   (def-x86-opcode (jnz.pn :jump) ((:label :insert-label))
     1857     #x75 nil nil #x2e)
     1858   (def-x86-opcode (jbe :jump) ((:label :insert-label))
     1859     #x76 nil nil)
     1860   (def-x86-opcode (jbe.pt :jump) ((:label :insert-label))
     1861     #x76 nil nil #x3e)
     1862   (def-x86-opcode (jbe.pn :jump) ((:label :insert-label))
     1863     #x76 nil nil #x2e)
     1864   (def-x86-opcode (ja :jump) ((:label :insert-label))
     1865     #x77 nil nil)
     1866   (def-x86-opcode (ja.pt :jump) ((:label :insert-label))
     1867     #x77 nil nil #x3e)
     1868   (def-x86-opcode (ja.pn :jump) ((:label :insert-label))
     1869     #x77 nil nil #x2e)
     1870   (def-x86-opcode (js :jump) ((:label :insert-label))
     1871     #x78 nil nil)
     1872   (def-x86-opcode (js.pt :jump) ((:label :insert-label))
     1873     #x78 nil nil #x3e)
     1874   (def-x86-opcode (js.pn :jump) ((:label :insert-label))
     1875     #x78 nil nil #x2e)
     1876   (def-x86-opcode (jns :jump) ((:label :insert-label))
     1877     #x79 nil nil)
     1878   (def-x86-opcode (jns.pt :jump) ((:label :insert-label))
     1879     #x79 nil nil #x3e)
     1880   (def-x86-opcode (jns.pn :jump) ((:label :insert-label))
     1881     #x79 nil nil #x2e)
     1882   (def-x86-opcode (jpe :jump) ((:label :insert-label))
     1883     #x7a nil nil)
     1884   (def-x86-opcode (jpe.pt :jump) ((:label :insert-label))
     1885     #x7a nil nil #x3e)
     1886   (def-x86-opcode (jpe.pn :jump) ((:label :insert-label))
     1887     #x7a nil nil #x2e)
     1888   (def-x86-opcode (jpo :jump) ((:label :insert-label))
     1889     #x7b nil nil)
     1890   (def-x86-opcode (jpo.pt :jump) ((:label :insert-label))
     1891     #x7b nil nil #x3e)
     1892   (def-x86-opcode (jpo.pn :jump) ((:label :insert-label))
     1893     #x7b nil nil #x2e)
     1894   (def-x86-opcode (jl :jump) ((:label :insert-label))
     1895     #x7c nil nil)
     1896   (def-x86-opcode (jl.pt :jump) ((:label :insert-label))
     1897     #x7c nil nil #x3e)
     1898   (def-x86-opcode (jl.pn :jump) ((:label :insert-label))
     1899     #x7c nil nil #x2e)
     1900   (def-x86-opcode (jge :jump) ((:label :insert-label))
     1901     #x7d nil nil)
     1902   (def-x86-opcode (jge.pt :jump) ((:label :insert-label))
     1903     #x7d nil nil #x3e)
     1904   (def-x86-opcode (jge.pn :jump) ((:label :insert-label))
     1905     #x7d nil nil #x2e)
     1906   (def-x86-opcode (jle :jump) ((:label :insert-label))
     1907     #x7e nil nil)
     1908   (def-x86-opcode (jle.pt :jump) ((:label :insert-label))
     1909     #x7e nil nil #x3e)
     1910   (def-x86-opcode (jle.pn :jump) ((:label :insert-label))
     1911     #x7e nil nil #x2e)
     1912   (def-x86-opcode (jg :jump) ((:label :insert-label))
     1913     #x7f nil nil)
     1914   (def-x86-opcode (jg.pt :jump) ((:label :insert-label))
     1915     #x7f nil nil #x3e)
     1916   (def-x86-opcode (jg.pn :jump) ((:label :insert-label))
     1917     #x7f nil nil #x2e)
     1918
     1919   ;; jmp .  Translating the 8-bit pc-relative version to the 32-bit
     1920   ;;        pc-relative version happens during relaxation.
     1921   ;; On 32-bit, I think it's possible to use 16-bit pc-relative
     1922   ;; displacements---this would save a byte in instances where
     1923   ;; the displacement fit in 16 bits.
     1924   (def-x86-opcode (jmp :jump) ((:label :insert-label))
     1925     #xeb nil nil)
     1926
     1927   (def-x86-opcode (jmp :cpu64) ((:reg64 :insert-modrm-rm))
     1928     #xff #o340 #x0)
     1929   (def-x86-opcode (jmp :cpuno64) ((:reg32 :insert-modrm-rm))
     1930     #xff #o340 nil)
     1931
     1932   (def-x86-opcode jmp ((:anymem :insert-memory))
     1933     #xff #o040 #x0)
     1934
     1935   ;; lea
     1936   (def-x86-opcode (leaq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1937     #x8d 0 #x48)
     1938
     1939   (def-x86-opcode leal ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1940     #x8d 0 #x00)
     1941
     1942   (def-x86-opcode leaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1943     #x8d 0 #x00 #x66)
     1944
     1945   ;; leave
     1946   (def-x86-opcode leave ()
     1947     #xc9 nil nil)
     1948
     1949   ;; lock
     1950   (def-x86-opcode lock ()
     1951     #xf0 nil nil)
     1952
     1953   ;; lods
     1954   (def-x86-opcode lodsq ()
     1955     #xac nil #x48)
     1956
     1957   (def-x86-opcode lodsl ()
     1958     #xac nil nil)
     1959
     1960   ;; loop
     1961   (def-x86-opcode (loopq :cpu64) ((:label :insert-label))
     1962     #xe2 nil #x48)
     1963
     1964   (def-x86-opcode loopl ((:label :insert-label))
     1965     #xe2 nil nil)
     1966
     1967   (def-x86-opcode (loopzq :cpu64) ((:label :insert-label))
     1968     #xe1 nil #x48)
     1969
     1970   (def-x86-opcode loopzl ((:label :insert-label))
     1971     #xe1 nil nil)
     1972
     1973   (def-x86-opcode (loopnzq :cpu64) ((:label :insert-label))
     1974     #xe0 nil #x48)
     1975
     1976   (def-x86-opcode loopnzl ((:label :insert-label))
     1977     #xe0 nil nil)
     1978
     1979   ;; mov, including the MMX/XMM variants.
     1980   (def-x86-opcode movq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     1981     #x0f6f #o300 0)
     1982   (def-x86-opcode movq ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
     1983     #x0f7f #o0 0)
     1984   (def-x86-opcode movq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     1985     #x0f6f #o0 0)
     1986   (def-x86-opcode movq ((:regxmm :insert-xmm-reg) (:regxmm :insert-xmm-rm))
     1987     #x0f7e #o300 0 #xf3)
     1988   (def-x86-opcode movq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     1989     #x0f7e #o000 0 #xf3)
     1990   (def-x86-opcode movq ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     1991     #x0fd6 #o000 0 #x66)
     1992
     1993   (def-x86-opcode (movq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     1994     #x89 #o300 #x48)
     1995   (def-x86-opcode (movq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     1996     #x8b #o0 #x48)
     1997   (def-x86-opcode (movq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     1998     #x89 #o0 #x48)
     1999   (def-x86-opcode (movq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     2000     #xc7 #o300 #x48)
     2001   (def-x86-opcode (movq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2002     #xc7 #o000 #x48)
     2003   (def-x86-opcode (movq :cpu64) ((:imm64 :insert-imm64) (:reg64 :insert-opcode-reg))
     2004     #xb8 nil #x48)
     2005
     2006   (def-x86-opcode movl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2007     #x89 #o300 #x00)
     2008   (def-x86-opcode movl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2009     #x8b #o0 #x00)
     2010   (def-x86-opcode movl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2011     #x89 #o0 #x00)
     2012   (def-x86-opcode movl ((:imm32s :insert-imm32s) (:reg32 :insert-opcode-reg))
     2013     #xb8 nil #x00)
     2014   #+nil
     2015   (def-x86-opcode movl ((:self :insert-self) (:reg32 :insert-opcode-reg))
     2016     #xb8 nil #x00)
     2017   (def-x86-opcode movl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2018     #xc7 #o000 #x00)
     2019
     2020
     2021   (def-x86-opcode movw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2022     #x89 #o300 #x00 #x66)
     2023   (def-x86-opcode movw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2024     #x8b #o0 #x00  #x66)
     2025   (def-x86-opcode movw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2026     #x89 #o0 #x00 #x66)
     2027   (def-x86-opcode movw ((:imm16 :insert-imm16) (:reg16 :insert-opcode-reg))
     2028     #xb8 nil #x00 #x66)
     2029   (def-x86-opcode movw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2030     #xc7 #o000 #x00 #x66)
     2031
     2032   (def-x86-opcode movb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2033     #x88 #o300 0)
     2034   (def-x86-opcode movb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2035     #x8a #o0 0)
     2036   (def-x86-opcode movb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2037     #x88 #o0 0)
     2038   (def-x86-opcode movb ((:imm8s :insert-imm8s) (:reg8 :insert-opcode-reg))
     2039     #xb0 nil 0)
     2040   (def-x86-opcode movb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2041     #xc6 #o000 0)
     2042 
     2043   ;; movd
     2044   (def-x86-opcode (movd :cpu64) ((:reg64 :insert-modrm-rm) (:regmmx :insert-mmx-reg))
     2045     #x0f6e #o300 #x48)
     2046   (def-x86-opcode movd ((:reg32 :insert-modrm-rm) (:regmmx :insert-mmx-reg))
     2047     #x0f6e #o300 0)
     2048   (def-x86-opcode movd ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     2049     #x0f6e #o000 0)
     2050   (def-x86-opcode movd ((:regmmx :insert-mmx-reg) (:reg64 :insert-modrm-rm))
     2051     #x0f7e #o300 #x48)
     2052   (def-x86-opcode movd ((:regmmx :insert-mmx-reg) (:reg32 :insert-modrm-rm))
     2053     #x0f7e #o300 #x0)
     2054   (def-x86-opcode movd ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
     2055     #x0f7e #o000 #x0)
     2056
     2057   (def-x86-opcode (movd :cpu64) ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     2058     #x0f6e #o300 #x48 #x66)
     2059   (def-x86-opcode movd ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     2060     #x0f6e #o300 0 #x66)
     2061   (def-x86-opcode movd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2062     #x0f6e #o000 0 #x66)
     2063   (def-x86-opcode (movd :cpu64) ((:regxmm :insert-xmm-reg) (:reg64 :insert-modrm-rm))
     2064     #x0f7e #o300 #x48 #x66)
     2065   (def-x86-opcode movd ((:regxmm :insert-xmm-reg) (:reg32 :insert-modrm-rm))
     2066     #x0f7e #o300 #x0 #x66)
     2067   (def-x86-opcode movd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     2068     #x0f7e #o000 #x0 #x66)
     2069
     2070   ;; sign-extending mov
     2071   (def-x86-opcode movsbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     2072     #x0fbe #o300 0)
     2073   (def-x86-opcode movsbl ((:anymem :insert-memory)  (:reg32 :insert-modrm-reg))
     2074     #x0fbe #o000 0)
     2075   (def-x86-opcode movsbw ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2076     #x0fbe #o300 0 #x66)
     2077   (def-x86-opcode movsbw ((:anymem :insert-memory) (:reg16 :insert-modrm-rm))
     2078     #x0fbe #o300 0 #x66)
     2079   (def-x86-opcode (movsbq :cpu64) ((:reg8 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     2080     #x0fbe #o300 #x48)
     2081   (def-x86-opcode (movsbq :cpu64) ((:anymem :insert-memory)  (:reg64 :insert-modrm-reg))
     2082     #x0fbe #o000 #x48)
     2083   (def-x86-opcode movswl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     2084     #x0fbf #o300 0)
     2085   (def-x86-opcode movswl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2086     #x0fbf #o000 0)
     2087   (def-x86-opcode (movswq :cpu64) ((:reg16 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     2088     #x0fbf #o300 #x48)
     2089   (def-x86-opcode (movswq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     2090     #x0fbf #o000 #x48)
     2091   (def-x86-opcode (movslq :cpu64) ((:reg32 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     2092     #x63 #o300 #x48)
     2093   (def-x86-opcode (movslq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     2094     #x63 #o000 #x48)
     2095
     2096   ;; zero-extending MOVs
     2097   (def-x86-opcode movzbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     2098     #x0fb6 #o300 0)
     2099   (def-x86-opcode movzbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2100     #x0fb6 #o000 0)
     2101   (def-x86-opcode movzbw ((:reg8 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     2102     #x0fb6 #o300 0 #x66)
     2103   (def-x86-opcode movzbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2104     #x0fb6 #o300 0 #x66)
     2105   (def-x86-opcode movzwl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     2106     #x0fb7 #o300 0)
     2107   (def-x86-opcode movzwl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2108     #x0fb7 #o000 0)
     2109   (def-x86-opcode (movzbq :cpu64) ((:reg8 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     2110     #x0fb6 #o300 #x48)
     2111   (def-x86-opcode (movzbq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     2112     #x0fb6 #o000 #x48)
     2113   (def-x86-opcode (movzwq :cpu64) ((:reg16 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
     2114     #x0fb7 #o300 #x48)
     2115   (def-x86-opcode (movzwq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     2116     #x0fb7 #o000 #x48)
     2117
     2118   ;; mul
     2119   (def-x86-opcode (mulq :cpu64) ((:reg64 :insert-modrm-rm))
     2120     #xf7 #o340 #x48)
     2121   (def-x86-opcode (mulq :cpu64) ((:anymem :insert-memory))
     2122     #xf7 #o040 #x48)
     2123
     2124   (def-x86-opcode mull ((:reg32 :insert-modrm-rm))
     2125     #xf7 #o340 #x00)
     2126   (def-x86-opcode mull ((:anymem :insert-memory))
     2127     #xf7 #o040 #x00)
     2128
     2129   (def-x86-opcode mulw ((:reg16 :insert-modrm-rm))
     2130     #xf7 #o340 #x00 #x66)
     2131   (def-x86-opcode mulw ((:anymem :insert-memory))
     2132     #xf7 #o040 #x00 #x66)
     2133
     2134   (def-x86-opcode mulb ((:reg8 :insert-modrm-rm))
     2135     #xf6 #o340 #x00)
     2136   (def-x86-opcode mull ((:anymem :insert-memory))
     2137     #xf6 #o040 #x00)
     2138
     2139   ;; neg
     2140   (def-x86-opcode (negq :cpu64) ((:reg64 :insert-modrm-rm))
     2141     #xf7 #o330 #x48)
     2142   (def-x86-opcode (negq :cpu64) ((:anymem :insert-memory))
     2143     #xf7 #o030 #x48)
     2144
     2145   (def-x86-opcode negl ((:reg32 :insert-modrm-rm))
     2146     #xf7 #o330 #x00)
     2147   (def-x86-opcode negl ((:anymem :insert-memory))
     2148     #xf7 #o030 #x00)
     2149
     2150   (def-x86-opcode negw ((:reg16 :insert-modrm-rm))
     2151     #xf7 #o330 #x00 #x66)
     2152   (def-x86-opcode negw ((:anymem :insert-memory))
     2153     #xf7 #o030 #x00 #x66)
     2154
     2155   (def-x86-opcode negb ((:reg8 :insert-modrm-rm))
     2156     #xf6 #o330 #x00)
     2157   (def-x86-opcode negb ((:anymem :insert-memory))
     2158     #xf6 #o030 #x00)
     2159
     2160   ;; nop
     2161   (def-x86-opcode nop ()
     2162     #x90 nil nil)
     2163
     2164   ;; not
     2165   (def-x86-opcode (notq :cpu64) ((:reg64 :insert-modrm-rm))
     2166     #xf7 #o320 #x48)
     2167   (def-x86-opcode (notq :cpu64) ((:anymem :insert-memory))
     2168     #xf7 #o020 #x48)
     2169   (def-x86-opcode notl ((:reg32 :insert-modrm-rm))
     2170     #xf7 #o320 #x0)
     2171   (def-x86-opcode notl ((:anymem :insert-memory))
     2172     #xf7 #o020 #x0)
     2173   (def-x86-opcode notw ((:reg16 :insert-modrm-rm))
     2174     #xf7 #o320 #x0 #x66)
     2175   (def-x86-opcode notw ((:anymem :insert-memory))
     2176     #xf7 #o020 #x0 #x66)
     2177   (def-x86-opcode notb ((:reg8 :insert-modrm-rm))
     2178     #xf6 #o320 #x0)
     2179   (def-x86-opcode notb ((:anymem :insert-memory))
     2180     #xf6 #o020 #x0)
     2181
     2182   ;; or
     2183   (def-x86-opcode (orq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2184     #x09 #o300 #x48)
     2185   (def-x86-opcode (orq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     2186     #x0b #o000 #x48)
     2187   (def-x86-opcode (orq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2188     #x09 #x00 #x48)
     2189   (def-x86-opcode (orq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     2190     #x83 #o310 #x48)
     2191   (def-x86-opcode (orq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2192     #x0d nil #x48)
     2193   (def-x86-opcode (orq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     2194     #x81 #o310 #x48)
     2195   (def-x86-opcode (orq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2196     #x83 #o010 #x48)
     2197   (def-x86-opcode (orq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2198     #x81 #o010 #x48)
     2199
     2200   (def-x86-opcode orl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2201     #x09 #o300 #x00)
     2202   (def-x86-opcode orl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2203     #x0b #o000 #x00)
     2204   (def-x86-opcode orl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2205     #x09 #x00 #x00)
     2206   (def-x86-opcode orl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     2207     #x83 #o310 #x00)
     2208   (def-x86-opcode orl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2209     #x0d nil nil)
     2210   (def-x86-opcode orl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     2211     #x81 #o310 #x00)
     2212   (def-x86-opcode orl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2213     #x83 #o010 #x00)
     2214   (def-x86-opcode orl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2215     #x81 #o010 #x00)
     2216
     2217   (def-x86-opcode orw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2218     #x09 #o300 #x00 #x66)
     2219   (def-x86-opcode orw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2220     #x0b #o000 #x00 #x66)
     2221   (def-x86-opcode orw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2222     #x09 #x00 #x00 #x66)
     2223   (def-x86-opcode orw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     2224     #x83 #o310 #x00 #x66)
     2225   (def-x86-opcode orw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     2226     #x0d nil nil #x66)
     2227   (def-x86-opcode orw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     2228     #x81 #o310 #x00 #x66)
     2229   (def-x86-opcode orw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2230     #x83 #o010 #x00 #x66)
     2231   (def-x86-opcode orw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2232     #x81 #o010 #x00 #x66)
     2233
     2234   (def-x86-opcode orb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2235     #x08 #o300 #x00)
     2236   (def-x86-opcode orb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2237     #x0a #o000 #x00)
     2238   (def-x86-opcode orb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2239     #x08 #x00 #x00)
     2240   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     2241     #x0c nil nil)
     2242   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2243     #x80 #o310 #x00)
     2244   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2245     #x80 #o310 #x00)
     2246   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2247     #x80 #o010 #x00)
     2248
     2249   ;; pop
     2250   (def-x86-opcode (popq :cpu64) ((:reg64 :insert-opcode-reg))
     2251     #x58 nil #x0)
     2252   (def-x86-opcode (popq :cpu64) ((:anymem :insert-memory))
     2253     #x8f #o000 #x0)
     2254
     2255   (def-x86-opcode (popl :cpuno64) ((:reg32 :insert-opcode-reg))
     2256     #x58 nil nil)
     2257   (def-x86-opcode (popl :cpuno64) ((:anymem :insert-memory))
     2258     #x8f #o000 nil)
     2259
     2260   (def-x86-opcode popw ((:reg16 :insert-opcode-reg))
     2261     #x58 nil #x0 #x66)
     2262   (def-x86-opcode popw ((:anymem :insert-memory))
     2263     #x8f #o000 #x0 #x66)
     2264
     2265   ;; popf
     2266   (def-x86-opcode (popfq :cpu64) ()
     2267     #x9d nil #x48)
     2268   (def-x86-opcode popfl ()
     2269     #x9d nil nil)
     2270
     2271   ;; push .  It's not clear how "pushw $imm16" is encoded.
     2272   (def-x86-opcode (pushq :cpu64) ((:reg64 :insert-opcode-reg))
     2273     #x50 nil #x0)
     2274   (def-x86-opcode (pushq :cpu64) ((:anymem :insert-memory))
     2275     #xff #o060 #x0)
     2276   (def-x86-opcode (pushq :cpu64) ((:imm8s :insert-imm8s))
     2277     #x6a nil nil)
     2278   (def-x86-opcode (pushq :cpu64) ((:imm32s :insert-imm32s))
     2279     #x68 nil nil)
     2280
     2281   (def-x86-opcode (pushl :cpuno64) ((:reg32 :insert-opcode-reg))
     2282     #x50 nil nil)
     2283   (def-x86-opcode (pushl :cpuno64) ((:anymem :insert-memory))
     2284     #xff #o060 nil)
     2285   (def-x86-opcode (pushl :cpuno64) ((:imm8s :insert-imm8s))
     2286     #x6a nil nil)
     2287   (def-x86-opcode (pushl :cpuno64) ((:imm32s :insert-imm32s))
     2288     #x68 nil nil)
     2289
     2290   (def-x86-opcode pushw ((:reg16 :insert-opcode-reg))
     2291     #x50 nil 0 #x66)
     2292   (def-x86-opcode pushw ((:anymem :insert-memory))
     2293     #xff #o060 #x0 #x66)
     2294
     2295   ;; pushf
     2296   (def-x86-opcode (pushfq :cpu64) ()
     2297     #x9c nil nil)
     2298   (def-x86-opcode (pushfl :cpuno64) ()
     2299     #x9c nil nil)
     2300   (def-x86-opcode pushfw ()
     2301     #x9c nil nil #x66)
     2302
     2303   ;; rcl.  Note that the :ShiftCount operand type only matches %cl.
     2304   (def-x86-opcode (rclq :cpu64) ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
     2305     #xd1 #o320 #x48)
     2306   (def-x86-opcode (rclq :cpu64) ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2307     #xd1 #o020 #x48)
     2308   (def-x86-opcode (rclq :cpu64) ((:reg64 :insert-modrm-rm))
     2309     #xd1 #o320 #x48)
     2310   (def-x86-opcode (rclq :cpu64) ((:anymem :insert-memory))
     2311     #xd1 #o020 #x48)
     2312   (def-x86-opcode (rclq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     2313     #xc1 #o320 #x48)
     2314   (def-x86-opcode (rclq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
     2315     #xd3 #o320 #x48)
     2316 
     2317   (def-x86-opcode rcll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2318     #xd1 #o320 #x0)
     2319   (def-x86-opcode rcll ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2320     #xd1 #o020 #x0)
     2321   (def-x86-opcode rcll ((:reg32 :insert-modrm-rm))
     2322     #xd1 #o320 #x0)
     2323   (def-x86-opcode rcll ((:anymem :insert-memory))
     2324     #xd1 #o020 #x0)
     2325   (def-x86-opcode rcll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2326     #xc1 #o320 #x0)
     2327   (def-x86-opcode rcll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2328     #xd3 #o320 #x0)
     2329
     2330   (def-x86-opcode rclw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2331     #xd1 #o320 #x0 #x66)
     2332   (def-x86-opcode rclw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2333     #xd1 #o020 #x0 #x66)
     2334   (def-x86-opcode rclw ((:reg16 :insert-modrm-rm))
     2335     #xd1 #o320 #x0 #x66)
     2336   (def-x86-opcode rclw ((:anymem :insert-memory))
     2337     #xd1 #o020 #x0 #x66)
     2338   (def-x86-opcode rclw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2339     #xc1 #o320 #x0 #x66)
     2340   (def-x86-opcode rclw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2341     #xd3 #o320 #x0 #x66)
     2342
     2343   (def-x86-opcode rclb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2344     #xd0 #o320 #x0)
     2345   (def-x86-opcode rclb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2346     #xd0 #o020 #x0)
     2347   (def-x86-opcode rclb ((:reg8 :insert-modrm-rm))
     2348     #xd0 #o320 #x0)
     2349   (def-x86-opcode rclb ((:anymem :insert-memory))
     2350     #xd0 #o020 #x0)
     2351   (def-x86-opcode rclb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2352     #xc0 #o320 #x0)
     2353   (def-x86-opcode rclb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2354     #xd2 #o320 #x0)
     2355
     2356   ;; rcr
     2357   (def-x86-opcode (rcrq :cpu64) ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
     2358     #xd1 #o330 #x48)
     2359   (def-x86-opcode (rcrq :cpu64) ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2360     #xd1 #o030 #x48)
     2361   (def-x86-opcode (rcrq :cpu64) ((:reg64 :insert-modrm-rm))
     2362     #xd1 #o330 #x48)
     2363   (def-x86-opcode (rcrq :cpu64) ((:anymem :insert-memory))
     2364     #xd1 #o030 #x48)
     2365   (def-x86-opcode (rcrq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     2366     #xc1 #o330 #x48)
     2367   (def-x86-opcode (rcrq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
     2368     #xd3 #o330 #x48)
     2369 
     2370   (def-x86-opcode rcrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2371     #xd1 #o330 #x0)
     2372   (def-x86-opcode rcrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2373     #xd1 #o030 #x0)
     2374   (def-x86-opcode rcrl ((:reg32 :insert-modrm-rm))
     2375     #xd1 #o330 #x0)
     2376   (def-x86-opcode rcrl ((:anymem :insert-memory))
     2377     #xd1 #o030 #x0)
     2378   (def-x86-opcode rcrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2379     #xc1 #o330 #x0)
     2380   (def-x86-opcode rcrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2381     #xd3 #o330 #x0)
     2382
     2383   (def-x86-opcode rcrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2384     #xd1 #o330 #x0 #x66)
     2385   (def-x86-opcode rcrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2386     #xd1 #o030 #x0 #x66)
     2387   (def-x86-opcode rcrw ((:reg16 :insert-modrm-rm))
     2388     #xd1 #o330 #x0 #x66)
     2389   (def-x86-opcode rcrw ((:anymem :insert-memory))
     2390     #xd1 #o030 #x0 #x66)
     2391   (def-x86-opcode rcrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2392     #xc1 #o330 #x0 #x66)
     2393   (def-x86-opcode rcrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2394     #xd3 #o330 #x0 #x66)
     2395
     2396   (def-x86-opcode rcrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2397     #xd0 #o330 #x0)
     2398   (def-x86-opcode rcrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2399     #xd0 #o030 #x0)
     2400   (def-x86-opcode rcrb ((:reg8 :insert-modrm-rm))
     2401     #xd0 #o330 #x0)
     2402   (def-x86-opcode rcrb ((:anymem :insert-memory))
     2403     #xd0 #o030 #x0)
     2404   (def-x86-opcode rcrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2405     #xc0 #o330 #x0)
     2406   (def-x86-opcode rcrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2407     #xd2 #o330 #x0)
     2408
     2409   ;; repe, repne.  These are really prefixes, that should
     2410   ;; only be used before string instructions.
     2411   (def-x86-opcode repe ()
     2412     #xf3 nil nil)
     2413
     2414   (def-x86-opcode repne ()
     2415     #xf2 nil nil)
     2416
     2417   ;; ret
     2418   (def-x86-opcode ret ()
     2419     #xc3 nil nil)
     2420
     2421   (def-x86-opcode ret ((:imm16 :insert-imm16))
     2422     #xc2 nil nil)
     2423
     2424   ;; rol
     2425   (def-x86-opcode (rolq :cpu64) ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
     2426     #xd1 #o300 #x48)
     2427   (def-x86-opcode (rolq :cpu64) ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2428     #xd1 #o000 #x48)
     2429   (def-x86-opcode (rolq :cpu64) ((:reg64 :insert-modrm-rm))
     2430     #xd1 #o300 #x48)
     2431   (def-x86-opcode (rolq :cpu64) ((:anymem :insert-memory))
     2432     #xd1 #o000 #x48)
     2433   (def-x86-opcode (rolq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     2434     #xc1 #o300 #x48)
     2435   (def-x86-opcode (rolq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
     2436     #xd3 #o300 #x48)
     2437 
     2438   (def-x86-opcode roll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2439     #xd1 #o300 #x0)
     2440   (def-x86-opcode roll ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2441     #xd1 #o000 #x0)
     2442   (def-x86-opcode roll ((:reg32 :insert-modrm-rm))
     2443     #xd1 #o300 #x0)
     2444   (def-x86-opcode roll ((:anymem :insert-memory))
     2445     #xd1 #o000 #x0)
     2446   (def-x86-opcode roll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2447     #xc1 #o300 #x0)
     2448   (def-x86-opcode roll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2449     #xd3 #o300 #x0)
     2450
     2451   (def-x86-opcode rolw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2452     #xd1 #o300 #x0 #x66)
     2453   (def-x86-opcode rolw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2454     #xd1 #o000 #x0 #x66)
     2455   (def-x86-opcode rolw ((:reg16 :insert-modrm-rm))
     2456     #xd1 #o300 #x0 #x66)
     2457   (def-x86-opcode rolw ((:anymem :insert-memory))
     2458     #xd1 #o000 #x0 #x66)
     2459   (def-x86-opcode rolw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2460     #xc1 #o300 #x0 #x66)
     2461   (def-x86-opcode rolw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2462     #xd3 #o300 #x0 #x66)
     2463
     2464   (def-x86-opcode rolb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2465     #xd0 #o300 #x0)
     2466   (def-x86-opcode rolb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2467     #xd0 #o000 #x0)
     2468   (def-x86-opcode rolb ((:reg8 :insert-modrm-rm))
     2469     #xd0 #o300 #x0)
     2470   (def-x86-opcode rolb ((:anymem :insert-memory))
     2471     #xd0 #o000 #x0)
     2472   (def-x86-opcode rolb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2473     #xc0 #o300 #x0)
     2474   (def-x86-opcode rolb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2475     #xd2 #o300 #x0)
     2476
     2477   ;; ror
     2478   (def-x86-opcode (rorq :cpu64) ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
     2479     #xd1 #o310 #x48)
     2480   (def-x86-opcode (rorq :cpu64) ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2481     #xd1 #o010 #x48)
     2482   (def-x86-opcode (rorq :cpu64) ((:reg64 :insert-modrm-rm))
     2483     #xd1 #o310 #x48)
     2484   (def-x86-opcode (rorq :cpu64) ((:anymem :insert-memory))
     2485     #xd1 #o010 #x48)
     2486   (def-x86-opcode (rorq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     2487     #xc1 #o310 #x48)
     2488   (def-x86-opcode (rorq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
     2489     #xd3 #o310 #x48)
     2490 
     2491   (def-x86-opcode rorl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2492     #xd1 #o310 #x0)
     2493   (def-x86-opcode rorl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2494     #xd1 #o010 #x0)
     2495   (def-x86-opcode rorl ((:reg32 :insert-modrm-rm))
     2496     #xd1 #o310 #x0)
     2497   (def-x86-opcode rorl ((:anymem :insert-memory))
     2498     #xd1 #o010 #x0)
     2499   (def-x86-opcode rorl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2500     #xc1 #o310 #x0)
     2501   (def-x86-opcode rorl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2502     #xd3 #o310 #x0)
     2503
     2504   (def-x86-opcode rorw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2505     #xd1 #o310 #x0 #x66)
     2506   (def-x86-opcode rorw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2507     #xd1 #o010 #x0 #x66)
     2508   (def-x86-opcode rorw ((:reg16 :insert-modrm-rm))
     2509     #xd1 #o310 #x0 #x66)
     2510   (def-x86-opcode rorw ((:anymem :insert-memory))
     2511     #xd1 #o010 #x0 #x66)
     2512   (def-x86-opcode rorw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2513     #xc1 #o310 #x0 #x66)
     2514   (def-x86-opcode rorw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2515     #xd3 #o310 #x0 #x66)
     2516
     2517   (def-x86-opcode rorb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2518     #xd0 #o310 #x0)
     2519   (def-x86-opcode rorb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2520     #xd0 #o010 #x0)
     2521   (def-x86-opcode rorb ((:reg8 :insert-modrm-rm))
     2522     #xd0 #o310 #x0)
     2523   (def-x86-opcode rorb ((:anymem :insert-memory))
     2524     #xd0 #o010 #x0)
     2525   (def-x86-opcode rorb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2526     #xc0 #o310 #x0)
     2527   (def-x86-opcode rorb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2528     #xd2 #o310 #x0)
     2529
     2530   ;; sar
     2531   (def-x86-opcode (sarq :cpu64) ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
     2532     #xd1 #o370 #x48)
     2533   (def-x86-opcode (sarq :cpu64) ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2534     #xd1 #o070 #x48)
     2535   (def-x86-opcode (sarq :cpu64) ((:reg64 :insert-modrm-rm))
     2536     #xd1 #o370 #x48)
     2537   (def-x86-opcode (sarq :cpu64) ((:anymem :insert-memory))
     2538     #xd1 #o070 #x48)
     2539   (def-x86-opcode (sarq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     2540     #xc1 #o370 #x48)
     2541   (def-x86-opcode (sarq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
     2542     #xd3 #o370 #x48)
     2543 
     2544   (def-x86-opcode sarl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2545     #xd1 #o370 #x0)
     2546   (def-x86-opcode sarl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2547     #xd1 #o070 #x0)
     2548   (def-x86-opcode sarl ((:reg32 :insert-modrm-rm))
     2549     #xd1 #o370 #x0)
     2550   (def-x86-opcode sarl ((:anymem :insert-memory))
     2551     #xd1 #o070 #x0)
     2552   (def-x86-opcode sarl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2553     #xc1 #o370 #x0)
     2554   (def-x86-opcode sarl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2555     #xd3 #o370 #x0)
     2556
     2557   (def-x86-opcode sarw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2558     #xd1 #o370 #x0 #x66)
     2559   (def-x86-opcode sarw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2560     #xd1 #o070 #x0 #x66)
     2561   (def-x86-opcode sarw ((:reg16 :insert-modrm-rm))
     2562     #xd1 #o370 #x0 #x66)
     2563   (def-x86-opcode sarw ((:anymem :insert-memory))
     2564     #xd1 #o070 #x0 #x66)
     2565   (def-x86-opcode sarw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2566     #xc1 #o370 #x0 #x66)
     2567   (def-x86-opcode sarw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2568     #xd3 #o370 #x0 #x66)
     2569
     2570   (def-x86-opcode sarb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2571     #xd0 #o370 #x0)
     2572   (def-x86-opcode sarb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2573     #xd0 #o070 #x0)
     2574   (def-x86-opcode sarb ((:reg8 :insert-modrm-rm))
     2575     #xd0 #o370 #x0)
     2576   (def-x86-opcode sarb ((:anymem :insert-memory))
     2577     #xd0 #o070 #x0)
     2578   (def-x86-opcode sarb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2579     #xc0 #o370 #x0)
     2580   (def-x86-opcode sarb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2581     #xd2 #o370 #x0)
     2582
     2583   ;; sbb
     2584   (def-x86-opcode (sbbq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2585     #x19 #o300 #x48)
     2586   (def-x86-opcode (sbbq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     2587     #x1b #o000 #x48)
     2588   (def-x86-opcode (sbbq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2589     #x19 #x00 #x48)
     2590   (def-x86-opcode (sbbq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     2591     #x83 #o330 #x48)
     2592   (def-x86-opcode (sbbq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2593     #x1d nil #x48)
     2594   (def-x86-opcode (sbbq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     2595     #x81 #o330 #x48)
     2596   (def-x86-opcode (sbbq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2597     #x83 #o030 #x48)
     2598   (def-x86-opcode (sbbq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2599     #x81 #o030 #x48)
     2600
     2601   (def-x86-opcode sbbl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2602     #x19 #o300 #x00)
     2603   (def-x86-opcode sbbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2604     #x1b #o000 #x00)
     2605   (def-x86-opcode sbbl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2606     #x19 #x00 #x00)
     2607   (def-x86-opcode sbbl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     2608     #x83 #o330 #x00)
     2609   (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2610     #x1d nil nil)
     2611   (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     2612     #x81 #o330 #x00)
     2613   (def-x86-opcode sbbl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2614     #x83 #o030 #x00)
     2615   (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2616     #x81 #o030 #x00)
     2617
     2618   (def-x86-opcode sbbw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2619     #x19 #o300 #x00 #x66)
     2620   (def-x86-opcode sbbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2621     #x1b #o000 #x00 #x66)
     2622   (def-x86-opcode sbbw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2623     #x19 #x00 #x00 #x66)
     2624   (def-x86-opcode sbbw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     2625     #x83 #o330 #x00 #x66)
     2626   (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     2627     #x1d nil nil #x66)
     2628   (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     2629     #x81 #o330 #x00 #x66)
     2630   (def-x86-opcode sbbw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2631     #x83 #o030 #x00 #x66)
     2632   (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2633     #x81 #o030 #x00 #x66)
     2634
     2635   (def-x86-opcode sbbb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2636     #x18 #o300 #x00)
     2637   (def-x86-opcode sbbb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2638     #x1a #o000 #x00)
     2639   (def-x86-opcode sbbb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2640     #x18 #x00 #x00)
     2641   (def-x86-opcode sbbb ((:imm8 :insert-imm8) (:acc :insert-nothing))
     2642     #x1c nil nil)
     2643   (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2644     #x80 #o330 #x00)
     2645   (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2646     #x80 #o330 #x00)
     2647   (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2648     #x80 #o030 #x00)
     2649
     2650   ;; scas
     2651   (def-x86-opcode (scasq :cpu64) ()
     2652     #xaf nil #x48)
     2653   (def-x86-opcode scasl ()
     2654     #xaf nil nil)
     2655   (def-x86-opcode scasw ()
     2656     #xaf nil nil #x66)
     2657   (def-x86-opcode scasb ()
     2658     #xae nil nil)
     2659
     2660
     2661   ;; setcc
     2662   (def-x86-opcode setcc ((:imm8 :insert-cc) (:reg8 :insert-modrm-rm))
     2663     #x0f90 #o300 0)     
     2664   (def-x86-opcode seto ((:reg8 :insert-modrm-rm))
     2665     #x0f90 #o300 0)
     2666   (def-x86-opcode seto ((:anymem :insert-memory))
     2667     #x0f90 #o000 0)
     2668   (def-x86-opcode setno ((:reg8 :insert-modrm-rm))
     2669     #x0f91 #o300 0)
     2670   (def-x86-opcode setno ((:anymem :insert-memory))
     2671     #x0f91 #o000 0)
     2672   (def-x86-opcode setb ((:reg8 :insert-modrm-rm))
     2673     #x0f92 #o300 0)
     2674   (def-x86-opcode setb ((:anymem :insert-memory))
     2675     #x0f92 #o000 0)
     2676   (def-x86-opcode setc ((:reg8 :insert-modrm-rm))
     2677     #x0f92 #o300 0)
     2678   (def-x86-opcode setc ((:anymem :insert-memory))
     2679     #x0f92 #o000 0)
     2680   (def-x86-opcode setae ((:reg8 :insert-modrm-rm))
     2681     #x0f93 #o300 0)
     2682   (def-x86-opcode setae ((:anymem :insert-memory))
     2683     #x0f93 #o000 0)
     2684   (def-x86-opcode sete ((:reg8 :insert-modrm-rm))
     2685     #x0f94 #o300 0)
     2686   (def-x86-opcode sete ((:anymem :insert-memory))
     2687     #x0f94 #o000 0)
     2688   (def-x86-opcode setne ((:reg8 :insert-modrm-rm))
     2689     #x0f95 #o300 0)
     2690   (def-x86-opcode setne ((:anymem :insert-memory))
     2691     #x0f95 #o000 0)
     2692   (def-x86-opcode setbe ((:reg8 :insert-modrm-rm))
     2693     #x0f96 #o300 0)
     2694   (def-x86-opcode setbe ((:anymem :insert-memory))
     2695     #x0f96 #o000 0)
     2696   (def-x86-opcode seta ((:reg8 :insert-modrm-rm))
     2697     #x0f97 #o300 0)
     2698   (def-x86-opcode seta ((:anymem :insert-memory))
     2699     #x0f97 #o000 0)
     2700   (def-x86-opcode sets ((:reg8 :insert-modrm-rm))
     2701     #x0f98 #o300 0)
     2702   (def-x86-opcode sets ((:anymem :insert-memory))
     2703     #x0f98 #o000 0)
     2704   (def-x86-opcode setns ((:reg8 :insert-modrm-rm))
     2705     #x0f99 #o300 0)
     2706   (def-x86-opcode setns ((:anymem :insert-memory))
     2707     #x0f99 #o000 0)
     2708   (def-x86-opcode setpe ((:reg8 :insert-modrm-rm))
     2709     #x0f9a #o300 0)
     2710   (def-x86-opcode setpe ((:anymem :insert-memory))
     2711     #x0f9a #o000 0)
     2712   (def-x86-opcode setpo ((:reg8 :insert-modrm-rm))
     2713     #x0f9b #o300 0)
     2714   (def-x86-opcode setpo ((:anymem :insert-memory))
     2715     #x0f9b #o000 0)
     2716   (def-x86-opcode setl ((:reg8 :insert-modrm-rm))
     2717     #x0f9c #o300 0)
     2718   (def-x86-opcode setl ((:anymem :insert-memory))
     2719     #x0f9c #o000 0)
     2720   (def-x86-opcode setge ((:reg8 :insert-modrm-rm))
     2721     #x0f9d #o300 0)
     2722   (def-x86-opcode setge ((:anymem :insert-memory))
     2723     #x0f9d #o000 0)
     2724   (def-x86-opcode setle ((:reg8 :insert-modrm-rm))
     2725     #x0f9e #o300 0)
     2726   (def-x86-opcode setle ((:anymem :insert-memory))
     2727     #x0f9e #o000 0)
     2728   (def-x86-opcode setg ((:reg8 :insert-modrm-rm))
     2729     #x0f9f #o300 0)
     2730   (def-x86-opcode setg ((:anymem :insert-memory))
     2731     #x0f9f #o000 0)
     2732
     2733   ;; shl
     2734   (def-x86-opcode (shlq :cpu64) ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
     2735     #xd1 #o340 #x48)
     2736   (def-x86-opcode (shlq :cpu64) ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2737     #xd1 #o040 #x48)
     2738   (def-x86-opcode (shlq :cpu64) ((:reg64 :insert-modrm-rm))
     2739     #xd1 #o340 #x48)
     2740   (def-x86-opcode (shlq :cpu64) ((:anymem :insert-memory))
     2741     #xd1 #o040 #x48)
     2742   (def-x86-opcode (shlq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     2743     #xc1 #o340 #x48)
     2744   (def-x86-opcode (shlq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
     2745     #xd3 #o340 #x48)
     2746 
     2747   (def-x86-opcode shll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2748     #xd1 #o340 #x0)
     2749   (def-x86-opcode shll ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2750     #xd1 #o040 #x0)
     2751   (def-x86-opcode shll ((:reg32 :insert-modrm-rm))
     2752     #xd1 #o340 #x0)
     2753   (def-x86-opcode shll ((:anymem :insert-memory))
     2754     #xd1 #o040 #x0)
     2755   (def-x86-opcode shll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2756     #xc1 #o340 #x0)
     2757   (def-x86-opcode shll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2758     #xd3 #o340 #x0)
     2759
     2760   (def-x86-opcode shlw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2761     #xd1 #o340 #x0 #x66)
     2762   (def-x86-opcode shlw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2763     #xd1 #o040 #x0 #x66)
     2764   (def-x86-opcode shlw ((:reg16 :insert-modrm-rm))
     2765     #xd1 #o340 #x0 #x66)
     2766   (def-x86-opcode shlw ((:anymem :insert-memory))
     2767     #xd1 #o040 #x0 #x66)
     2768   (def-x86-opcode shlw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2769     #xc1 #o340 #x0 #x66)
     2770   (def-x86-opcode shlw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2771     #xd3 #o340 #x0 #x66)
     2772
     2773   (def-x86-opcode shlb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2774     #xd0 #o340 #x0)
     2775   (def-x86-opcode shlb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2776     #xd0 #o040 #x0)
     2777   (def-x86-opcode shlb ((:reg8 :insert-modrm-rm))
     2778     #xd0 #o340 #x0)
     2779   (def-x86-opcode shlb ((:anymem :insert-memory))
     2780     #xd0 #o040 #x0)
     2781   (def-x86-opcode shlb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2782     #xc0 #o340 #x0)
     2783   (def-x86-opcode shlb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2784     #xd2 #o340 #x0)
     2785
     2786   ;; shld
     2787   (def-x86-opcode (shldq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2788     #x0fa4 #o300 #x48)
     2789   (def-x86-opcode (shldq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2790     #x0fa4 #o000 #x48)
     2791   (def-x86-opcode (shldq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2792     #x0fa5 #o300 #x48)
     2793   (def-x86-opcode (shldq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2794     #x0fa5 #o000 #x48)
     2795   (def-x86-opcode (shldq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2796     #x0fa5 #o300 #x48)
     2797   (def-x86-opcode (shldq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2798     #x0fa5 #o000 #x48)
     2799
     2800   (def-x86-opcode shldl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2801     #x0fa4 #o300 #x0)
     2802   (def-x86-opcode shldl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2803     #x0fa4 #o000 #x0)
     2804   (def-x86-opcode shldl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2805     #x0fa5 #o300 #x0)
     2806   (def-x86-opcode shldl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2807     #x0fa5 #o000 #x0)
     2808   (def-x86-opcode shldl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2809     #x0fa5 #o300 #x0)
     2810   (def-x86-opcode shldl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2811     #x0fa5 #o000 #x0)
     2812
     2813   (def-x86-opcode shldw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2814     #x0fa4 #o300 #x0 #x66)
     2815   (def-x86-opcode shldw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2816     #x0fa4 #o000 #x0 #x66)
     2817   (def-x86-opcode shldw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2818     #x0fa5 #o300 #x0 #x66)
     2819   (def-x86-opcode shldw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2820     #x0fa5 #o000 #x0 #x66)
     2821   (def-x86-opcode shldw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2822     #x0fa5 #o300 #x0 #x66)
     2823   (def-x86-opcode shldw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2824     #x0fa5 #o000 #x0 #x66)
     2825
     2826   ;; shr
     2827   (def-x86-opcode (shrq :cpu64) ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
     2828     #xd1 #o350 #x48)
     2829   (def-x86-opcode (shrq :cpu64) ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2830     #xd1 #o050 #x48)
     2831   (def-x86-opcode (shrq :cpu64) ((:reg64 :insert-modrm-rm))
     2832     #xd1 #o350 #x48)
     2833   (def-x86-opcode (shrq :cpu64) ((:anymem :insert-memory))
     2834     #xd1 #o050 #x48)
     2835   (def-x86-opcode (shrq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
     2836     #xc1 #o350 #x48)
     2837   (def-x86-opcode (shrq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
     2838     #xd3 #o350 #x48)
     2839 
     2840   (def-x86-opcode shrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2841     #xd1 #o350 #x0)
     2842   (def-x86-opcode shrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2843     #xd1 #o050 #x0)
     2844   (def-x86-opcode shrl ((:reg32 :insert-modrm-rm))
     2845     #xd1 #o350 #x0)
     2846   (def-x86-opcode shrl ((:anymem :insert-memory))
     2847     #xd1 #o050 #x0)
     2848   (def-x86-opcode shrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2849     #xc1 #o350 #x0)
     2850   (def-x86-opcode shrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2851     #xd3 #o350 #x0)
     2852
     2853   (def-x86-opcode shrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2854     #xd1 #o350 #x0 #x66)
     2855   (def-x86-opcode shrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2856     #xd1 #o050 #x0 #x66)
     2857   (def-x86-opcode shrw ((:reg16 :insert-modrm-rm))
     2858     #xd1 #o350 #x0 #x66)
     2859   (def-x86-opcode shrw ((:anymem :insert-memory))
     2860     #xd1 #o050 #x0 #x66)
     2861   (def-x86-opcode shrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2862     #xc1 #o350 #x0 #x66)
     2863   (def-x86-opcode shrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2864     #xd3 #o350 #x0 #x66)
     2865
     2866   (def-x86-opcode shrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2867     #xd0 #o350 #x0)
     2868   (def-x86-opcode shrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2869     #xd0 #o050 #x0)
     2870   (def-x86-opcode shrb ((:reg8 :insert-modrm-rm))
     2871     #xd0 #o350 #x0)
     2872   (def-x86-opcode shrb ((:anymem :insert-memory))
     2873     #xd0 #o050 #x0)
     2874   (def-x86-opcode shrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2875     #xc0 #o350 #x0)
     2876   (def-x86-opcode shrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2877     #xd2 #o350 #x0)
     2878
     2879   ;; shrd
     2880   (def-x86-opcode (shrdq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2881     #x0fac #o300 #x48)
     2882   (def-x86-opcode (shrdq :cpu64) ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2883     #x0fac #o000 #x48)
     2884   (def-x86-opcode (shrdq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2885     #x0fad #o300 #x48)
     2886   (def-x86-opcode (shrdq :cpu64) ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2887     #x0fad #o000 #x48)
     2888   (def-x86-opcode (shrdq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2889     #x0fad #o300 #x48)
     2890   (def-x86-opcode (shrdq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2891     #x0fad #o000 #x48)
     2892
     2893   (def-x86-opcode shrdl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2894     #x0fac #o300 #x0)
     2895   (def-x86-opcode shrdl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2896     #x0fac #o000 #x0)
     2897   (def-x86-opcode shrdl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2898     #x0fad #o300 #x0)
     2899   (def-x86-opcode shrdl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2900     #x0fad #o000 #x0)
     2901   (def-x86-opcode shrdl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2902     #x0fad #o300 #x0)
     2903   (def-x86-opcode shrdl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2904     #x0fad #o000 #x0)
     2905
     2906   (def-x86-opcode shrdw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2907     #x0fac #o300 #x0 #x66)
     2908   (def-x86-opcode shrdw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2909     #x0fac #o000 #x0 #x66)
     2910   (def-x86-opcode shrdw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2911     #x0fad #o300 #x0 #x66)
     2912   (def-x86-opcode shrdw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2913     #x0fad #o000 #x0 #x66)
     2914   (def-x86-opcode shrdw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2915     #x0fad #o300 #x0 #x66)
     2916   (def-x86-opcode shrdw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2917     #x0fad #o000 #x0 #x66)
     2918
     2919   ;; stc
     2920   (def-x86-opcode stc ()
     2921     #xf9 nil nil)
     2922
     2923   ;; std
     2924   (def-x86-opcode std ()
     2925     #xfd nil nil)
     2926
     2927   ;; sub
     2928   (def-x86-opcode (subq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2929     #x29 #o300 #x48)
     2930   (def-x86-opcode (subq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     2931     #x2b #o000 #x48)
     2932   (def-x86-opcode (subq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2933     #x29 #x00 #x48)
     2934   (def-x86-opcode (subq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     2935     #x83 #o350 #x48)
     2936   (def-x86-opcode (subq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2937     #x2d nil #x48)
     2938   (def-x86-opcode (subq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     2939     #x81 #o350 #x48)
     2940   (def-x86-opcode (subq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2941     #x83 #o050 #x48)
     2942   (def-x86-opcode (subq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2943     #x81 #o050 #x48)
     2944
     2945   (def-x86-opcode subl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2946     #x29 #o300 #x00)
     2947   (def-x86-opcode subl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2948     #x2b #o000 #x00)
     2949   (def-x86-opcode subl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2950     #x29 #x00 #x00)
     2951   (def-x86-opcode subl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     2952     #x83 #o350 #x00)
     2953   (def-x86-opcode subl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2954     #x2d nil nil)
     2955   (def-x86-opcode subl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     2956     #x81 #o350 #x00)
     2957   (def-x86-opcode subl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2958     #x83 #o050 #x00)
     2959   (def-x86-opcode subl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2960     #x81 #o050 #x00)
     2961
     2962   (def-x86-opcode subw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2963     #x29 #o300 #x00 #x66)
     2964   (def-x86-opcode subw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2965     #x2b #o000 #x00 #x66)
     2966   (def-x86-opcode subw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2967     #x29 #x00 #x00 #x66)
     2968   (def-x86-opcode subw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     2969     #x83 #o350 #x00 #x66)
     2970   (def-x86-opcode subw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     2971     #x2d nil nil #x66)
     2972   (def-x86-opcode subw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     2973     #x81 #o350 #x00 #x66)
     2974   (def-x86-opcode subw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2975     #x83 #o050 #x00 #x66)
     2976   (def-x86-opcode subw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2977     #x81 #o050 #x00 #x66)
     2978
     2979   (def-x86-opcode subb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2980     #x28 #o300 #x00)
     2981   (def-x86-opcode subb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2982     #x2a #o000 #x00)
     2983   (def-x86-opcode subb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2984     #x2a #x00 #x00)
     2985   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     2986     #x2c nil nil)
     2987   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2988     #x80 #o350 #x00)
     2989   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2990     #x80 #o350 #x00)
     2991   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2992     #x80 #o050 #x00)
     2993
     2994   ;; syscall
     2995   (def-x86-opcode (syscall :cpu64) ()
     2996     #x0f0f nil nil)
     2997
     2998   ;; test
     2999   (def-x86-opcode (testq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     3000     #x85 #o300 #x48)
     3001   (def-x86-opcode (testq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     3002     #x85 #o000 #x48)
     3003   (def-x86-opcode (testq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     3004     #x85 #o000 #x48)
     3005   (def-x86-opcode (testq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     3006     #xa9 nil #x48)
     3007   (def-x86-opcode (testq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     3008     #xf7 #o300 #x48)
     3009   (def-x86-opcode (testq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     3010     #xf7 #o000 #x48)
     3011
     3012   (def-x86-opcode testl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     3013     #x85 #o300 #x00)
     3014   (def-x86-opcode testl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     3015     #x85 #o000 #x00)
     3016   (def-x86-opcode testl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     3017     #x85 #o000 #x00)
     3018   (def-x86-opcode testl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     3019     #xa9 nil #x00)
     3020   (def-x86-opcode testl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     3021     #xf7 #o300 #x00)
     3022   (def-x86-opcode testl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     3023     #xf7 #o000 #x00)
     3024
     3025
     3026   (def-x86-opcode testw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     3027     #x85 #o300 #x00 #x66)
     3028   (def-x86-opcode testw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     3029     #x85 #o000 #x00 #x66)
     3030   (def-x86-opcode testw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     3031     #x85 #o000 #x00 #x66)
     3032   (def-x86-opcode testw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     3033     #xa9 nil #x00 #x66)
     3034   (def-x86-opcode testw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     3035     #xf7 #o300 #x00 #x66)
     3036   (def-x86-opcode testw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     3037     #xf7 #o000 #x00 #x66)
     3038
     3039
     3040   (def-x86-opcode testb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     3041     #x84 #o300 #x00)
     3042   (def-x86-opcode testb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     3043     #x84 #o000 #x00)
     3044   (def-x86-opcode testb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     3045     #x84 #o000 #x00)
     3046   (def-x86-opcode testb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     3047     #xa8 nil #x00)
     3048   (def-x86-opcode testb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     3049     #xf6 #o300 #x00)
     3050   (def-x86-opcode testb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     3051     #xf6 #o000 #x00)
     3052
     3053   ;; ud2a (not to be confused with all of the other undefined/accidental
     3054   ;; instructions) is "officially undefined".
     3055   (def-x86-opcode ud2a ()
     3056     #x0f0b nil nil)
     3057
     3058   (def-x86-opcode ud2b ()
     3059     #x0fb9 nil nil)
     3060
     3061   ;; xadd
     3062   (def-x86-opcode (xaddq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     3063     #x0fc1 #o300 #x48)
     3064   (def-x86-opcode (xaddq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     3065     #x0fc1 #o000 #x48)
     3066
     3067   (def-x86-opcode xaddl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     3068     #x0fc1 #o300 #x00)
     3069   (def-x86-opcode xaddl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     3070     #x0fc1 #o000 #x00)
     3071
     3072   (def-x86-opcode xaddw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     3073     #x0fc1 #o300 #x00 #x66)
     3074   (def-x86-opcode xaddw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     3075     #x0fc1 #o000 #x00 #x66)
     3076
     3077   (def-x86-opcode xaddb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     3078     #x0fc0 #o300 #x00)
     3079   (def-x86-opcode xaddb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     3080     #x0fc0 #o000 #x00)
     3081
     3082   ;; xchg
     3083   ;; Allegedly, using the opcode #x9x to implement "(xchg (% eax) (% eax))"
     3084   ;; doesn't zero-extend eax to rax on x86-64.  (So don't special-case
     3085   ;; :acc as source or destination, and use #x86 and a modrm byte in all cases.)
     3086   (def-x86-opcode (xchgq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     3087     #x87 #o300 #x48)
     3088   (def-x86-opcode (xchgq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     3089     #x87 #o000 #x48)
     3090   (def-x86-opcode (xchgq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     3091     #x87 #o000 #x48)
     3092
     3093   (def-x86-opcode xchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     3094     #x87 #o300 #x00)
     3095   (def-x86-opcode xchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     3096     #x87 #o000 #x00)
     3097   (def-x86-opcode xchgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     3098     #x87 #o000 #x00)
     3099
     3100   (def-x86-opcode xchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     3101     #x87 #o300 #x00 #x66)
     3102   (def-x86-opcode xchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     3103     #x87 #o000 #x00 #x66)
     3104   (def-x86-opcode xchgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     3105     #x87 #o000 #x00 #x66)
     3106
     3107   (def-x86-opcode xchgb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     3108     #x86 #o300 #x00)
     3109   (def-x86-opcode xchgb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     3110     #x86 #o000 #x00)
     3111   (def-x86-opcode xchgb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     3112     #x86 #o000 #x00)
     3113
     3114   ;; xlat
     3115
     3116   (def-x86-opcode xlatb ()
     3117     #xd7 nil nil)
     3118
     3119   ;; xor
     3120   (def-x86-opcode (xorq :cpu64) ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     3121     #x31 #o300 #x48)
     3122   (def-x86-opcode (xorq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     3123     #x33 #o000 #x48)
     3124   (def-x86-opcode (xorq :cpu64) ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     3125     #x31 #x00 #x48)
     3126   (def-x86-opcode (xorq :cpu64) ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
     3127     #x83 #o360 #x48)
     3128   (def-x86-opcode (xorq :cpu64) ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     3129     #x35 nil #x48)
     3130   (def-x86-opcode (xorq :cpu64) ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
     3131     #x81 #o360 #x48)
     3132   (def-x86-opcode (xorq :cpu64) ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     3133     #x83 #o060 #x48)
     3134   (def-x86-opcode (xorq :cpu64) ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     3135     #x81 #o060 #x48)
     3136
     3137   (def-x86-opcode xorl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     3138     #x31 #o300 #x00)
     3139   (def-x86-opcode xorl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     3140     #x33 #o000 #x00)
     3141   (def-x86-opcode xorl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     3142     #x31 #x00 #x00)
     3143   (def-x86-opcode xorl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     3144     #x83 #o360 #x00)
     3145   (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     3146     #x35 nil nil)
     3147   (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     3148     #x81 #o360 #x00)
     3149   (def-x86-opcode xorl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     3150     #x83 #o060 #x00)
     3151   (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     3152     #x81 #o060 #x00)
     3153
     3154   (def-x86-opcode xorw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     3155     #x31 #o300 #x00 #x66)
     3156   (def-x86-opcode xorw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     3157     #x33 #o000 #x00 #x66)
     3158   (def-x86-opcode xorw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     3159     #x31 #x00 #x00 #x66)
     3160   (def-x86-opcode xorw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     3161     #x83 #o360 #x00 #x66)
     3162   (def-x86-opcode xorw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     3163     #x35 nil nil #x66)
     3164   (def-x86-opcode xorw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     3165     #x81 #o360 #x00 #x66)
     3166   (def-x86-opcode xorw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     3167     #x83 #o060 #x00 #x66)
     3168   (def-x86-opcode xorw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     3169     #x81 #o060 #x00 #x66)
     3170
     3171   (def-x86-opcode xorb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     3172     #x30 #o300 #x00)
     3173   (def-x86-opcode xorb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     3174     #x32 #o000 #x00)
     3175   (def-x86-opcode xorb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     3176     #x30 #x00 #x00)
     3177   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     3178     #x34 nil nil)
     3179   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     3180     #x80 #o360 #x00)
     3181   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     3182     #x80 #o360 #x00)
     3183   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     3184     #x80 #o060 #x00)
     3185
     3186   ;; fxsave
     3187   (def-x86-opcode fxsaveq ((:anymem :insert-memory))
     3188     #x0fae #o000 0)
     3189
     3190   ;; fxrstor
     3191   (def-x86-opcode fxrstor ((:anymem :insert-memory))
     3192     #x0fae #o010 0)
     3193
     3194   ;; clflush
     3195   (def-x86-opcode clflush ((:anymem :insert-memory))
     3196     #x0fae #o070 0)
     3197
     3198   ;; lfence
     3199   (def-x86-opcode lfence ()
     3200     #x0fae #xe8 nil)
     3201
     3202   ;; mfence
     3203   (def-x86-opcode mfence ()
     3204     #x0fae #xf0 nil)
     3205   
     3206   ;; pause
     3207   (def-x86-opcode pause ()
     3208     #xf390 nil nil)
     3209
     3210   ;; I don't want to have to define all mmx/sse/sse2 instructions at the
     3211   ;; moment, but it wouldn't hurt to define those that the lisp is
     3212   ;; likely to use.
     3213
     3214   ;; Useful mmx/sse2 instructions, other than movd/movq:
     3215
     3216   ;; emms
     3217   (def-x86-opcode emms ()
     3218     #x0f77 nil nil)
     3219
     3220   ;; addsd
     3221   (def-x86-opcode addsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3222     #x0f58 #o000 #x0 #xf2)
     3223   (def-x86-opcode addsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3224     #x0f58 #o300 #x0 #xf2)
     3225   
     3226   ;; addss
     3227   (def-x86-opcode addss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3228     #x0f58 #o000 #x0 #xf3)
     3229   (def-x86-opcode addss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3230     #x0f58 #o300 #x0 #xf3)
     3231
     3232   ;; subsd
     3233   (def-x86-opcode subsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3234     #x0f5c #o000 #x0 #xf2)
     3235   (def-x86-opcode subsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3236     #x0f5c #o300 #x0 #xf2)
     3237
     3238   ;; subss
     3239   (def-x86-opcode subss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3240     #x0f5c #o000 #x0 #xf3)
     3241   (def-x86-opcode subss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3242     #x0f5c #o300 #x0 #xf3)
     3243
     3244   ;; movapd
     3245   (def-x86-opcode movapd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3246     #x0f28 #o300 #x0 #x66)
     3247   (def-x86-opcode movapd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3248     #x0f28 #o000 #x0 #x66)
     3249   (def-x86-opcode movapd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     3250     #x0f29 #o000 #x0 #x66)
     3251   
     3252   ;; mulsd
     3253   (def-x86-opcode mulsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3254     #x0f59 #o000 #x0 #xf2)
     3255   (def-x86-opcode mulsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3256     #x0f59 #o300 #x0 #xf2)
     3257
     3258   ;; mulss
     3259   (def-x86-opcode mulss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3260     #x0f59 #o000 #x0 #xf3)
     3261   (def-x86-opcode mulss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3262     #x0f59 #o300 #x0 #xf3)
     3263
     3264   ;; divsd
     3265   (def-x86-opcode divsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3266     #x0f5e #o000 #x0 #xf2)
     3267   (def-x86-opcode divsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3268     #x0f5e #o300 #x0 #xf2)
     3269
     3270   ;; divss
     3271   (def-x86-opcode divss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3272     #x0f5e #o000 #x0 #xf3)
     3273   (def-x86-opcode divss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3274     #x0f5e #o300 #x0 #xf3)
     3275
     3276
     3277   ;; sqrtsd
     3278   (def-x86-opcode sqrtsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3279     #x0f51 #o000 #x0 #xf2)
     3280   (def-x86-opcode sqrtsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3281     #x0f51 #o300 #x0 #xf2)
     3282
     3283   ;; sqrtss
     3284   (def-x86-opcode sqrtss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3285     #x0f51 #o000 #x0 #xf3)
     3286   (def-x86-opcode sqrtss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3287     #x0f51 #o300 #x0 #xf3)
     3288   
     3289   ;; comisd
     3290   (def-x86-opcode comisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3291     #x0f2f #o000 #x0 #x66)
     3292   (def-x86-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3293     #x0f2f #o300 #x0 #x66)
     3294
     3295   ;; ucomisd
     3296   (def-x86-opcode ucomisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3297     #x0f2e #o000 #x0 #x66)
     3298   (def-x86-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3299     #x0f2e #o300 #x0 u#x66)
     3300
     3301   
     3302   ;; comiss
     3303   (def-x86-opcode comiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3304     #x0f2f #o000 #x0)
     3305   (def-x86-opcode comiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3306     #x0f2f #o300 #x0)
     3307
     3308   ;; ucomiss
     3309   (def-x86-opcode ucomiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3310     #x0f2e #o000 #x0)
     3311   (def-x86-opcode ucomiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3312     #x0f2e #o300 #x0)
     3313
     3314   ;; movsd
     3315   (def-x86-opcode movsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3316     #x0f10 #o300 #x0 #xf2)
     3317   (def-x86-opcode movsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3318     #x0f10 #o300 #x0 #xf2)
     3319   (def-x86-opcode movsd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     3320     #x0f11 #o000 #x0 #xf2)
     3321
     3322   
     3323
     3324   ;; movss
     3325   (def-x86-opcode movss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3326     #x0f10 #o300 #x0 #xf3)
     3327   (def-x86-opcode movss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3328     #x0f10 #o300 #x0 #xf3)
     3329   (def-x86-opcode movss ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     3330     #x0f11 #o000 #x0 #xf3)
     3331
     3332   
     3333;;; cvtsd2si.  This does rounding (as opposed to truncation).
     3334   (def-x86-opcode (cvtsd2siq :cpu64) ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
     3335     #x0f2d #o300 #x48 #xf2)
     3336   (def-x86-opcode (cvtsd2siq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     3337     #x0f2d #o000 #x48 #xf2)
     3338   (def-x86-opcode cvtsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     3339     #x0f2d #o300 #x00 #xf2)
     3340   (def-x86-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     3341     #x0f2d #o000 #x00 #xf2)
     3342
     3343;;; cvtss2si.  This does rounding (as opposed to truncation).
     3344   (def-x86-opcode (cvtss2siq :cpu64) ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
     3345     #x0f2d #o300 #x48 #xf3)
     3346   (def-x86-opcode (cvtss2siq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     3347     #x0f2d #o000 #x48 #xf3)
     3348   (def-x86-opcode cvtss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     3349     #x0f2d #o300 #x00 #xf3)
     3350   (def-x86-opcode cvtss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     3351     #x0f2d #o000 #x00 #xf3)
     3352   
     3353;;; cvttsd2si.  This does truncation (as opposed to rounding).
     3354   (def-x86-opcode (cvttsd2siq :cpu64) ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
     3355     #x0f2c #o300 #x48 #xf2)
     3356   (def-x86-opcode (cvttsd2siq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     3357     #x0f2c #o000 #x48 #xf2)
     3358   (def-x86-opcode cvttsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     3359     #x0f2c #o300 #x00 #xf2)
     3360   (def-x86-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     3361     #x0f2c #o000 #x00 #xf2)
     3362
     3363;;; cvttss2si.  This does truncation (as opposed to rounding).
     3364   (def-x86-opcode (cvttss2siq :cpu64) ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
     3365     #x0f2c #o300 #x48 #xf3)
     3366   (def-x86-opcode (cvttss2siq :cpu64) ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
     3367     #x0f2c #o000 #x48 #xf3)
     3368   (def-x86-opcode cvttss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     3369     #x0f2c #o300 #x00 #xf3)
     3370   (def-x86-opcode cvttss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     3371     #x0f2c #o000 #x00 #xf3)
     3372
     3373   ;; cvtsi2sd
     3374   (def-x86-opcode (cvtsi2sdq :cpu64) ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     3375     #x0f2a #o300 #x48 #xf2)
     3376   (def-x86-opcode (cvtsi2sdq :cpu64) ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3377     #x0f2a #o000 #x48 #xf2)
     3378   (def-x86-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     3379     #x0f2a #o300 #x00 #xf2)
     3380   (def-x86-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3381     #x0f2a #o000 #x00 #xf2)
     3382   
     3383   ;; cvtsd2ss
     3384   (def-x86-opcode cvtsd2ss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3385     #x0f5a #o300 #x0 #xf2)
     3386   (def-x86-opcode cvtsd2ss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3387     #x0f5a #o000 #x0 #xf2)
     3388
     3389   ;; cvtsi2sd
     3390   (def-x86-opcode (cvtsi2sdq :cpu64) ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     3391     #x0f2a #o300 #x48 #xf2)
     3392   (def-x86-opcode (cvtsi2sdq :cpu64) ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3393     #x0f2a #o000 #x48 #xf2)
     3394   (def-x86-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     3395     #x0f2a #o300 #x00 #xf2)
     3396   (def-x86-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3397     #x0f2a #o000 #x00 #xf2)
     3398
     3399   ;; cvtsi2ss
     3400   (def-x86-opcode (cvtsi2ssq :cpu64) ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     3401     #x0f2a #o300 #x48 #xf3)
     3402   (def-x86-opcode (cvtsi2ssq :cpu64) ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3403     #x0f2a #o000 #x48 #xf3)
     3404   (def-x86-opcode cvtsi2ssl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     3405     #x0f2a #o300 #x00 #xf3)
     3406   (def-x86-opcode cvtsi2ssl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3407     #x0f2a #o000 #x00 #xf3)
     3408
     3409;;; cvtss2sd
     3410   (def-x86-opcode cvtss2sd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3411     #x0f5a #o300 #x0 #xf3)
     3412   (def-x86-opcode cvtss2sd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3413     #x0f5a #o000 #x0 #xf3)
     3414   
     3415   ;; pand
     3416   (def-x86-opcode pand ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3417     #x0fdb #o300 #x0)
     3418   (def-x86-opcode pand ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3419     #x0fdb #o000 #x0)
     3420   (def-x86-opcode pand ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     3421     #x0fef #o300 #x0 #x66)
     3422   (def-x86-opcode pand ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     3423     #x0fdb #o000 #x0 #x66)
     3424   
     3425   ;; pandn
     3426   (def-x86-opcode pandn ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3427     #x0fdf #o300 #x0)
     3428   (def-x86-opcode pandn ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3429     #x0fdf #o000 #x0)
     3430   (def-x86-opcode pandn ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     3431     #x0fdf #o300 #x0 #x66)
     3432   (def-x86-opcode pandn ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     3433     #x0fdf #o000 #x0 #x66)
     3434
     3435   ;; por
     3436   (def-x86-opcode por ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3437     #x0feb #o300 #x0)
     3438   (def-x86-opcode por ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3439     #x0feb #o000 #x0)
     3440   (def-x86-opcode por ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     3441     #x0feb #o300 #x0 #x66)
     3442   (def-x86-opcode por ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     3443     #x0feb #o000 #x0 #x66)
     3444
     3445   ;; pxor
     3446   (def-x86-opcode pxor ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3447     #x0fef #o300 #x0)
     3448   (def-x86-opcode pxor ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3449     #x0fef #o000 #x0)
     3450   (def-x86-opcode pxor ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     3451     #x0fef #o300 #x0 #x66)
     3452   (def-x86-opcode pxor ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     3453     #x0fef #o000 #x0 #x66)
     3454
     3455   ;; psllq
     3456   (def-x86-opcode psllq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3457     #x0ff3 #o300 #x0)
     3458   (def-x86-opcode psllq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3459     #x0ff3 #o000 #x0)
     3460   (def-x86-opcode psllq ((:imm8 :insert-imm8) (:regmmx :insert-mmx-rm))
     3461     #x0f73 #o360 #o0)
     3462   (def-x86-opcode psllq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     3463     #x0ff3 #o300 #x0 #x66)
     3464   (def-x86-opcode psllq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     3465     #x0ff3 #o000 #x0 #x66)
     3466   (def-x86-opcode psllq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     3467     #x0f73 #o360 #o0 #x66)
     3468
     3469   ;; psllw
     3470   
     3471   ;; pslld
     3472
     3473   ;; pslldq
     3474   (def-x86-opcode pslldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     3475     #x0f73 #o370 #x0 #x66)
     3476   
     3477   ;; psrlq
     3478   (def-x86-opcode psrlq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3479     #x0fd3 #o300 #x0)
     3480   (def-x86-opcode psrlq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3481     #x0fd3 #o000 #x0)
     3482   (def-x86-opcode psrlq ((:imm8 :insert-imm8) (:regmmx :insert-mmx-rm))
     3483     #x0f73 #o320 #o0)
     3484   (def-x86-opcode psrlq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     3485     #x0fd3 #o300 #x0 #x66)
     3486   (def-x86-opcode psrlq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     3487     #x0fd3 #o000 #x0 #x66)
     3488   (def-x86-opcode psrlq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     3489     #x0f73 #o320 #o0 #x66)
     3490
     3491   ;; psrld
     3492
     3493   ;; psrldq
     3494   (def-x86-opcode psrldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     3495     #x0f73 #o330 #x0 #x66)
     3496   
     3497   ;; psrlw
     3498
     3499   ;; pmuludq
     3500   (def-x86-opcode pmuludq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3501     #x0ff4 #o300 #x0)
     3502   (def-x86-opcode pmuludq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3503     #x0ff4 #o000 #x0)
     3504   (def-x86-opcode pmuludq ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     3505     #x0ff4 #o300 #x0 #x66)
     3506   (def-x86-opcode pmuludq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3507     #x0ff4 #o000 #x0 #x66)
     3508
     3509   ;; paddq
     3510   (def-x86-opcode paddq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3511     #x0fd4 #o300 #x0)
     3512   (def-x86-opcode paddq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     3513     #x0fd4 #o000 #x0)
     3514   (def-x86-opcode paddq ((:regxmm :insert-xmm-reg) (:regxmm :insert-xmm-reg))
     3515     #x0fd4 #o300 #x0 #x66)
     3516   (def-x86-opcode paddq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     3517     #x0fd4 #o000 #x0 #x66)
     3518
     3519   ;; psrad
     3520   (def-x86-opcode psrad ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     3521     #x0fe2 #o300 #x0)
     3522
     3523;;; End of list of useful mmx instructions
     3524
     3525;;; x87 fpu instructions
     3526
     3527   ;; fstp
     3528   (def-x86-opcode fstps ((:anymem :insert-memory))
     3529     #xd9 #o030 nil)
     3530   (def-x86-opcode fstpl ((:anymem :insert-memory))
     3531     #xdd #o030 nil)
     3532
     3533;;; end of x87 fpu instructions
     3534
     3535   (def-x86-opcode ldmxcsr ((:anymem :insert-memory))
     3536     #x0fae #o020 nil)
     3537
     3538   (def-x86-opcode stmxcsr ((:anymem :insert-memory))
     3539     #x0fae #o030 nil)
     3540
     3541   ;; UUOs.  Expect lots more, some of which may take pseudo-operands.
     3542   (def-x86-opcode uuo-error-slot-unbound ((:reg :insert-opcode-reg4)
     3543                                           (:reg :insert-reg4-pseudo-rm-high)
     3544                                           (:reg :insert-reg4-pseudo-rm-low))
     3545     #xcd70 0 nil)
     3546
     3547;;; DON'T use #xcd8x: doing so will make Mach angry and confused.
     3548   
     3549   (def-x86-opcode uuo-error-unbound ((:reg :insert-opcode-reg4))
     3550     #xcd90 nil 0)
     3551
     3552   (def-x86-opcode uuo-error-udf ((:reg :insert-opcode-reg4))
     3553     #xcda0 nil 0)
     3554   
     3555   (def-x86-opcode uuo-error-reg-not-type ((:reg :insert-opcode-reg4) (:imm8 :insert-imm8))
     3556     #xcdb0 nil 0)
     3557   
     3558   (def-x86-opcode uuo-error-too-few-args ()
     3559     #xcdc0 nil nil)
     3560   (def-x86-opcode uuo-error-too-many-args ()
     3561     #xcdc1 nil nil)
     3562   (def-x86-opcode uuo-error-wrong-number-of-args ()
     3563     #xcdc2 nil nil)
     3564   (def-x86-opcode uuo-error-array-rank ((:reg :insert-reg4-pseudo-rm-high)
     3565                                         (:reg :insert-reg4-pseudo-rm-low))
     3566     #xcdc3 0 nil)
     3567
     3568   (def-x86-opcode uuo-gc-trap ()
     3569     #xcdc4 nil nil)
     3570   (def-x86-opcode uuo-alloc ()
     3571     #xcdc5 nil nil)
     3572   (def-x86-opcode uuo-error-not-callable ()
     3573     #xcdc6 nil nil)
     3574   (def-x86-opcode uuo-error-udf-call ()
     3575     #xcdc7 nil nil)
     3576
     3577   (def-x86-opcode uuo-error-vector-bounds ((:reg :insert-reg4-pseudo-rm-high) (:reg :insert-reg4-pseudo-rm-low))
     3578     #xcdc8 0 nil)
     3579
     3580   (def-x86-opcode uuo-error-call-macro-or-special-operator ()
     3581     #xcdc9 nil nil)
     3582
     3583   (def-x86-opcode uuo-error-debug-trap ()
     3584     #xcdca nil nil)
     3585
     3586   (def-x86-opcode uuo-error-array-bounds ((:reg :insert-reg4-pseudo-rm-high) (:reg :insert-reg4-pseudo-rm-low))
     3587     #xcdcb 0 nil)
     3588
     3589   (def-x86-opcode uuo-error-eep-unresolved ((:reg :insert-reg4-pseudo-rm-high)
     3590                                             (:reg :insert-reg4-pseudo-rm-low))
     3591     #xcdcc 0 nil)
     3592
     3593   (def-x86-opcode uuo-error-debug-trap-with-string ()
     3594     #xcdcd nil nil)
     3595   
     3596   (def-x86-opcode uuo-error-reg-not-tag ((:reg :insert-opcode-reg4) (:imm8 :insert-imm8))
     3597     #xcdd0 nil 0)
     3598   (def-x86-opcode uuo-error-reg-not-list ((:reg :insert-opcode-reg4))
     3599     #xcde0 nil 0)
     3600   (def-x86-opcode uuo-error-reg-not-fixnum ((:reg :insert-opcode-reg4))
     3601     #xcdf0 nil 0)
     3602
     3603   ))
     3604
     3605#+nil
     3606(defparameter *x86-opcode-templates*
    7253607  (vector
    7263608   ;; adc
     
    34126294   ))
    34136295
    3414 (dotimes (i (length *x8664-opcode-templates*))
    3415   (setf (x86-opcode-template-ordinal (svref *x8664-opcode-templates* i)) i))
     6296(dotimes (i (length *x86-opcode-templates*))
     6297  (setf (x86-opcode-template-ordinal (svref *x86-opcode-templates* i)) i))
    34166298 
    3417 (defparameter *x86-opcode-templates* *x8664-opcode-templates*)
    3418      
    3419 (defparameter *x86-32-opcode-template-lists*
    3420   (make-hash-table :test #'equalp))
    3421 
    3422 
    3423 (defparameter *x86-64-opcode-template-lists*
     6299
     6300
     6301(defparameter *x86-opcode-template-lists*
    34246302  (make-hash-table :test #'equalp))
    34256303
     
    34346312                    (name (x86-opcode-template-mnemonic template)))
    34356313               (push template (gethash name hash))))))
    3436     #+notyet
    3437     (setup-templates-hash
    3438      *x86-32-opcode-template-lists*
    3439      *x8632-opcode-templates*)
    3440     (setup-templates-hash
    3441      *x86-64-opcode-template-lists*
    3442      *x8664-opcode-templates*)
    3443     #+x8664-target
     6314    (setup-templates-hash *x86-opcode-template-lists* *x86-opcode-templates*)
    34446315    (when (fboundp 'ccl::fixup-x86-vinsn-templates)
    34456316      (ccl::fixup-x86-vinsn-templates
    34466317       (ccl::backend-p2-vinsn-templates ccl::*target-backend*)
    3447        *x86-64-opcode-template-lists*))
     6318       *x86-opcode-template-lists*))
    34486319    t))
    3449 
    3450 (defparameter *x86-opcode-template-lists* *x86-64-opcode-template-lists*)
    34516320
    34526321(defvar *x8632-registers* (make-hash-table :test #'equalp))
     
    34546323(defvar *x86-registers* nil)
    34556324
    3456 (defparameter *x86-32-operand-insert-functions*
    3457   #(tbd))
    3458 
    3459 (defparameter *x86-64-operand-insert-functions*
     6325(defparameter *x86-operand-insert-functions*
    34606326  #(insert-nothing
    34616327    insert-modrm-reg
     
    34816347    insert-reg4-pseudo-rm-low))
    34826348
    3483 (defvar *x86-operand-insert-functions* ())
    3484 
    3485 (defun setup-x86-assembler (&optional (cpu :x86-64))
    3486   (initialize-x86-opcode-templates)
    3487   (ecase cpu
    3488     (:x86-32 (setq *x86-opcode-template-lists*
    3489                    *x86-32-opcode-template-lists*
    3490                    *x86-registers* *x8632-registers*
    3491                    *x86-operand-insert-functions*
    3492                    *x86-32-operand-insert-functions*
    3493                    ))
    3494     (:x86-64 (setq *x86-opcode-template-lists*
    3495                    *x86-64-opcode-template-lists*
    3496                    *x86-registers* *x8664-registers*
    3497                    *x86-operand-insert-functions*
    3498                    *x86-64-operand-insert-functions*)))
    3499   t)
    3500 
    3501 (setup-x86-assembler :x86-64)
     6349(initialize-x86-opcode-templates)
     6350
     6351
    35026352
    35036353
     
    44437293      (insert-imm8 instruction operand))))
    44447294
     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
    44457301(defun insert-label (instruction operand)
    44467302  (setf (x86-instruction-extra instruction)
     
    44497305(defparameter *x8664-register-entries*
    44507306  (flet ((register-entry (name)
    4451            (let* ((r (gethash name *x86-registers*)))
     7307           (let* ((r (gethash name *x8664-registers*)))
    44527308             (unless r (error "unknown register ~s" name))
    44537309             r)))
     
    46007456     ((mod 64) r)
    46017457     ((or string symbol)
    4602       (let* ((entry (gethash r *x86-registers*)))
     7458      (let* ((entry (gethash r *x8664-registers*)))
    46037459        (if entry
    46047460          (reg-entry-ordinal64 entry))))
     
    46337489;;; types of the actual operands.
    46347490(defun match-template-types (template type0 type1 type2)
     7491  #+debug
     7492  (format t "~& template = ~s, operand types = ~s" template (list type0 type1 type2))
     7493  (ccl::target-arch-case
     7494
     7495   (:x8664
     7496    (if (logtest (encode-opcode-flags :cpuno64) (x86-opcode-template-flags template))
     7497      (return-from match-template-types nil))))
    46357498  (flet ((match (overlap given)
    46367499           (and
     
    46897552                                      type2
    46907553                                      template-type2)))))))))))))))
    4691  
     7554
     7555#+nil 
    46927556(defun match-template (template parsed-operands)
    46937557  (apply #'match-template-types template (mapcar #'x86-operand-type parsed-operands)))
    46947558
     7559(defun match-template (template parsed-operands)
     7560  (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)))
     7565    #+debug
     7566    (format t "~& template = ~s, operand types = ~s" template operand-types)
     7567    (ccl::target-arch-case
     7568
     7569     (:x8664
     7570      (if (not (logtest (encode-opcode-flags :cpuno64) flags))
     7571        (match-template-types template type0 type1 type2))))))
    46957572
    46967573
  • trunk/source/compiler/X86/x86-lap.lisp

    r10180 r10188  
    918918        (push explicit-seg-prefix prefixes)))
    919919    (cond
    920       ((logtest (x86::encode-opcode-modifier :jump) opcode-modifier)
     920      ((logtest (x86::encode-opcode-flags :jump) opcode-modifier)
    921921       ;; a variable-length pc-relative branch, possibly preceded
    922922       ;; by prefixes (used for branch prediction, mostly.)
Note: See TracChangeset for help on using the changeset viewer.