Changeset 6988 for branches


Ignore:
Timestamp:
Aug 2, 2007, 11:58:27 AM (17 years ago)
Author:
R. Matthew Emerson
Message:

Add instruction templates for IA-32. Add :self pseudo-operand.
Conditionalize functions to access *X8664-REGISTER-ENTRIES*
and *X8632-REGISTER-ENTRIES* depending on target-arch.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/x86-asm.lisp

    r6465 r6988  
    330330(defconstant +operand-type-Label+ #x100000000)
    331331
     332;;; 4 bytes and a :reloc; otherwise just like a 32-bit immediate
     333(defconstant +operand-type-Self+ #x200000000)
     334
    332335(defconstant +operand-type-Reg+ (logior +operand-type-Reg8+ +operand-type-Reg16+ +operand-type-Reg32+ +operand-type-Reg64+)) ; gen'l register
    333336(defconstant +operand-type-WordReg+ (logior +operand-type-Reg16+ +operand-type-Reg32+ +operand-type-Reg64+))
     
    397400    (:ByteMem . ,+operand-type-ByteMem+)
    398401    (:Label . ,+operand-type-Label+)
     402    (:Self . ,+operand-type-Self+)
    399403  ))
    400404
     
    564568    :insert-reg4-pseudo-rm-high
    565569    :insert-reg4-pseudo-rm-low
     570    :insert-self
    566571    ))
    567572
     
    705710                                (x86-memory-operand-scale operand)
    706711                                (x86-memory-operand-type operand)))
     712
     713(defmacro def-x86-opcode (name&flags types-and-classes base-opcode
     714                          modrm-byte &rest prefixes)
     715  `(%make-x86-opcode-template
     716    :mnemonic ,(parse-x86-opcode-name name&flags)
     717    :flags ,(parse-x86-opcode-flags name&flags)
     718    :operand-types ,(parse-x86-opcode-operand-types types-and-classes)
     719    :operand-classes ,(parse-x86-opcode-operand-classes types-and-classes)
     720    :base-opcode ,base-opcode
     721    :prefixes ',prefixes
     722    :rex-prefix 0
     723    :modrm-byte ,modrm-byte))
     724
     725(defparameter *x86-32-bit-only-opcode-templates*
     726  (vector
     727   ;; call
     728   (def-x86-opcode call ((:reg32 :insert-modrm-rm))
     729     #xff #o320)
     730
     731   ;; dec (single byte encoding)
     732   (def-x86-opcode decl ((:reg32 :insert-opcode-reg))
     733     #x48 nil)
     734   (def-x86-opcode decw ((:reg16 :insert-opcode-reg))
     735     #x48 nil #x66)
     736   
     737   ;; inc (single byte encoding)
     738   (def-x86-opcode incl ((:reg32 :insert-opcode-reg))
     739     #x40 nil)
     740   (def-x86-opcode incw ((:reg16 :insert-opcode-reg))
     741     #x40 nil #x66)
     742   
     743   ;; UUOs.  Expect lots more, some of which may take pseudo-operands.
     744   (def-x86-opcode uuo-error-slot-unbound ((:reg32 :insert-opcode-reg4)
     745                                           (:reg32 :insert-reg4-pseudo-rm-high)
     746                                           (:reg32 :insert-reg4-pseudo-rm-low))
     747     #xcd70 0)
     748   
     749   ;;; DON'T use #xcd8x: doing so will make Mach angry and confused.
     750   
     751   (def-x86-opcode uuo-error-unbound ((:reg32 :insert-opcode-reg4))
     752     #xcd90 nil)
     753   
     754   (def-x86-opcode uuo-error-udf ((:reg32 :insert-opcode-reg4))
     755     #xcda0 nil)
     756   
     757   (def-x86-opcode uuo-error-reg-not-type ((:reg32 :insert-opcode-reg4) (:imm8 :insert-imm8))
     758     #xcdb0 nil)
     759   
     760   (def-x86-opcode uuo-error-too-few-args ()
     761     #xcdc0 nil)
     762   (def-x86-opcode uuo-error-too-many-args ()
     763     #xcdc1 nil)
     764   (def-x86-opcode uuo-error-wrong-number-of-args ()
     765     #xcdc2 nil)
     766   (def-x86-opcode uuo-error-array-rank ((:reg32 :insert-reg4-pseudo-rm-high)
     767                                         (:reg32 :insert-reg4-pseudo-rm-low))
     768     #xcdc3 0)
     769   
     770   (def-x86-opcode uuo-gc-trap ()
     771     #xcdc4 nil)
     772   (def-x86-opcode uuo-alloc ()
     773     #xcdc5 nil)
     774   (def-x86-opcode uuo-error-not-callable ()
     775     #xcdc6 nil)
     776   (def-x86-opcode uuo-error-udf-call ()
     777     #xcdc7 nil)
     778   
     779   (def-x86-opcode uuo-error-vector-bounds ((:reg32 :insert-reg4-pseudo-rm-high)
     780                                            (:reg32 :insert-reg4-pseudo-rm-low))
     781     #xcdc8 0)
     782   
     783   (def-x86-opcode uuo-error-call-macro-or-special-operator ()
     784     #xcdc9 nil)
     785   
     786   (def-x86-opcode uuo-error-debug-trap ()
     787     #xcdca nil)
     788   
     789   (def-x86-opcode uuo-error-array-bounds ((:reg32 :insert-reg4-pseudo-rm-high)
     790                                           (:reg32 :insert-reg4-pseudo-rm-low))
     791     #xcdcb 0)
     792   
     793   (def-x86-opcode uuo-error-eep-unresolved ((:reg32 :insert-reg4-pseudo-rm-high)
     794                                             (:reg32 :insert-reg4-pseudo-rm-low))
     795     #xcdcc 0)
     796   
     797   (def-x86-opcode uuo-error-debug-trap-with-string ()
     798     #xcdcd nil)
     799   
     800   (def-x86-opcode uuo-error-reg-not-tag ((:reg32 :insert-opcode-reg4)
     801                                          (:imm8 :insert-imm8))
     802     #xcdd0 nil)
     803   (def-x86-opcode uuo-error-reg-not-list ((:reg32 :insert-opcode-reg4))
     804     #xcde0 nil)
     805   (def-x86-opcode uuo-error-reg-not-fixnum ((:reg32 :insert-opcode-reg4))
     806     #xcdf0 nil)
     807   ))
     808
     809
     810(defparameter *x86-common-opcode-templates*
     811  (vector
     812   ;; adc
     813   (def-x86-opcode adcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     814     #x11 #o300)
     815   (def-x86-opcode adcl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     816     #x13 #o000)
     817   (def-x86-opcode adcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     818     #x11 #x00)
     819   (def-x86-opcode adcl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     820     #x83 #o320)
     821   (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     822     #x15 nil)
     823   (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     824     #x81 #o320)
     825   (def-x86-opcode adcl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     826     #x83 #o020)
     827   (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     828     #x81 #o020)
     829
     830   (def-x86-opcode adcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     831     #x11 #o300 #x66)
     832   (def-x86-opcode adcw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     833     #x13 #o000 #x66)
     834   (def-x86-opcode adcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     835     #x11 #x00 #x66)
     836   (def-x86-opcode adcw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     837     #x83 #o320 #x66)
     838   (def-x86-opcode adcw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     839     #x15 nil #x66)
     840   (def-x86-opcode adcw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     841     #x81 #o320 #x66)
     842   (def-x86-opcode adcw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     843     #x83 #o020 #x66)
     844   (def-x86-opcode adcw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     845     #x81 #o020 #x66)
     846
     847   (def-x86-opcode adcb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     848     #x10 #o300)
     849   (def-x86-opcode adcb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     850     #x12 #o000)
     851   (def-x86-opcode adcb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     852     #x10 #x00)
     853   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:acc :insert-nothing))
     854     #x14 nil)
     855   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     856     #x80 #o320)
     857   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     858     #x80 #o320)
     859   (def-x86-opcode adcb ((:imm8 :insert-imm8) (:anymem :insert-memory))
     860     #x80 #o020)
     861
     862   ;; add
     863   (def-x86-opcode addl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     864     #x01 #o300)
     865   (def-x86-opcode addl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     866     #x03 #o000)
     867   (def-x86-opcode addl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     868     #x01 #x00)
     869   (def-x86-opcode addl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     870     #x83 #o300)
     871   (def-x86-opcode addl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     872     #x05 nil)
     873   (def-x86-opcode addl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     874     #x81 #o300)
     875   (def-x86-opcode addl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     876     #x83 #o000)
     877   (def-x86-opcode addl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     878     #x81 #o000)
     879
     880   (def-x86-opcode addw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     881     #x01 #o300 #x66)
     882   (def-x86-opcode addw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     883     #x03 #o000 #x66)
     884   (def-x86-opcode addw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     885     #x01 #x00 #x66)
     886   (def-x86-opcode addw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     887     #x83 #o300 #x66)
     888   (def-x86-opcode addw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     889     #x05 nil #x66)
     890   (def-x86-opcode addw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     891     #x81 #o300 #x66)
     892   (def-x86-opcode addw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     893     #x83 #o000 #x66)
     894   (def-x86-opcode addw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     895     #x81 #o000 #x66)
     896
     897   (def-x86-opcode addb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     898     #x00 #o300)
     899   (def-x86-opcode addb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     900     #x02 #o000)
     901   (def-x86-opcode addb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     902     #x00 #x00)
     903   (def-x86-opcode addb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     904     #x04 nil)
     905   (def-x86-opcode addb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     906     #x80 #o300)
     907   (def-x86-opcode addb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     908     #x80 #o000)
     909
     910   ;; and
     911   (def-x86-opcode andl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     912     #x21 #o300)
     913   (def-x86-opcode andl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     914     #x23 #o000)
     915   (def-x86-opcode andl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     916     #x21 #x00)
     917   (def-x86-opcode andl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     918     #x83 #o340)
     919   (def-x86-opcode andl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     920     #x25 nil)
     921   (def-x86-opcode andl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     922     #x81 #o340)
     923   (def-x86-opcode andl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     924     #x83 #o040)
     925   (def-x86-opcode andl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     926     #x81 #o040)
     927
     928   (def-x86-opcode andw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     929     #x21 #o300 #x66)
     930   (def-x86-opcode andw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     931     #x23 #o000 #x66)
     932   (def-x86-opcode andw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     933     #x21 #x00 #x66)
     934   (def-x86-opcode andw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     935     #x83 #o340 #x66)
     936   (def-x86-opcode andw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     937     #x25 nil #x66)
     938   (def-x86-opcode andw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     939     #x81 #o340 #x66)
     940   (def-x86-opcode andw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     941     #x83 #o040 #x66)
     942   (def-x86-opcode andw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     943     #x81 #o040 #x66)
     944
     945   (def-x86-opcode andb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     946     #x20 #o300)
     947   (def-x86-opcode andb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     948     #x22 #o000)
     949   (def-x86-opcode andb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     950     #x20 #o000)
     951   (def-x86-opcode andb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     952     #x24 nil)
     953   (def-x86-opcode andb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     954     #x80 #o340)
     955   (def-x86-opcode andb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     956     #x80 #o040)
     957
     958   ;; bsf
     959   (def-x86-opcode bsfl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     960     #x0fbc #o300)
     961   (def-x86-opcode bsfl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     962     #x0fbc #o000)
     963
     964   (def-x86-opcode bsfw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     965     #x0fbc #o300 #x66)
     966   (def-x86-opcode bsfw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     967     #x0fbc #o000 #x66)
     968
     969   ;; bsr
     970   (def-x86-opcode bsrl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     971     #x0fbd #o300)
     972   (def-x86-opcode bsrl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     973     #x0fbd #o000)
     974
     975   (def-x86-opcode bsrw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     976     #x0fbd #o300 #x66)
     977   (def-x86-opcode bsrw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     978     #x0fbd #o000 #x66)
     979
     980   ;; bswap
     981   (def-x86-opcode bswapl ((:reg64 :insert-opcode-reg))
     982     #x0fc8 nil)
     983
     984   ;; bt
     985   (def-x86-opcode btl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     986     #x0fba #o340)
     987   (def-x86-opcode btl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     988     #x0fba #o040)
     989   (def-x86-opcode btl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     990     #x0fa3 #o300)
     991   (def-x86-opcode btl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     992     #x0fa3 #o000)
     993
     994   (def-x86-opcode btw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     995     #x0fba #o340 #x66)
     996   (def-x86-opcode btw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     997     #x0fba #o040 #x66)
     998   (def-x86-opcode btw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     999     #x0fa3 #o300 #x66)
     1000   (def-x86-opcode btw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1001     #x0fa3 #o000 #x66)
     1002
     1003   ;; btc
     1004   (def-x86-opcode btcl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1005     #x0fba #o370)
     1006   (def-x86-opcode btcl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1007     #x0fba #o070)
     1008   (def-x86-opcode btcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1009     #x0fbb #o300)
     1010   (def-x86-opcode btcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1011     #x0fbb #o000)
     1012
     1013   (def-x86-opcode btcw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1014     #x0fba #o370 #x66)
     1015   (def-x86-opcode btcw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1016     #x0fba #o070 #x66)
     1017   (def-x86-opcode btcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1018     #x0fbb #o300 #x66)
     1019   (def-x86-opcode btcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1020     #x0fbb #o000 #x66)
     1021
     1022   ;; btr
     1023   (def-x86-opcode btrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1024     #x0fba #o360)
     1025   (def-x86-opcode btrl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1026     #x0fba #o060)
     1027   (def-x86-opcode btrl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1028     #x0fb3 #o300)
     1029   (def-x86-opcode btrl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1030     #x0fb3 #o000)
     1031
     1032   (def-x86-opcode btrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1033     #x0fba #o360 #x66)
     1034   (def-x86-opcode btrw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1035     #x0fba #o060 #x66)
     1036   (def-x86-opcode btrw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1037     #x0fb3 #o300 #x66)
     1038   (def-x86-opcode btrw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1039     #x0fb3 #o000 #x66)
     1040
     1041   ;; bts
     1042   (def-x86-opcode btsl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1043     #x0fba #o350)
     1044   (def-x86-opcode btsl ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1045     #x0fba #o050)
     1046   (def-x86-opcode btsl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1047     #x0fab #o300)
     1048   (def-x86-opcode btsl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1049     #x0fab #o000)
     1050
     1051   (def-x86-opcode btsw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1052     #x0fba #o350 #x66)
     1053   (def-x86-opcode btsw ((:imm8 :insert-imm8) (:anymem :insert-memory))
     1054     #x0fba #o050 #x66)
     1055   (def-x86-opcode btsw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1056     #x0fab #o300 #x66)
     1057   (def-x86-opcode btsw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1058     #x0fab #o000 #x66)
     1059
     1060   ;; call
     1061   (def-x86-opcode call ((:label :insert-label))
     1062     #xe8 nil)
     1063   (def-x86-opcode call ((:anymem :insert-memory))
     1064     #xff #o020)
     1065
     1066   ;; cbtw
     1067   (def-x86-opcode cbtw ()
     1068     #x98 nil #x66)
     1069
     1070   ;; clc
     1071   (def-x86-opcode clc ()
     1072     #xf8 nil)
     1073
     1074   ;; cld
     1075   (def-x86-opcode cld ()
     1076     #xfc nil)
     1077
     1078   ;; cltd
     1079   (def-x86-opcode cltd ()
     1080     #x99 nil)
     1081
     1082   ;; cmc
     1083   (def-x86-opcode cmc ()
     1084     #xf5 nil)
     1085
     1086   ;; cmovCC
     1087   (def-x86-opcode cmovccl
     1088       ((:imm8 :insert-cc) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1089     #x0f40 #o300)
     1090   (def-x86-opcode cmovccl
     1091       ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1092     #x0f40 #o000)
     1093   (def-x86-opcode cmovccw
     1094       ((:imm8 :insert-cc) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1095     #x0f40 #o300 #x66)
     1096   (def-x86-opcode cmovccw
     1097       ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1098     #x0f40 #o000 #x66)
     1099
     1100   (def-x86-opcode cmovol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1101     #x0f40 #o300)
     1102   (def-x86-opcode cmovol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1103     #x0f40 #o000)
     1104   (def-x86-opcode cmovow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1105     #x0f40 #o300 #x66)
     1106   (def-x86-opcode cmovow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1107     #x0f40 #o000 #x66)
     1108
     1109   (def-x86-opcode cmovnol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1110     #x0f41 #o300)
     1111   (def-x86-opcode cmovnol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1112     #x0f41 #o000)
     1113   (def-x86-opcode cmovnow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1114     #x0f41 #o300 #x66)
     1115   (def-x86-opcode cmovnow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1116     #x0f41 #o000 #x66)
     1117
     1118   (def-x86-opcode cmovbl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1119     #x0f42 #o300)
     1120   (def-x86-opcode cmovbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1121     #x0f42 #o000)
     1122   (def-x86-opcode cmovbw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1123     #x0f42 #o300 #x66)
     1124   (def-x86-opcode cmovbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1125     #x0f42 #o000 #x66)
     1126
     1127   (def-x86-opcode cmovael ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1128     #x0f43 #o300)
     1129   (def-x86-opcode cmovael ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1130     #x0f43 #o000)
     1131   (def-x86-opcode cmovaew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1132     #x0f43 #o300 #x66)
     1133   (def-x86-opcode cmovaew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1134     #x0f43 #o000 #x66)
     1135
     1136   (def-x86-opcode cmovel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1137     #x0f44 #o300)
     1138   (def-x86-opcode cmovel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1139     #x0f44 #o000)
     1140   (def-x86-opcode cmovew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1141     #x0f44 #o300 #x66)
     1142   (def-x86-opcode cmovew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1143     #x0f44 #o000 #x66)
     1144
     1145   (def-x86-opcode cmovnel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1146     #x0f45 #o300)
     1147   (def-x86-opcode cmovnel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1148     #x0f45 #o000)
     1149   (def-x86-opcode cmovnew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1150     #x0f45 #o300 #x66)
     1151   (def-x86-opcode cmovnew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1152     #x0f45 #o000 #x66)
     1153
     1154   (def-x86-opcode cmovbel ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-reg))
     1155     #x0f46 #o300)
     1156   (def-x86-opcode cmovbel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1157     #x0f46 #o000)
     1158   (def-x86-opcode cmovbew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1159     #x0f46 #o300 #x66)
     1160   (def-x86-opcode cmovbew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1161     #x0f46 #o000 #x66)
     1162
     1163   (def-x86-opcode cmoval ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1164     #x0f47 #o300)
     1165   (def-x86-opcode cmoval ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1166     #x0f47 #o000)
     1167   (def-x86-opcode cmovaw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1168     #x0f47 #o300 #x66)
     1169   (def-x86-opcode cmovaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1170     #x0f47 #o000 #x66)
     1171
     1172   (def-x86-opcode cmovsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1173     #x0f48 #o300)
     1174   (def-x86-opcode cmovsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1175     #x0f48 #o000)
     1176   (def-x86-opcode cmovsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1177     #x0f48 #o300 #x66)
     1178   (def-x86-opcode cmovsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1179     #x0f48 #o000 #x66)
     1180
     1181   (def-x86-opcode cmovnsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1182     #x0f49 #o300)
     1183   (def-x86-opcode cmovnsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1184     #x0f49 #o000)
     1185   (def-x86-opcode cmovnsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1186     #x0f49 #o300 #x66)
     1187   (def-x86-opcode cmovnsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1188     #x0f49 #o000 #x66)
     1189
     1190   (def-x86-opcode cmovpel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1191     #x0f4a #o300)
     1192   (def-x86-opcode cmovpel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1193     #x0f4a #o000)
     1194   (def-x86-opcode cmovpew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1195     #x0f4a #o300 #x66)
     1196   (def-x86-opcode cmovpew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1197     #x0f4a #o000 #x66)
     1198
     1199   (def-x86-opcode cmovpol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1200     #x0f4b #o300)
     1201   (def-x86-opcode cmovpol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1202     #x0f4b #o000)
     1203   (def-x86-opcode cmovpow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1204     #x0f4b #o300 #x66)
     1205   (def-x86-opcode cmovpow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1206     #x0f4b #o000 #x66)
     1207
     1208   (def-x86-opcode cmovll ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1209     #x0f4c #o300)
     1210   (def-x86-opcode cmovll ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1211     #x0f4c #o000)
     1212   (def-x86-opcode cmovlw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1213     #x0f4c #o300 #x66)
     1214   (def-x86-opcode cmovlw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1215     #x0f4c #o000 #x66)
     1216
     1217   (def-x86-opcode cmovgel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1218     #x0f4d #o300)
     1219   (def-x86-opcode cmovgel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1220     #x0f4d #o000)
     1221   (def-x86-opcode cmovgew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1222     #x0f4d #o300 #x66)
     1223   (def-x86-opcode cmovgew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1224     #x0f4d #o000 #x66)
     1225
     1226   (def-x86-opcode cmovlel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1227     #x0f4e #o300)
     1228   (def-x86-opcode cmovlel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1229     #x0f4e #o000)
     1230   (def-x86-opcode cmovlew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1231     #x0f4e #o300 #x66)
     1232   (def-x86-opcode cmovlew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1233     #x0f4e #o000 #x66)
     1234
     1235   (def-x86-opcode cmovgl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1236     #x0f4f #o300)
     1237   (def-x86-opcode cmovgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1238     #x0f4f #o000)
     1239   (def-x86-opcode cmovgw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1240     #x0f4f #o300 #x66)
     1241   (def-x86-opcode cmovgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1242     #x0f4f #o000 #x66)
     1243
     1244   ;; cmp
     1245   (def-x86-opcode cmpl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1246     #x39 #o300)
     1247   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1248     #x39 #o300)   
     1249   (def-x86-opcode cmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1250     #x3b #o000)
     1251   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1252     #x3b #o000)   
     1253   (def-x86-opcode cmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1254     #x39 #x00)
     1255   (def-x86-opcode rcmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1256     #x39 #x00)   
     1257   (def-x86-opcode cmpl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     1258     #x83 #o370)
     1259   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm8s :insert-imm8s))
     1260     #x83 #o370)   
     1261   (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     1262     #x3d nil)
     1263   (def-x86-opcode rcmpl ((:acc :insert-nothing) (:imm32s :insert-imm32s))
     1264     #x3d nil)   
     1265   (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     1266     #x81 #o370)
     1267   (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm32s :insert-imm32s))
     1268     #x81 #o370)   
     1269   (def-x86-opcode cmpl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1270     #x83 #o070)
     1271   (def-x86-opcode rcmpl ((:anymem :insert-memory) (:imm8s :insert-imm8s))
     1272     #x83 #o070)   
     1273   (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     1274     #x81 #o070)
     1275   (def-x86-opcode rcmpl ((:anymem :insert-memory) (:imm32s :insert-imm32s))
     1276     #x81 #o070)   
     1277
     1278   (def-x86-opcode cmpw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1279     #x39 #o300 #x66)
     1280   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1281     #x39 #o300 #x66)   
     1282   (def-x86-opcode cmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1283     #x3b #o000 #x66)
     1284   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1285     #x3b #o000 #x00)   
     1286   (def-x86-opcode cmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1287     #x39 #x00 #x00 )
     1288   (def-x86-opcode rcmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1289     #x39 #x00 #x00 )   
     1290   (def-x86-opcode cmpw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     1291     #x83 #o370 #x00)
     1292   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm8s :insert-imm8s))
     1293     #x83 #o370 #x00)   
     1294   (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     1295     #x3d nil #x66)
     1296   (def-x86-opcode rcmpw ((:acc :insert-nothing) (:imm16 :insert-imm16))
     1297     #x3d nil #x66)   
     1298   (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     1299     #x81 #o370 #x66)
     1300   (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm16 :insert-imm16))
     1301     #x81 #o370 #x66)   
     1302   (def-x86-opcode cmpw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1303     #x83 #o070 #x66)
     1304   (def-x86-opcode rcmpw ((:anymem :insert-memory) (:imm8s :insert-imm8s))
     1305     #x83 #o070 #x66)   
     1306   (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     1307     #x81 #o070 #x66)
     1308   (def-x86-opcode rcmpw ((:anymem :insert-memory) (:imm16 :insert-imm16))
     1309     #x81 #o070 #x66)   
     1310
     1311   (def-x86-opcode cmpb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     1312     #x38 #o300)
     1313   (def-x86-opcode rcmpb ((:reg8 :insert-modrm-rm) (:reg8 :insert-modrm-reg))
     1314     #x38 #o300)
     1315   (def-x86-opcode cmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     1316     #x3a #o000)
     1317   (def-x86-opcode rcmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1318     #x3a #o000)
     1319   (def-x86-opcode cmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1320     #x38 #x00)
     1321   (def-x86-opcode rcmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     1322     #x38 #x00)   
     1323   (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:acc :insert-nothing))
     1324     #x3c nil)
     1325   (def-x86-opcode rcmpb ((:acc :insert-nothing) ((:imm8s :imm8) :insert-imm8s))
     1326     #x3c nil)
     1327   (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:reg8 :insert-modrm-rm))
     1328     #x80 #o370)
     1329   (def-x86-opcode rcmpb ((:reg8 :insert-modrm-rm) ((:imm8s :imm8) :insert-imm8s))
     1330     #x80 #o370)
     1331   (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:anymem :insert-memory))
     1332     #x80 #o070)
     1333   (def-x86-opcode rcmpb ((:anymem :insert-memory) ((:imm8s :imm8) :insert-imm8s))
     1334     #x80 #o070)
     1335
     1336   ;; cmps
     1337   (def-x86-opcode cmpsl ()
     1338     #xa7 nil)
     1339
     1340   (def-x86-opcode cmpsw ()
     1341     #xa7 nil #x66)
     1342
     1343   (def-x86-opcode cmpsb ()
     1344     #xa6 nil)
     1345
     1346   ;; cmpxchg
     1347   (def-x86-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1348     #x0fb1 #o300)
     1349   (def-x86-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1350     #x0fb1 #o000)
     1351
     1352   (def-x86-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1353     #x0fb1 #o300 #x66)
     1354   (def-x86-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1355     #x0fb1 #o000 #x66)
     1356
     1357   (def-x86-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1358     #x0fb0 #o300)
     1359   (def-x86-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1360     #x0fb0 #o000)
     1361
     1362   ;; cpuid
     1363   (def-x86-opcode cpuid ()
     1364     #x0fa2 nil)
     1365
     1366   ;; cwtd
     1367   (def-x86-opcode cwtd ()
     1368     #x99 nil #x66)
     1369
     1370   ;; cwtl
     1371   (def-x86-opcode cwtl ()
     1372     #x98 nil)
     1373
     1374   ;; dec
     1375   (def-x86-opcode decl ((:anymem :insert-memory))
     1376     #xff #o010)
     1377
     1378   (def-x86-opcode decw ((:anymem :insert-memory))
     1379     #xff #o010 #x66)
     1380
     1381   (def-x86-opcode decb ((:reg8 :insert-modrm-rm))
     1382     #xfe #o310)
     1383   (def-x86-opcode decb ((:anymem :insert-memory))
     1384     #xfe #o010)
     1385
     1386   ;; div
     1387   (def-x86-opcode divl ((:reg32 :insert-modrm-rm))
     1388     #xf7 #o360)
     1389   (def-x86-opcode divl ((:anymem :insert-memory))
     1390     #xf7 #o060)
     1391
     1392   (def-x86-opcode divw ((:reg16 :insert-modrm-rm))
     1393     #xf7 #o360 #x66)
     1394   (def-x86-opcode divw ((:anymem :insert-memory))
     1395     #xf7 #o060 #x66)
     1396
     1397   (def-x86-opcode divb ((:reg8 :insert-modrm-rm))
     1398     #xf6 #o360)
     1399   (def-x86-opcode divl ((:anymem :insert-memory))
     1400     #xf6 #o060)
     1401
     1402   ;; enter
     1403   (def-x86-opcode enter ((:imm16 :insert-imm16) (:imm8 :insert-extra))
     1404     #xc8 nil)
     1405
     1406   ;; hlt
     1407   (def-x86-opcode hlt ()
     1408     #xf4 nil)
     1409
     1410   ;; idiv.  Note that GAS doesn't know about newer(?) idiv forms
     1411   (def-x86-opcode idivl ((:reg32 :insert-modrm-rm))
     1412     #xf7 #o370)
     1413   (def-x86-opcode idivl ((:anymem :insert-memory))
     1414     #xf7 #o070)
     1415
     1416   (def-x86-opcode idivw ((:reg16 :insert-modrm-rm))
     1417     #xf7 #o370 #x66)
     1418   (def-x86-opcode idivw ((:anymem :insert-memory))
     1419     #xf7 #o070 #x66)
     1420
     1421   (def-x86-opcode idivb ((:reg8 :insert-modrm-rm))
     1422     #xf6 #o370)
     1423   (def-x86-opcode idivl ((:anymem :insert-memory))
     1424     #xf6 #o070)
     1425
     1426   ;; imul
     1427   (def-x86-opcode imull ((:reg32 :insert-modrm-rm))
     1428     #xf7 #o350)
     1429   (def-x86-opcode imull ((:anymem :insert-memory))
     1430     #xf7 #o050)
     1431
     1432   (def-x86-opcode imull ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1433     #x6b #o300)
     1434   (def-x86-opcode imull ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1435     #x6b #o000)
     1436   (def-x86-opcode imull ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1437     #x69 #o300)
     1438   (def-x86-opcode imull ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1439     #x69 #o000)
     1440   (def-x86-opcode imull ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1441     #x0faf #o300)
     1442   (def-x86-opcode imull ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1443     #x0faf #o000)   
     1444   
     1445   (def-x86-opcode imulw ((:reg16 :insert-modrm-rm))
     1446     #xf7 #o350 #x66)
     1447   (def-x86-opcode imulw ((:anymem :insert-memory))
     1448     #xf7 #o050 #x66)
     1449
     1450   (def-x86-opcode imulw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1451     #x6b #o300 #x66)
     1452   (def-x86-opcode imulw ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1453     #x6b #o000 #x66)
     1454   (def-x86-opcode imulw ((:imm32s :insert-imm32s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1455     #x69 #o300 #x66)
     1456   (def-x86-opcode imulw ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1457     #x69 #o000 #x66)
     1458   (def-x86-opcode imulw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1459     #x0faf #o300 #x66)
     1460   (def-x86-opcode imulw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1461     #x0faf #o000 #x66)   
     1462
     1463   (def-x86-opcode imulb ((:reg8 :insert-modrm-rm))
     1464     #xf6 #o350)
     1465   (def-x86-opcode imulb ((:anymem :insert-memory))
     1466     #xf6 #o050)
     1467
     1468   ;; inc
     1469   (def-x86-opcode incl ((:anymem :insert-memory))
     1470     #xff #o000)
     1471
     1472   (def-x86-opcode incw ((:anymem :insert-memory))
     1473     #xff #o000 #x66)
     1474
     1475   (def-x86-opcode incb ((:reg8 :insert-modrm-rm))
     1476     #xfe #o300)
     1477   (def-x86-opcode incb ((:anymem :insert-memory))
     1478     #xfe #o000)
     1479
     1480   ;; int.  See also UUOs.
     1481   (def-x86-opcode int ((:imm8 :insert-imm8-for-int))
     1482     #xcd nil)
     1483
     1484   ;; Jcc.  Generate the short form here; maybe relax later.
     1485   (def-x86-opcode (jcc :jump) ((:imm8 :insert-cc) (:label :insert-label))
     1486     #x70 nil)
     1487   (def-x86-opcode (jcc.pt :jump) ((:imm8 :insert-cc) (:label :insert-label))
     1488     #x70 nil #x3e)
     1489   (def-x86-opcode (jcc.pn :jump) ((:imm8 :insert-cc) (:label :insert-label))
     1490     #x70 nil #x2e)
     1491
     1492   (def-x86-opcode (jo :jump) ((:label :insert-label))
     1493     #x70 nil)
     1494   (def-x86-opcode (jo.pt :jump) ((:label :insert-label))
     1495     #x70 nil #x3e)
     1496   (def-x86-opcode (jo.pn :jump) ((:label :insert-label))
     1497     #x70 nil #x2e)
     1498   (def-x86-opcode (jno :jump) ((:label :insert-label))
     1499     #x71 nil)
     1500   (def-x86-opcode (jno.pt :jump) ((:label :insert-label))
     1501     #x71 nil #x3e)
     1502   (def-x86-opcode (jno.pn :jump) ((:label :insert-label))
     1503     #x71 nil #x2e)
     1504   (def-x86-opcode (jb :jump) ((:label :insert-label))
     1505     #x72 nil)
     1506   (def-x86-opcode (jb.pt :jump) ((:label :insert-label))
     1507     #x72 nil #x3e)
     1508   (def-x86-opcode (jb.pn :jump) ((:label :insert-label))
     1509     #x72 nil #x2e)
     1510   (def-x86-opcode (jae :jump) ((:label :insert-label))
     1511     #x73 nil)
     1512   (def-x86-opcode (jae.pt :jump) ((:label :insert-label))
     1513     #x73 nil #x3e)
     1514   (def-x86-opcode (jae.pn :jump) ((:label :insert-label))
     1515     #x73 nil #x2e)
     1516   (def-x86-opcode (je :jump) ((:label :insert-label))
     1517     #x74 nil)
     1518   (def-x86-opcode (je.pt :jump) ((:label :insert-label))
     1519     #x74 nil #x3e)
     1520   (def-x86-opcode (je.pn :jump) ((:label :insert-label))
     1521     #x74 nil #x2e)
     1522   (def-x86-opcode (jz :jump) ((:label :insert-label))
     1523     #x74 nil)
     1524   (def-x86-opcode (jz.pt :jump) ((:label :insert-label))
     1525     #x74 nil #x3e)
     1526   (def-x86-opcode (jz.pn :jump) ((:label :insert-label))
     1527     #x74 nil #x2e)
     1528   (def-x86-opcode (jne :jump) ((:label :insert-label))
     1529     #x75 nil)
     1530   (def-x86-opcode (jne.pt :jump) ((:label :insert-label))
     1531     #x75 nil #x3e)
     1532   (def-x86-opcode (jne.pn :jump) ((:label :insert-label))
     1533     #x75 nil #x2e)
     1534   (def-x86-opcode (jnz :jump) ((:label :insert-label))
     1535     #x75 nil)
     1536   (def-x86-opcode (jnz.pt :jump) ((:label :insert-label))
     1537     #x75 nil #x3e)
     1538   (def-x86-opcode (jnz.pn :jump) ((:label :insert-label))
     1539     #x75 nil #x2e)
     1540   (def-x86-opcode (jbe :jump) ((:label :insert-label))
     1541     #x76 nil)
     1542   (def-x86-opcode (jbe.pt :jump) ((:label :insert-label))
     1543     #x76 nil #x3e)
     1544   (def-x86-opcode (jbe.pn :jump) ((:label :insert-label))
     1545     #x76 nil #x2e)
     1546   (def-x86-opcode (ja :jump) ((:label :insert-label))
     1547     #x77 nil)
     1548   (def-x86-opcode (ja.pt :jump) ((:label :insert-label))
     1549     #x77 nil #x3e)
     1550   (def-x86-opcode (ja.pn :jump) ((:label :insert-label))
     1551     #x77 nil #x2e)
     1552   (def-x86-opcode (js :jump) ((:label :insert-label))
     1553     #x78 nil)
     1554   (def-x86-opcode (js.pt :jump) ((:label :insert-label))
     1555     #x78 nil #x3e)
     1556   (def-x86-opcode (js.pn :jump) ((:label :insert-label))
     1557     #x78 nil #x2e)
     1558   (def-x86-opcode (jns :jump) ((:label :insert-label))
     1559     #x79 nil)
     1560   (def-x86-opcode (jns.pt :jump) ((:label :insert-label))
     1561     #x79 nil #x3e)
     1562   (def-x86-opcode (jns.pn :jump) ((:label :insert-label))
     1563     #x79 nil #x2e)
     1564   (def-x86-opcode (jpe :jump) ((:label :insert-label))
     1565     #x7a nil)
     1566   (def-x86-opcode (jpe.pt :jump) ((:label :insert-label))
     1567     #x7a nil #x3e)
     1568   (def-x86-opcode (jpe.pn :jump) ((:label :insert-label))
     1569     #x7a nil #x2e)
     1570   (def-x86-opcode (jpo :jump) ((:label :insert-label))
     1571     #x7b nil)
     1572   (def-x86-opcode (jpo.pt :jump) ((:label :insert-label))
     1573     #x7b nil #x3e)
     1574   (def-x86-opcode (jpo.pn :jump) ((:label :insert-label))
     1575     #x7b nil #x2e)
     1576   (def-x86-opcode (jl :jump) ((:label :insert-label))
     1577     #x7c nil)
     1578   (def-x86-opcode (jl.pt :jump) ((:label :insert-label))
     1579     #x7c nil #x3e)
     1580   (def-x86-opcode (jl.pn :jump) ((:label :insert-label))
     1581     #x7c nil #x2e)
     1582   (def-x86-opcode (jge :jump) ((:label :insert-label))
     1583     #x7d nil)
     1584   (def-x86-opcode (jge.pt :jump) ((:label :insert-label))
     1585     #x7d nil #x3e)
     1586   (def-x86-opcode (jge.pn :jump) ((:label :insert-label))
     1587     #x7d nil #x2e)
     1588   (def-x86-opcode (jle :jump) ((:label :insert-label))
     1589     #x7e nil)
     1590   (def-x86-opcode (jle.pt :jump) ((:label :insert-label))
     1591     #x7e nil #x3e)
     1592   (def-x86-opcode (jle.pn :jump) ((:label :insert-label))
     1593     #x7e nil #x2e)
     1594   (def-x86-opcode (jg :jump) ((:label :insert-label))
     1595     #x7f nil)
     1596   (def-x86-opcode (jg.pt :jump) ((:label :insert-label))
     1597     #x7f nil #x3e)
     1598   (def-x86-opcode (jg.pn :jump) ((:label :insert-label))
     1599     #x7f nil #x2e)
     1600
     1601   ;; jmp .  Translating the 8-bit pc-relative version to the 32-bit
     1602   ;;        pc-relative version happens during relaxation.
     1603   (def-x86-opcode (jmp :jump) ((:label :insert-label))
     1604     #xeb nil)
     1605   (def-x86-opcode jmp ((:reg32 :insert-modrm-rm))
     1606     #xff #o340)
     1607   (def-x86-opcode jmp ((:anymem :insert-memory))
     1608     #xff #o040)
     1609
     1610   ;; lea
     1611   (def-x86-opcode leal ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1612     #x8d 0)
     1613
     1614   (def-x86-opcode leaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1615     #x8d 0 #x66)
     1616
     1617   ;; leave
     1618   (def-x86-opcode leave ()
     1619     #xc9 nil)
     1620
     1621   ;; lock
     1622   (def-x86-opcode lock ()
     1623     #xf0 nil)
     1624
     1625   ;; lods
     1626   (def-x86-opcode lodsl ()
     1627     #xac nil)
     1628
     1629   ;; loop
     1630   (def-x86-opcode loopl ((:label :insert-label))
     1631     #xe2 nil)
     1632   (def-x86-opcode loopzl ((:label :insert-label))
     1633     #xe1 nil)
     1634   (def-x86-opcode loopnzl ((:label :insert-label))
     1635     #xe0 nil)
     1636
     1637   ;; mov, including the MMX/XMM variants.
     1638   (def-x86-opcode movq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     1639     #x0f6f #o300)
     1640   (def-x86-opcode movq ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
     1641     #x0f7f #o0)
     1642   (def-x86-opcode movq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     1643     #x0f6f #o0)
     1644   (def-x86-opcode movq ((:regxmm :insert-xmm-reg) (:regxmm :insert-xmm-rm))
     1645     #x0f7e #o300 #xf3)
     1646   (def-x86-opcode movq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     1647     #x0f7e #o000 #xf3)
     1648   (def-x86-opcode movq ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     1649     #x0fd6 #o000 #x66)
     1650
     1651   (def-x86-opcode movl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1652     #x89 #o300)
     1653   (def-x86-opcode movl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1654     #x8b #o0)
     1655   (def-x86-opcode movl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1656     #x89 #o0)
     1657   (def-x86-opcode movl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     1658     #xc7 #o300)
     1659   (def-x86-opcode movl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     1660     #xc7 #o000)
     1661   (def-x86-opcode movl ((:self :insert-self) (:reg32 :insert-modrm-rm))
     1662     #xc7 #o300)
     1663
     1664   (def-x86-opcode movw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1665     #x89 #o300 #x66)
     1666   (def-x86-opcode movw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1667     #x8b #o0 #x66)
     1668   (def-x86-opcode movw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1669     #x89 #o0 #x66)
     1670   (def-x86-opcode movw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     1671     #xc7 #o300 #x66)
     1672   (def-x86-opcode movw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     1673     #xc7 #o000 #x66)
     1674
     1675   (def-x86-opcode movb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     1676     #x88 #o300)
     1677   (def-x86-opcode movb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     1678     #x8a #o0)
     1679   (def-x86-opcode movb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1680     #x88 #o0)
     1681   (def-x86-opcode movb ((:imm8s :insert-imm8s) (:reg8 :insert-opcode-reg))
     1682     #xb0 nil)
     1683   (def-x86-opcode movb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1684     #xc6 #o000)
     1685 
     1686   ;; movd
     1687   (def-x86-opcode movd ((:reg32 :insert-modrm-rm) (:regmmx :insert-mmx-reg))
     1688     #x0f6e #o300)
     1689   (def-x86-opcode movd ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     1690     #x0f6e #o000)
     1691   (def-x86-opcode movd ((:regmmx :insert-mmx-reg) (:reg32 :insert-modrm-rm))
     1692     #x0f7e #o300)
     1693   (def-x86-opcode movd ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
     1694     #x0f7e #o000)
     1695
     1696   (def-x86-opcode movd ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     1697     #x0f6e #o300 #x66)
     1698   (def-x86-opcode movd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     1699     #x0f6e #o000 #x66)
     1700   (def-x86-opcode movd ((:regxmm :insert-xmm-reg) (:reg32 :insert-modrm-rm))
     1701     #x0f7e #o300 #x66)
     1702   (def-x86-opcode movd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     1703     #x0f7e #o000 #x66)
     1704
     1705   ;; sign-extending mov
     1706   (def-x86-opcode movsbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1707     #x0fbe #o300)
     1708   (def-x86-opcode movsbl ((:anymem :insert-memory)  (:reg32 :insert-modrm-reg))
     1709     #x0fbe #o000)
     1710   (def-x86-opcode movsbw ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1711     #x0fbe #o300 #x66)
     1712   (def-x86-opcode movsbw ((:anymem :insert-memory) (:reg16 :insert-modrm-rm))
     1713     #x0fbe #o300 #x66)
     1714   (def-x86-opcode movswl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1715     #x0fbf #o300)
     1716   (def-x86-opcode movswl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1717     #x0fbf #o000)
     1718
     1719   ;; zero-extending MOVs
     1720   (def-x86-opcode movzbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1721     #x0fb6 #o300)
     1722   (def-x86-opcode movzbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1723     #x0fb6 #o000)
     1724   (def-x86-opcode movzbw ((:reg8 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
     1725     #x0fb6 #o300 #x66)
     1726   (def-x86-opcode movzbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1727     #x0fb6 #o300 #x66)
     1728   (def-x86-opcode movzwl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1729     #x0fb7 #o300)
     1730   (def-x86-opcode movzwl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1731     #x0fb7 #o000)
     1732
     1733   ;; mul
     1734   (def-x86-opcode mull ((:reg32 :insert-modrm-rm))
     1735     #xf7 #o340)
     1736   (def-x86-opcode mull ((:anymem :insert-memory))
     1737     #xf7 #o040)
     1738
     1739   (def-x86-opcode mulw ((:reg16 :insert-modrm-rm))
     1740     #xf7 #o340 #x66)
     1741   (def-x86-opcode mulw ((:anymem :insert-memory))
     1742     #xf7 #o040 #x66)
     1743
     1744   (def-x86-opcode mulb ((:reg8 :insert-modrm-rm))
     1745     #xf6 #o340)
     1746   (def-x86-opcode mull ((:anymem :insert-memory))
     1747     #xf6 #o040)
     1748
     1749   ;; neg
     1750   (def-x86-opcode negl ((:reg32 :insert-modrm-rm))
     1751     #xf7 #o330)
     1752   (def-x86-opcode negl ((:anymem :insert-memory))
     1753     #xf7 #o030)
     1754
     1755   (def-x86-opcode negw ((:reg16 :insert-modrm-rm))
     1756     #xf7 #o330 #x66)
     1757   (def-x86-opcode negw ((:anymem :insert-memory))
     1758     #xf7 #o030 #x66)
     1759
     1760   (def-x86-opcode negb ((:reg8 :insert-modrm-rm))
     1761     #xf6 #o330)
     1762   (def-x86-opcode negb ((:anymem :insert-memory))
     1763     #xf6 #o030)
     1764
     1765   ;; nop
     1766   (def-x86-opcode nop ()
     1767     #x90 nil)
     1768
     1769   ;; not
     1770   (def-x86-opcode notl ((:reg32 :insert-modrm-rm))
     1771     #xf7 #o320)
     1772   (def-x86-opcode notl ((:anymem :insert-memory))
     1773     #xf7 #o020)
     1774   (def-x86-opcode notw ((:reg16 :insert-modrm-rm))
     1775     #xf7 #o320 #x66)
     1776   (def-x86-opcode notw ((:anymem :insert-memory))
     1777     #xf7 #o020 #x66)
     1778   (def-x86-opcode notb ((:reg8 :insert-modrm-rm))
     1779     #xf6 #o320)
     1780   (def-x86-opcode notb ((:anymem :insert-memory))
     1781     #xf6 #o020)
     1782
     1783   ;; or
     1784   (def-x86-opcode orl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     1785     #x09 #o300)
     1786   (def-x86-opcode orl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     1787     #x0b #o000)
     1788   (def-x86-opcode orl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     1789     #x09 #x00)
     1790   (def-x86-opcode orl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     1791     #x83 #o310)
     1792   (def-x86-opcode orl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     1793     #x0d nil)
     1794   (def-x86-opcode orl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     1795     #x81 #o310)
     1796   (def-x86-opcode orl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1797     #x83 #o010)
     1798   (def-x86-opcode orl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     1799     #x81 #o010)
     1800
     1801   (def-x86-opcode orw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     1802     #x09 #o300 #x66)
     1803   (def-x86-opcode orw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     1804     #x0b #o000 #x66)
     1805   (def-x86-opcode orw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     1806     #x09 #x00 #x66)
     1807   (def-x86-opcode orw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     1808     #x83 #o310 #x66)
     1809   (def-x86-opcode orw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     1810     #x0d nil #x66)
     1811   (def-x86-opcode orw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     1812     #x81 #o310 #x66)
     1813   (def-x86-opcode orw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1814     #x83 #o010 #x66)
     1815   (def-x86-opcode orw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     1816     #x81 #o010 #x66)
     1817
     1818   (def-x86-opcode orb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     1819     #x08 #o300)
     1820   (def-x86-opcode orb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     1821     #x0a #o000)
     1822   (def-x86-opcode orb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     1823     #x08 #x000)
     1824   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     1825     #x0c nil)
     1826   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     1827     #x80 #o310)
     1828   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     1829     #x80 #o310)
     1830   (def-x86-opcode orb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     1831     #x80 #o010)
     1832
     1833   ;; pop
     1834   (def-x86-opcode popl ((:reg32 :insert-opcode-reg))
     1835     #x58 nil)
     1836   (def-x86-opcode popl ((:anymem :insert-memory))
     1837     #x8f #o000)
     1838   (def-x86-opcode popw ((:reg16 :insert-opcode-reg))
     1839     #x58 nil #x66)
     1840   (def-x86-opcode popw ((:anymem :insert-memory))
     1841     #x8f #o000 #x66)
     1842
     1843   ;; popf
     1844   (def-x86-opcode popfl ()
     1845     #x9d nil)
     1846
     1847   ;; push .  It's not clear how "pushw $imm16" is encoded.
     1848   (def-x86-opcode pushl ((:reg64 :insert-opcode-reg))
     1849     #x50 nil)
     1850   (def-x86-opcode pushl ((:anymem :insert-memory))
     1851     #xff #o060)
     1852   (def-x86-opcode pushl ((:imm8s :insert-imm8s))
     1853     #x6a nil)
     1854   (def-x86-opcode pushl ((:imm32s :insert-imm32s))
     1855     #x68 nil)
     1856
     1857   (def-x86-opcode pushw ((:reg16 :insert-opcode-reg))
     1858     #x50 nil #x66)
     1859   (def-x86-opcode pushw ((:anymem :insert-memory))
     1860     #xff #o060 #x66)
     1861
     1862   ;; pushf
     1863   (def-x86-opcode pushfl ()
     1864     #x9c nil)
     1865   (def-x86-opcode pushfw ()
     1866     #x9c nil #x66)
     1867
     1868   ;; rcl.  Note that the :ShiftCount operand type only matches %cl.
     1869   (def-x86-opcode rcll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     1870     #xd1 #o320)
     1871   (def-x86-opcode rcll ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1872     #xd1 #o020)
     1873   (def-x86-opcode rcll ((:reg32 :insert-modrm-rm))
     1874     #xd1 #o320)
     1875   (def-x86-opcode rcll ((:anymem :insert-memory))
     1876     #xd1 #o020)
     1877   (def-x86-opcode rcll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1878     #xc1 #o320)
     1879   (def-x86-opcode rcll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     1880     #xd3 #o320)
     1881
     1882   (def-x86-opcode rclw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     1883     #xd1 #o320 #x66)
     1884   (def-x86-opcode rclw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1885     #xd1 #o020 #x66)
     1886   (def-x86-opcode rclw ((:reg16 :insert-modrm-rm))
     1887     #xd1 #o320 #x66)
     1888   (def-x86-opcode rclw ((:anymem :insert-memory))
     1889     #xd1 #o020 #x66)
     1890   (def-x86-opcode rclw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1891     #xc1 #o320 #x66)
     1892   (def-x86-opcode rclw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     1893     #xd3 #o320 #x66)
     1894
     1895   (def-x86-opcode rclb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     1896     #xd0 #o320)
     1897   (def-x86-opcode rclb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1898     #xd0 #o020)
     1899   (def-x86-opcode rclb ((:reg8 :insert-modrm-rm))
     1900     #xd0 #o320)
     1901   (def-x86-opcode rclb ((:anymem :insert-memory))
     1902     #xd0 #o020)
     1903   (def-x86-opcode rclb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     1904     #xc0 #o320)
     1905   (def-x86-opcode rclb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     1906     #xd2 #o320)
     1907
     1908   ;; rcr
     1909   (def-x86-opcode rcrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     1910     #xd1 #o330)
     1911   (def-x86-opcode rcrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1912     #xd1 #o030)
     1913   (def-x86-opcode rcrl ((:reg32 :insert-modrm-rm))
     1914     #xd1 #o330)
     1915   (def-x86-opcode rcrl ((:anymem :insert-memory))
     1916     #xd1 #o030)
     1917   (def-x86-opcode rcrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1918     #xc1 #o330)
     1919   (def-x86-opcode rcrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     1920     #xd3 #o330)
     1921
     1922   (def-x86-opcode rcrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     1923     #xd1 #o330 #x66)
     1924   (def-x86-opcode rcrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1925     #xd1 #o030 #x66)
     1926   (def-x86-opcode rcrw ((:reg16 :insert-modrm-rm))
     1927     #xd1 #o330 #x66)
     1928   (def-x86-opcode rcrw ((:anymem :insert-memory))
     1929     #xd1 #o030 #x66)
     1930   (def-x86-opcode rcrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1931     #xc1 #o330 #x66)
     1932   (def-x86-opcode rcrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     1933     #xd3 #o330 #x66)
     1934
     1935   (def-x86-opcode rcrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     1936     #xd0 #o330)
     1937   (def-x86-opcode rcrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1938     #xd0 #o030)
     1939   (def-x86-opcode rcrb ((:reg8 :insert-modrm-rm))
     1940     #xd0 #o330)
     1941   (def-x86-opcode rcrb ((:anymem :insert-memory))
     1942     #xd0 #o030)
     1943   (def-x86-opcode rcrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     1944     #xc0 #o330)
     1945   (def-x86-opcode rcrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     1946     #xd2 #o330)
     1947
     1948   ;; repe, repne.  These are really prefixes, that should
     1949   ;; only be used before string instructions.
     1950   (def-x86-opcode repe ()
     1951     #xf3 nil)
     1952   (def-x86-opcode repne ()
     1953     #xf2 nil)
     1954
     1955   ;; ret
     1956   (def-x86-opcode ret ()
     1957     #xc3 nil)
     1958   (def-x86-opcode ret ((:imm16 :insert-imm16))
     1959     #xc2 nil)
     1960
     1961   ;; rol
     1962   (def-x86-opcode roll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     1963     #xd1 #o300)
     1964   (def-x86-opcode roll ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1965     #xd1 #o000)
     1966   (def-x86-opcode roll ((:reg32 :insert-modrm-rm))
     1967     #xd1 #o300)
     1968   (def-x86-opcode roll ((:anymem :insert-memory))
     1969     #xd1 #o000)
     1970   (def-x86-opcode roll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     1971     #xc1 #o300)
     1972   (def-x86-opcode roll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     1973     #xd3 #o300)
     1974
     1975   (def-x86-opcode rolw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     1976     #xd1 #o300 #x66)
     1977   (def-x86-opcode rolw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1978     #xd1 #o000 #x66)
     1979   (def-x86-opcode rolw ((:reg16 :insert-modrm-rm))
     1980     #xd1 #o300 #x66)
     1981   (def-x86-opcode rolw ((:anymem :insert-memory))
     1982     #xd1 #o000 #x66)
     1983   (def-x86-opcode rolw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     1984     #xc1 #o300 #x66)
     1985   (def-x86-opcode rolw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     1986     #xd3 #o300 #x66)
     1987
     1988   (def-x86-opcode rolb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     1989     #xd0 #o300)
     1990   (def-x86-opcode rolb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     1991     #xd0 #o000)
     1992   (def-x86-opcode rolb ((:reg8 :insert-modrm-rm))
     1993     #xd0 #o300)
     1994   (def-x86-opcode rolb ((:anymem :insert-memory))
     1995     #xd0 #o000)
     1996   (def-x86-opcode rolb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     1997     #xc0 #o300)
     1998   (def-x86-opcode rolb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     1999     #xd2 #o300)
     2000
     2001   ;; ror
     2002   (def-x86-opcode rorl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2003     #xd1 #o310)
     2004   (def-x86-opcode rorl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2005     #xd1 #o010)
     2006   (def-x86-opcode rorl ((:reg32 :insert-modrm-rm))
     2007     #xd1 #o310)
     2008   (def-x86-opcode rorl ((:anymem :insert-memory))
     2009     #xd1 #o010)
     2010   (def-x86-opcode rorl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2011     #xc1 #o310)
     2012   (def-x86-opcode rorl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2013     #xd3 #o310)
     2014
     2015   (def-x86-opcode rorw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2016     #xd1 #o310 #x66)
     2017   (def-x86-opcode rorw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2018     #xd1 #o010 #x66)
     2019   (def-x86-opcode rorw ((:reg16 :insert-modrm-rm))
     2020     #xd1 #o310 #x66)
     2021   (def-x86-opcode rorw ((:anymem :insert-memory))
     2022     #xd1 #o010 #x66)
     2023   (def-x86-opcode rorw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2024     #xc1 #o310 #x66)
     2025   (def-x86-opcode rorw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2026     #xd3 #o310 #x66)
     2027
     2028   (def-x86-opcode rorb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2029     #xd0 #o310)
     2030   (def-x86-opcode rorb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2031     #xd0 #o010)
     2032   (def-x86-opcode rorb ((:reg8 :insert-modrm-rm))
     2033     #xd0 #o310)
     2034   (def-x86-opcode rorb ((:anymem :insert-memory))
     2035     #xd0 #o010)
     2036   (def-x86-opcode rorb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2037     #xc0 #o310)
     2038   (def-x86-opcode rorb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2039     #xd2 #o310)
     2040
     2041   ;; sar
     2042   (def-x86-opcode sarl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2043     #xd1 #o370)
     2044   (def-x86-opcode sarl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2045     #xd1 #o070)
     2046   (def-x86-opcode sarl ((:reg32 :insert-modrm-rm))
     2047     #xd1 #o370)
     2048   (def-x86-opcode sarl ((:anymem :insert-memory))
     2049     #xd1 #o070)
     2050   (def-x86-opcode sarl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2051     #xc1 #o370)
     2052   (def-x86-opcode sarl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2053     #xd3 #o370)
     2054
     2055   (def-x86-opcode sarw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2056     #xd1 #o370 #x66)
     2057   (def-x86-opcode sarw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2058     #xd1 #o070 #x66)
     2059   (def-x86-opcode sarw ((:reg16 :insert-modrm-rm))
     2060     #xd1 #o370 #x66)
     2061   (def-x86-opcode sarw ((:anymem :insert-memory))
     2062     #xd1 #o070 #x66)
     2063   (def-x86-opcode sarw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2064     #xc1 #o370 #x66)
     2065   (def-x86-opcode sarw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2066     #xd3 #o370 #x66)
     2067
     2068   (def-x86-opcode sarb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2069     #xd0 #o370)
     2070   (def-x86-opcode sarb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2071     #xd0 #o070)
     2072   (def-x86-opcode sarb ((:reg8 :insert-modrm-rm))
     2073     #xd0 #o370)
     2074   (def-x86-opcode sarb ((:anymem :insert-memory))
     2075     #xd0 #o070)
     2076   (def-x86-opcode sarb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2077     #xc0 #o370)
     2078   (def-x86-opcode sarb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2079     #xd2 #o370)
     2080
     2081   ;; sbb
     2082   (def-x86-opcode sbbl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2083     #x19 #o300)
     2084   (def-x86-opcode sbbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2085     #x1b #o000)
     2086   (def-x86-opcode sbbl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2087     #x19 #x00)
     2088   (def-x86-opcode sbbl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     2089     #x83 #o330)
     2090   (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2091     #x1d nil)
     2092   (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     2093     #x81 #o330)
     2094   (def-x86-opcode sbbl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2095     #x83 #o030)
     2096   (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2097     #x81 #o030)
     2098
     2099   (def-x86-opcode sbbw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2100     #x19 #o300 #x66)
     2101   (def-x86-opcode sbbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2102     #x1b #o000 #x66)
     2103   (def-x86-opcode sbbw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2104     #x19 #x00 #x66)
     2105   (def-x86-opcode sbbw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     2106     #x83 #o330 #x66)
     2107   (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     2108     #x1d nil #x66)
     2109   (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     2110     #x81 #o330 #x66)
     2111   (def-x86-opcode sbbw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2112     #x83 #o030 #x66)
     2113   (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2114     #x81 #o030 #x66)
     2115
     2116   (def-x86-opcode sbbb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2117     #x18 #o300)
     2118   (def-x86-opcode sbbb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2119     #x1a #o000)
     2120   (def-x86-opcode sbbb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2121     #x18 #x00)
     2122   (def-x86-opcode sbbb ((:imm8 :insert-imm8) (:acc :insert-nothing))
     2123     #x1c nil)
     2124   (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2125     #x80 #o330)
     2126   (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2127     #x80 #o330)
     2128   (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2129     #x80 #o030)
     2130
     2131   ;; scas
     2132   (def-x86-opcode scasl ()
     2133     #xaf nil)
     2134   (def-x86-opcode scasw ()
     2135     #xaf nil #x66)
     2136   (def-x86-opcode scasb ()
     2137     #xae nil)
     2138
     2139   ;; setcc
     2140   (def-x86-opcode setcc ((:imm8 :insert-cc) (:reg8 :insert-modrm-rm))
     2141     #x0f90 #o300)     
     2142   (def-x86-opcode seto ((:reg8 :insert-modrm-rm))
     2143     #x0f90 #o300)
     2144   (def-x86-opcode seto ((:anymem :insert-memory))
     2145     #x0f90 #o000)
     2146   (def-x86-opcode setno ((:reg8 :insert-modrm-rm))
     2147     #x0f91 #o300)
     2148   (def-x86-opcode setno ((:anymem :insert-memory))
     2149     #x0f91 #o000)
     2150   (def-x86-opcode setb ((:reg8 :insert-modrm-rm))
     2151     #x0f92 #o300)
     2152   (def-x86-opcode setb ((:anymem :insert-memory))
     2153     #x0f92 #o000)
     2154   (def-x86-opcode setc ((:reg8 :insert-modrm-rm))
     2155     #x0f92 #o300)
     2156   (def-x86-opcode setc ((:anymem :insert-memory))
     2157     #x0f92 #o000)
     2158   (def-x86-opcode setae ((:reg8 :insert-modrm-rm))
     2159     #x0f93 #o300)
     2160   (def-x86-opcode setae ((:anymem :insert-memory))
     2161     #x0f93 #o000)
     2162   (def-x86-opcode sete ((:reg8 :insert-modrm-rm))
     2163     #x0f94 #o300)
     2164   (def-x86-opcode sete ((:anymem :insert-memory))
     2165     #x0f94 #o000)
     2166   (def-x86-opcode setne ((:reg8 :insert-modrm-rm))
     2167     #x0f95 #o300)
     2168   (def-x86-opcode setne ((:anymem :insert-memory))
     2169     #x0f95 #o000)
     2170   (def-x86-opcode setbe ((:reg8 :insert-modrm-rm))
     2171     #x0f96 #o300)
     2172   (def-x86-opcode setbe ((:anymem :insert-memory))
     2173     #x0f96 #o000)
     2174   (def-x86-opcode seta ((:reg8 :insert-modrm-rm))
     2175     #x0f97 #o300)
     2176   (def-x86-opcode seta ((:anymem :insert-memory))
     2177     #x0f97 #o000)
     2178   (def-x86-opcode sets ((:reg8 :insert-modrm-rm))
     2179     #x0f98 #o300)
     2180   (def-x86-opcode sets ((:anymem :insert-memory))
     2181     #x0f98 #o000)
     2182   (def-x86-opcode setns ((:reg8 :insert-modrm-rm))
     2183     #x0f99 #o300)
     2184   (def-x86-opcode setns ((:anymem :insert-memory))
     2185     #x0f99 #o000)
     2186   (def-x86-opcode setpe ((:reg8 :insert-modrm-rm))
     2187     #x0f9a #o300)
     2188   (def-x86-opcode setpe ((:anymem :insert-memory))
     2189     #x0f9a #o000)
     2190   (def-x86-opcode setpo ((:reg8 :insert-modrm-rm))
     2191     #x0f9b #o300)
     2192   (def-x86-opcode setpo ((:anymem :insert-memory))
     2193     #x0f9b #o000)
     2194   (def-x86-opcode setl ((:reg8 :insert-modrm-rm))
     2195     #x0f9c #o300)
     2196   (def-x86-opcode setl ((:anymem :insert-memory))
     2197     #x0f9c #o000)
     2198   (def-x86-opcode setge ((:reg8 :insert-modrm-rm))
     2199     #x0f9d #o300)
     2200   (def-x86-opcode setge ((:anymem :insert-memory))
     2201     #x0f9d #o000)
     2202   (def-x86-opcode setle ((:reg8 :insert-modrm-rm))
     2203     #x0f9e #o300)
     2204   (def-x86-opcode setle ((:anymem :insert-memory))
     2205     #x0f9e #o000)
     2206   (def-x86-opcode setg ((:reg8 :insert-modrm-rm))
     2207     #x0f9f #o300)
     2208   (def-x86-opcode setg ((:anymem :insert-memory))
     2209     #x0f9f #o000)
     2210
     2211   ;; shl
     2212   (def-x86-opcode shll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2213     #xd1 #o340)
     2214   (def-x86-opcode shll ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2215     #xd1 #o040)
     2216   (def-x86-opcode shll ((:reg32 :insert-modrm-rm))
     2217     #xd1 #o340)
     2218   (def-x86-opcode shll ((:anymem :insert-memory))
     2219     #xd1 #o040)
     2220   (def-x86-opcode shll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2221     #xc1 #o340)
     2222   (def-x86-opcode shll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2223     #xd3 #o340)
     2224
     2225   (def-x86-opcode shlw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2226     #xd1 #o340 #x66)
     2227   (def-x86-opcode shlw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2228     #xd1 #o040 #x66)
     2229   (def-x86-opcode shlw ((:reg16 :insert-modrm-rm))
     2230     #xd1 #o340 #x66)
     2231   (def-x86-opcode shlw ((:anymem :insert-memory))
     2232     #xd1 #o040 #x66)
     2233   (def-x86-opcode shlw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2234     #xc1 #o340 #x66)
     2235   (def-x86-opcode shlw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2236     #xd3 #o340 #x66)
     2237
     2238   (def-x86-opcode shlb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2239     #xd0 #o340)
     2240   (def-x86-opcode shlb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2241     #xd0 #o040)
     2242   (def-x86-opcode shlb ((:reg8 :insert-modrm-rm))
     2243     #xd0 #o340)
     2244   (def-x86-opcode shlb ((:anymem :insert-memory))
     2245     #xd0 #o040)
     2246   (def-x86-opcode shlb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2247     #xc0 #o340)
     2248   (def-x86-opcode shlb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2249     #xd2 #o340)
     2250
     2251   ;; shld
     2252   (def-x86-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2253     #x0fa4 #o300)
     2254   (def-x86-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2255     #x0fa4 #o000)
     2256   (def-x86-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2257     #x0fa5 #o300)
     2258   (def-x86-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2259     #x0fa5 #o000)
     2260   (def-x86-opcode shldl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2261     #x0fa5 #o300)
     2262   (def-x86-opcode shldl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2263     #x0fa5 #o000)
     2264
     2265   (def-x86-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2266     #x0fa4 #o300 #x66)
     2267   (def-x86-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2268     #x0fa4 #o000 #x66)
     2269   (def-x86-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2270     #x0fa5 #o300 #x66)
     2271   (def-x86-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2272     #x0fa5 #o000 #x66)
     2273   (def-x86-opcode shldw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2274     #x0fa5 #o300 #x66)
     2275   (def-x86-opcode shldw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2276     #x0fa5 #o000 #x66)
     2277
     2278   ;; shr
     2279   (def-x86-opcode shrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
     2280     #xd1 #o350)
     2281   (def-x86-opcode shrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2282     #xd1 #o050)
     2283   (def-x86-opcode shrl ((:reg32 :insert-modrm-rm))
     2284     #xd1 #o350)
     2285   (def-x86-opcode shrl ((:anymem :insert-memory))
     2286     #xd1 #o050)
     2287   (def-x86-opcode shrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
     2288     #xc1 #o350)
     2289   (def-x86-opcode shrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
     2290     #xd3 #o350)
     2291
     2292   (def-x86-opcode shrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
     2293     #xd1 #o350 #x66)
     2294   (def-x86-opcode shrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2295     #xd1 #o050 #x66)
     2296   (def-x86-opcode shrw ((:reg16 :insert-modrm-rm))
     2297     #xd1 #o350 #x66)
     2298   (def-x86-opcode shrw ((:anymem :insert-memory))
     2299     #xd1 #o050 #x66)
     2300   (def-x86-opcode shrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
     2301     #xc1 #o350 #x66)
     2302   (def-x86-opcode shrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
     2303     #xd3 #o350 #x66)
     2304
     2305   (def-x86-opcode shrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
     2306     #xd0 #o350)
     2307   (def-x86-opcode shrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
     2308     #xd0 #o050)
     2309   (def-x86-opcode shrb ((:reg8 :insert-modrm-rm))
     2310     #xd0 #o350)
     2311   (def-x86-opcode shrb ((:anymem :insert-memory))
     2312     #xd0 #o050)
     2313   (def-x86-opcode shrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
     2314     #xc0 #o350)
     2315   (def-x86-opcode shrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
     2316     #xd2 #o350)
     2317
     2318   ;; shrd
     2319   (def-x86-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2320     #x0fac #o300)
     2321   (def-x86-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2322     #x0fac #o000)
     2323   (def-x86-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2324     #x0fad #o300)
     2325   (def-x86-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2326     #x0fad #o000)
     2327   (def-x86-opcode shrdl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2328     #x0fad #o300)
     2329   (def-x86-opcode shrdl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2330     #x0fad #o000)
     2331
     2332   (def-x86-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2333     #x0fac #o300 #x66)
     2334   (def-x86-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2335     #x0fac #o000 #x66)
     2336   (def-x86-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2337     #x0fad #o300 #x66)
     2338   (def-x86-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2339     #x0fad #o000 #x66)
     2340   (def-x86-opcode shrdw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
     2341     #x0fad #o300 #x66)
     2342   (def-x86-opcode shrdw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
     2343     #x0fad #o000 #x66)
     2344
     2345   ;; stc
     2346   (def-x86-opcode stc ()
     2347     #xf9 nil)
     2348
     2349   ;; std
     2350   (def-x86-opcode std ()
     2351     #xfd nil)
     2352
     2353   ;; sub
     2354   (def-x86-opcode subl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2355     #x29 #o300)
     2356   (def-x86-opcode subl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2357     #x2b #o000)
     2358   (def-x86-opcode subl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2359     #x29 #x00)
     2360   (def-x86-opcode subl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     2361     #x83 #o350)
     2362   (def-x86-opcode subl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2363     #x2d nil)
     2364   (def-x86-opcode subl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     2365     #x81 #o350)
     2366   (def-x86-opcode subl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2367     #x83 #o050)
     2368   (def-x86-opcode subl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2369     #x81 #o050)
     2370
     2371   (def-x86-opcode subw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2372     #x29 #o300 #x66)
     2373   (def-x86-opcode subw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2374     #x2b #o000 #x66)
     2375   (def-x86-opcode subw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2376     #x29 #x00 #x66)
     2377   (def-x86-opcode subw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     2378     #x83 #o350 #x66)
     2379   (def-x86-opcode subw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     2380     #x2d nil #x66)
     2381   (def-x86-opcode subw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     2382     #x81 #o350 #x66)
     2383   (def-x86-opcode subw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2384     #x83 #o050 #x66)
     2385   (def-x86-opcode subw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2386     #x81 #o050 #x66)
     2387
     2388   (def-x86-opcode subb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2389     #x28 #o300)
     2390   (def-x86-opcode subb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2391     #x2a #o000)
     2392   (def-x86-opcode subb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2393     #x2a #x00)
     2394   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     2395     #x2c nil)
     2396   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2397     #x80 #o350)
     2398   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2399     #x80 #o350)
     2400   (def-x86-opcode subb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2401     #x80 #o050)
     2402
     2403   ;; test
     2404   (def-x86-opcode testl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2405     #x85 #o300)
     2406   (def-x86-opcode testl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2407     #x85 #o000)
     2408   (def-x86-opcode testl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2409     #x87 #o000)
     2410   (def-x86-opcode testl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2411     #xa9 nil)
     2412   (def-x86-opcode testl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     2413     #xf7 #o300)
     2414   (def-x86-opcode testl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2415     #xf7 #o000)
     2416
     2417   (def-x86-opcode testw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2418     #x85 #o300 #x66)
     2419   (def-x86-opcode testw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2420     #x85 #o000 #x66)
     2421   (def-x86-opcode testw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2422     #x87 #o000 #x66)
     2423   (def-x86-opcode testw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     2424     #xa9 nil #x66)
     2425   (def-x86-opcode testw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     2426     #xf7 #o300 #x66)
     2427   (def-x86-opcode testw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2428     #xf7 #o000 #x66)
     2429
     2430   (def-x86-opcode testb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2431     #x84 #o300)
     2432   (def-x86-opcode testb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2433     #x84 #o000)
     2434   (def-x86-opcode testb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2435     #x86 #o000)
     2436   (def-x86-opcode testb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     2437     #xa8 nil)
     2438   (def-x86-opcode testb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2439     #xf6 #o300)
     2440   (def-x86-opcode testb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2441     #xf6 #o000)
     2442
     2443   ;; ud2a (not to be confused with all of the other undefined/accidental
     2444   ;; instructions) is "officially undefined".
     2445   (def-x86-opcode ud2a ()
     2446     #x0f0b nil)
     2447
     2448   (def-x86-opcode ud2b ()
     2449     #x0fb9 nil)
     2450
     2451   ;; xadd
     2452   (def-x86-opcode xaddl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2453     #x0fc1 #o300)
     2454   (def-x86-opcode xaddl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2455     #x0fc1 #o000)
     2456
     2457   (def-x86-opcode xaddw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2458     #x0fc1 #o300 #x66)
     2459   (def-x86-opcode xaddw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2460     #x0fc1 #o000 #x66)
     2461
     2462   (def-x86-opcode xaddb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2463     #x0fc0 #o300)
     2464   (def-x86-opcode xaddb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2465     #x0fc0 #o000)
     2466
     2467   ;; xchg
     2468   ;; Allegedly, using the opcode #x9x to implement "(xchg (% eax) (% eax))"
     2469   ;; doesn't zero-extend eax to rax on x86-64.  (So don't special-case
     2470   ;; :acc as source or destination, and use #x86 and a modrm byte in all cases.)
     2471   (def-x86-opcode xchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2472     #x87 #o300)
     2473   (def-x86-opcode xchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2474     #x87 #o000)
     2475   (def-x86-opcode xchgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2476     #x89 #o000)
     2477
     2478   (def-x86-opcode xchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2479     #x87 #o300 #x66)
     2480   (def-x86-opcode xchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2481     #x87 #o000 #x66)
     2482   (def-x86-opcode xchgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2483     #x89 #o000 #x66)
     2484
     2485   (def-x86-opcode xchgl ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2486     #x86 #o300)
     2487   (def-x86-opcode xchgl ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2488     #x86 #o000)
     2489   (def-x86-opcode xchgl ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2490     #x88 #o000)
     2491
     2492   ;; xlat
     2493   (def-x86-opcode xlatb ()
     2494     #xd7 nil)
     2495
     2496   ;; xor
     2497   (def-x86-opcode xorl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
     2498     #x31 #o300)
     2499   (def-x86-opcode xorl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2500     #x33 #o000)
     2501   (def-x86-opcode xorl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
     2502     #x31 #x00)
     2503   (def-x86-opcode xorl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
     2504     #x83 #o360)
     2505   (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
     2506     #x35 nil)
     2507   (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
     2508     #x81 #o360)
     2509   (def-x86-opcode xorl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2510     #x83 #o060)
     2511   (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
     2512     #x81 #o060)
     2513
     2514   (def-x86-opcode xorw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
     2515     #x31 #o300 #x66)
     2516   (def-x86-opcode xorw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
     2517     #x33 #o000 #x66)
     2518   (def-x86-opcode xorw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
     2519     #x31 #x00 #x66)
     2520   (def-x86-opcode xorw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
     2521     #x83 #o360 #x66)
     2522   (def-x86-opcode xorw ((:imm16 :insert-imm16) (:acc :insert-nothing))
     2523     #x35 nil #x66)
     2524   (def-x86-opcode xorw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
     2525     #x81 #o360 #x66)
     2526   (def-x86-opcode xorw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2527     #x83 #o060 #x66)
     2528   (def-x86-opcode xorw ((:imm16 :insert-imm16) (:anymem :insert-memory))
     2529     #x81 #o060 #x66)
     2530
     2531   (def-x86-opcode xorb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
     2532     #x30 #o300)
     2533   (def-x86-opcode xorb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
     2534     #x32 #o000)
     2535   (def-x86-opcode xorb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
     2536     #x30 #x00)
     2537   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
     2538     #x34 nil)
     2539   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2540     #x80 #o360)
     2541   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
     2542     #x80 #o360)
     2543   (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
     2544     #x80 #o060)
     2545
     2546   ;; fxsave
     2547   (def-x86-opcode fxsaveq ((:anymem :insert-memory))
     2548     #x0fae #o000)
     2549
     2550   ;; fxrstor
     2551   (def-x86-opcode fxrstor ((:anymem :insert-memory))
     2552     #x0fae #o010)
     2553
     2554   ;; clflush
     2555   (def-x86-opcode clflush ((:anymem :insert-memory))
     2556     #x0fae #o070)
     2557
     2558   ;; lfence
     2559   (def-x86-opcode lfence ()
     2560     #x0fae #xe8)
     2561
     2562   ;; mfence
     2563   (def-x86-opcode mfence ()
     2564     #x0fae #xf0)
     2565   
     2566   ;; pause
     2567   (def-x86-opcode pause ()
     2568     #xf390 nil)
     2569
     2570   ;; I don't want to have to define all mmx/sse/sse2 instructions at the
     2571   ;; moment, but it wouldn't hurt to define those that the lisp is
     2572   ;; likely to use.
     2573
     2574   ;; Useful mmx/sse2 instructions, other than movd/movq:
     2575
     2576   ;; emms
     2577   (def-x86-opcode emms ()
     2578     #x0f77 nil)
     2579
     2580   ;; addsd
     2581   (def-x86-opcode addsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2582     #x0f58 #o000 #xf2)
     2583   (def-x86-opcode addsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2584     #x0f58 #o300 #xf2)
     2585   
     2586   ;; addss
     2587   (def-x86-opcode addss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2588     #x0f58 #o000 #xf3)
     2589   (def-x86-opcode addss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2590     #x0f58 #o300 #xf3)
     2591
     2592   ;; subsd
     2593   (def-x86-opcode subsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2594     #x0f5c #o000 #xf2)
     2595   (def-x86-opcode subsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2596     #x0f5c #o300 #xf2)
     2597
     2598   ;; subss
     2599   (def-x86-opcode subss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2600     #x0f5c #o000 #xf3)
     2601   (def-x86-opcode subss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2602     #x0f5c #o300 #xf3)
     2603
     2604   ;; movapd
     2605   (def-x86-opcode movapd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2606     #x0f28 #o300 #x66)
     2607   (def-x86-opcode movapd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2608     #x0f28 #o000 #x66)
     2609   (def-x86-opcode movapd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     2610     #x0f29 #o000 #x66)
     2611   
     2612   ;; mulsd
     2613   (def-x86-opcode mulsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2614     #x0f59 #o000 #xf2)
     2615   (def-x86-opcode mulsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2616     #x0f59 #o300 #xf2)
     2617
     2618   ;; mulss
     2619   (def-x86-opcode mulss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2620     #x0f59 #o000 #xf3)
     2621   (def-x86-opcode mulss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2622     #x0f59 #o300 #xf3)
     2623
     2624   ;; divsd
     2625   (def-x86-opcode divsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2626     #x0f5e #o000 #xf2)
     2627   (def-x86-opcode divsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2628     #x0f5e #o300 #xf2)
     2629
     2630   ;; divss
     2631   (def-x86-opcode divss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2632     #x0f5e #o000 #xf3)
     2633   (def-x86-opcode divss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2634     #x0f5e #o300 #xf3)
     2635
     2636
     2637   ;; sqrtsd
     2638   (def-x86-opcode sqrtsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2639     #x0f51 #o000 #xf2)
     2640   (def-x86-opcode sqrtsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2641     #x0f51 #o300 #xf2)
     2642
     2643   ;; sqrtss
     2644   (def-x86-opcode sqrtss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2645     #x0f51 #o000 #xf3)
     2646   (def-x86-opcode sqrtss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2647     #x0f51 #o300 #xf3)
     2648   
     2649   ;; comisd
     2650   (def-x86-opcode comisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2651     #x0f2f #o000 #x66)
     2652   (def-x86-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2653     #x0f2f #o300 #x66)
     2654
     2655   ;; ucomisd
     2656   (def-x86-opcode ucomisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2657     #x0f2e #o000 #x66)
     2658   (def-x86-opcode ucomisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2659     #x0f2e #o300 #x66)
     2660
     2661   ;; comiss
     2662   (def-x86-opcode comiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2663     #x0f2f #o000)
     2664   (def-x86-opcode comiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2665     #x0f2f #o300)
     2666
     2667   ;; ucomiss
     2668   (def-x86-opcode ucomiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2669     #x0f2e #o000)
     2670   (def-x86-opcode ucomiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2671     #x0f2e #o300)
     2672
     2673   ;; movsd
     2674   (def-x86-opcode movsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2675     #x0f10 #o300 #xf2)
     2676   (def-x86-opcode movsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2677     #x0f10 #o300 #xf2)
     2678   (def-x86-opcode movsd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     2679     #x0f11 #o000 #xf2)
     2680
     2681   ;; movss
     2682   (def-x86-opcode movss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2683     #x0f10 #o300 #xf3)
     2684   (def-x86-opcode movss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2685     #x0f10 #o300 #xf3)
     2686   (def-x86-opcode movss ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     2687     #x0f11 #o000 #xf3)
     2688
     2689   ;;; cvtsd2si.  This does rounding (as opposed to truncation).
     2690   (def-x86-opcode cvtsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     2691     #x0f2d #o300 #xf2)
     2692   (def-x86-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2693     #x0f2d #o000 #xf2)
     2694
     2695   ;;; cvtss2si.  This does rounding (as opposed to truncation).
     2696   (def-x86-opcode cvtss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     2697     #x0f2d #o300 #xf3)
     2698   (def-x86-opcode cvtss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2699     #x0f2d #o000 #xf3)
     2700   
     2701   ;;; cvttsd2si.  This does truncation (as opposed to rounding).
     2702   (def-x86-opcode cvttsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     2703     #x0f2c #o300 #xf2)
     2704   (def-x86-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2705     #x0f2c #o000 #xf2)
     2706
     2707   ;;; cvtss2si.  This does rounding (as opposed to truncation).
     2708   (def-x86-opcode cvttss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
     2709     #x0f2d #o300 #xf3)
     2710   (def-x86-opcode cvttss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
     2711     #x0f2c #o000 #xf3)
     2712
     2713   ;; cvtsi2sd
     2714   (def-x86-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     2715     #x0f2a #o300 #xf2)
     2716   (def-x86-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2717     #x0f2a #o000 #xf2)
     2718   
     2719   ;; cvtsd2ss
     2720   (def-x86-opcode cvtsd2ss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2721     #x0f5a #o300 #xf2)
     2722   (def-x86-opcode cvtsd2ss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2723     #x0f5a #o000 #xf2)
     2724
     2725   ;; cvtsi2sd
     2726   (def-x86-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     2727     #x0f2a #o300 #xf2)
     2728   (def-x86-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2729     #x0f2a #o000 #xf2)
     2730
     2731   ;; cvtsi2ss
     2732   (def-x86-opcode cvtsi2ssl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
     2733     #x0f2a #o300 #xf3)
     2734   (def-x86-opcode cvtsi2ssl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2735     #x0f2a #o000 #xf3)
     2736
     2737   ;;; cvtss2sd
     2738   (def-x86-opcode cvtss2sd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
     2739     #x0f5a #o300 #xf3)
     2740   (def-x86-opcode cvtss2sd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     2741     #x0f5a #o000 #xf3)
     2742   
     2743   ;; pand
     2744   (def-x86-opcode pand ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     2745     #x0fdb #o300)
     2746   (def-x86-opcode pand ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     2747     #x0fdb #o000)
     2748   (def-x86-opcode pand ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     2749     #x0fef #o300 #x66)
     2750   (def-x86-opcode pand ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     2751     #x0fdb #o000 #x66)
     2752   
     2753   ;; pandn
     2754   (def-x86-opcode pandn ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     2755     #x0fdf #o300)
     2756   (def-x86-opcode pandn ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     2757     #x0fdf #o000)
     2758   (def-x86-opcode pandn ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     2759     #x0fdf #o300 #x66)
     2760   (def-x86-opcode pandn ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     2761     #x0fdf #o000 #x66)
     2762
     2763   ;; por
     2764   (def-x86-opcode por ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     2765     #x0feb #o300)
     2766   (def-x86-opcode por ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     2767     #x0feb #o000)
     2768   (def-x86-opcode por ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     2769     #x0feb #o300 #x66)
     2770   (def-x86-opcode por ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     2771     #x0feb #o000 #x66)
     2772
     2773   ;; pxor
     2774   (def-x86-opcode pxor ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     2775     #x0fef #o300)
     2776   (def-x86-opcode pxor ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     2777     #x0fef #o000)
     2778   (def-x86-opcode pxor ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     2779     #x0fef #o300 #x66)
     2780   (def-x86-opcode pxor ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     2781     #x0fef #o000 #x66)
     2782
     2783   ;; psllq
     2784   (def-x86-opcode psllq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     2785     #x0ff3 #o300)
     2786   (def-x86-opcode psllq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     2787     #x0ff3 #o000)
     2788   (def-x86-opcode psllq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     2789     #x0ff3 #o300 #x66)
     2790   (def-x86-opcode psllq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     2791     #x0ff3 #o000 #x66)
     2792   (def-x86-opcode psllq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     2793     #x0f73 #o360 #x66)
     2794
     2795   ;; psllw
     2796   
     2797   ;; pslld
     2798
     2799   ;; pslldq
     2800   (def-x86-opcode pslldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     2801     #x0f73 #o370 #x66)
     2802   
     2803   ;; psrlq
     2804   (def-x86-opcode psrlq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
     2805     #x0fd3 #o300)
     2806   (def-x86-opcode psrlq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
     2807     #x0fd3 #o000)
     2808   (def-x86-opcode psrlq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
     2809     #x0fd3 #o300 #x66)
     2810   (def-x86-opcode psrlq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
     2811     #x0fd3 #o000 #x66)
     2812   (def-x86-opcode psrlq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     2813     #x0f73 #o320 #x66)
     2814
     2815   ;; psrld
     2816
     2817   ;; psrldq
     2818   (def-x86-opcode psrldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
     2819     #x0f73 #o330 #x66)
     2820   
     2821   ;; psrlw
     2822   
     2823   ;;; End of list of useful mmx instructions
     2824   (def-x86-opcode ldmxcsr ((:anymem :insert-memory))
     2825     #x0fae #o020)
     2826
     2827   (def-x86-opcode stmxcsr ((:anymem :insert-memory))
     2828     #x0fae #o030)
     2829
     2830   ))
     2831
     2832;;; wastes space
     2833(defparameter *x8632-opcode-templates*
     2834  (concatenate 'vector *x86-common-opcode-templates*
     2835               *x86-32-bit-only-opcode-templates*))
     2836
     2837(dotimes (i (length *x8632-opcode-templates*))
     2838  (setf (x86-opcode-template-ordinal (svref *x8632-opcode-templates* i)) i))
     2839
    7072840
    7082841         
     
    34345567                    (name (x86-opcode-template-mnemonic template)))
    34355568               (push template (gethash name hash))))))
    3436     #+notyet
    34375569    (setup-templates-hash
    34385570     *x86-32-opcode-template-lists*
     
    34555587
    34565588(defparameter *x86-32-operand-insert-functions*
    3457   #(tbd))
     5589  #(insert-nothing
     5590    insert-modrm-reg
     5591    insert-modrm-rm
     5592    insert-memory
     5593    insert-opcode-reg
     5594    insert-opcode-reg4
     5595    insert-cc
     5596    insert-label
     5597    insert-imm8-for-int
     5598    insert-extra
     5599    insert-imm8
     5600    insert-imm8s
     5601    insert-imm16
     5602    insert-imm32s
     5603    insert-imm32
     5604    insert-mmx-reg
     5605    insert-mmx-rm
     5606    insert-xmm-reg
     5607    insert-xmm-rm
     5608    insert-reg4-pseudo-rm-high
     5609    insert-reg4-pseudo-rm-low
     5610    insert-self
     5611))
    34585612
    34595613(defparameter *x86-64-operand-insert-functions*
     
    34795633    insert-xmm-rm
    34805634    insert-reg4-pseudo-rm-high
    3481     insert-reg4-pseudo-rm-low))
     5635    insert-reg4-pseudo-rm-low
     5636    insert-self                         ;just for testing.  should go away.
     5637))
    34825638
    34835639(defvar *x86-operand-insert-functions* ())
     
    44466602  (setf (x86-instruction-extra instruction)
    44476603        (x86::x86-label-operand-label operand)))
     6604
     6605(defun insert-self (instruction operand)
     6606  (format t "~&insert-self: instruction = ~a operand = ~a"
     6607          instruction operand)
     6608  (setf (x86-immediate-operand-type operand)
     6609        (encode-operand-type :self))
     6610  (setf (x86-instruction-imm instruction) operand))
     6611
     6612(defparameter *x8632-register-entries*
     6613  (flet ((register-entry (name)
     6614           (let* ((r (gethash name *x86-registers*)))
     6615             (unless r (error "unknown register ~s" name))
     6616             r)))
     6617    (vector
     6618     ;; 32-bit registers
     6619     (register-entry "eax")
     6620     (register-entry "ecx")
     6621     (register-entry "edx")
     6622     (register-entry "ebx")
     6623     (register-entry "esp")
     6624     (register-entry "ebp")
     6625     (register-entry "esi")
     6626     (register-entry "edi")
     6627     ;; 16-bit-registers
     6628     (register-entry "ax")
     6629     (register-entry "cx")
     6630     (register-entry "dx")
     6631     (register-entry "bx")
     6632     (register-entry "sp")
     6633     (register-entry "bp")
     6634     (register-entry "si")
     6635     (register-entry "di")
     6636     ;; 8-bit registers
     6637     (register-entry "al")
     6638     (register-entry "cl")
     6639     (register-entry "dl")
     6640     (register-entry "bl")
     6641     (register-entry "spl")
     6642     (register-entry "bpl")
     6643     (register-entry "sil")
     6644     (register-entry "dil")
     6645       ;;; xmm registers
     6646     (register-entry "xmm0")
     6647     (register-entry "xmm1")
     6648     (register-entry "xmm2")
     6649     (register-entry "xmm3")
     6650     (register-entry "xmm4")
     6651     (register-entry "xmm5")
     6652     (register-entry "xmm6")
     6653     (register-entry "xmm7")
     6654     ;; MMX registers
     6655     (register-entry "mm0")
     6656     (register-entry "mm1")
     6657     (register-entry "mm2")
     6658     (register-entry "mm3")
     6659     (register-entry "mm4")
     6660     (register-entry "mm5")
     6661     (register-entry "mm6")
     6662     (register-entry "mm7")
     6663     ;; x87 FP regs.  May or may not be useful.
     6664     (register-entry "st[0]")
     6665     (register-entry "st[1]")
     6666     (register-entry "st[2]")
     6667     (register-entry "st[3]")
     6668     (register-entry "st[4]")
     6669     (register-entry "st[5]")
     6670     (register-entry "st[6]")
     6671     (register-entry "st[7]")
     6672     ;; Our friends, the segment registers
     6673     (register-entry "cs")
     6674     (register-entry "ds")
     6675     (register-entry "ss")
     6676     (register-entry "es")
     6677     (register-entry "fs")
     6678     (register-entry "gs")
     6679     )))
     6680
     6681(dotimes (i (length *x8632-register-entries*))
     6682  (let* ((entry (svref *x8632-register-entries* i)))
     6683    (when entry
     6684      (setf (reg-entry-ordinal32 entry) i))))
     6685
     6686(defconstant +x8632-32-bit-register+ #x0)
     6687(defconstant +x8632-16-bit-register+ #x8)
     6688(defconstant +x8632-8-bit-register+ #x10)
     6689(defconstant +x8632-xmm-register-offset+ #x18)
     6690(defconstant +x8632-mmx-register-offset+ #x20)
     6691(defconstant +x8632-fpu-register-offset+ #x28)
     6692(defconstant +x8632-segment-register-offset+ #x30)
    44486693
    44496694(defparameter *x8664-register-entries*
     
    45716816      (setf (reg-entry-ordinal64 entry) i))))
    45726817
    4573 
     6818;;; "x86" here really means "x8664"
    45746819(defconstant +x86-64-bit-register+ #x00)
    45756820(defconstant +x86-32-bit-register+ #x10)
     
    45846829  (if (and (typep i 'unsigned-byte)
    45856830           (< i 6))
    4586     (svref *x8664-register-entries* (+ +x86-segment-register-offset+ i))))
     6831      (ccl::target-arch-case
     6832       (:x8632
     6833        (svref *x8632-register-entries* (+ +x8632-segment-register-offset+ i)))
     6834       (:x8664
     6835        (svref *x8664-register-entries* (+ +x86-segment-register-offset+ i))))))
    45876836
    45886837(defun x86-xmm-register (i)
    4589   (if (typep i '(mod 16))
    4590     (svref *x8664-register-entries* (+ +x86-xmm-register-offset+ i))))
     6838  (ccl::target-arch-case
     6839   (:x8632
     6840    (if (typep i '(mod 8))
     6841        (svref *x8632-register-entries* (+ +x8632-xmm-register-offset+ i))))
     6842   (:x8664
     6843    (if (typep i '(mod 16))
     6844        (svref *x8664-register-entries* (+ +x86-xmm-register-offset+ i))))))
    45916845
    45926846(defun x86-mmx-register (i)
    45936847  (if (typep i '(mod 8))
    4594     (svref *x8664-register-entries* (+ +x86-mmx-register-offset+ i))))
     6848      (ccl::target-arch-case
     6849       (:x8632
     6850        (svref *x8632-register-entries* (+ +x8632-mmx-register-offset+ i)))
     6851       (:x8664
     6852        (svref *x8664-register-entries* (+ +x86-mmx-register-offset+ i))))))
    45956853   
    45966854
    45976855(defun gpr-ordinal (r)
    4598   (or
    4599    (etypecase r
    4600      ((mod 64) r)
    4601      ((or string symbol)
    4602       (let* ((entry (gethash r *x86-registers*)))
    4603         (if entry
    4604           (reg-entry-ordinal64 entry))))
    4605      (reg-entry (reg-entry-ordinal64 r))
    4606      (x86-register-operand
    4607       (reg-entry-ordinal64 (x86-register-operand-entry r))))
    4608    (error "Can't determine register ordinal of ~s" r)))
    4609 
     6856  (ccl::target-arch-case
     6857   (:x8632
     6858    (or
     6859     (etypecase r
     6860       ((mod 32) r)                     ;???
     6861       ((or string symbol)
     6862        (let* ((entry (gethash r *x86-registers*)))
     6863          (if entry
     6864              (reg-entry-ordinal32 entry))))
     6865       (reg-entry (reg-entry-ordinal32 r))
     6866       (x86-register-operand
     6867        (reg-entry-ordinal32 (x86-register-operand-entry r))))
     6868     (error "Can't determine register ordinal of ~s" r)))
     6869   (:x8664
     6870    (or
     6871     (etypecase r
     6872       ((mod 64) r)
     6873       ((or string symbol)
     6874        (let* ((entry (gethash r *x86-registers*)))
     6875          (if entry
     6876              (reg-entry-ordinal64 entry))))
     6877       (reg-entry (reg-entry-ordinal64 r))
     6878       (x86-register-operand
     6879        (reg-entry-ordinal64 (x86-register-operand-entry r))))
     6880     (error "Can't determine register ordinal of ~s" r)))))
     6881   
    46106882
    46116883(defun x86-reg8 (r)
    4612   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    4613                                        (byte 4 0)
    4614                                        +x86-8-bit-register+)))
     6884  (ccl::target-arch-case
     6885   (:x8632
     6886    (svref *x8632-register-entries* (dpb (gpr-ordinal r)
     6887                                         (byte 3 0)
     6888                                         +x8632-8-bit-register+)))
     6889   (:x8664
     6890    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     6891                                         (byte 4 0)
     6892                                         +x86-8-bit-register+)))))
    46156893
    46166894(defun x86-reg16 (r)
    4617   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    4618                                         (byte 4 0)
    4619                                         +x86-16-bit-register+)))
     6895  (ccl::target-arch-case
     6896   (:x8632
     6897    (svref *x8632-register-entries* (dpb (gpr-ordinal r)
     6898                                         (byte 3 0)
     6899                                         +x8632-16-bit-register+)))
     6900   (:x8664
     6901    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     6902                                         (byte 4 0)
     6903                                         +x86-16-bit-register+)))))
    46206904
    46216905(defun x86-reg32 (r)
    4622   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    4623                                         (byte 4 0)
    4624                                         +x86-32-bit-register+)))       
     6906  (ccl::target-arch-case
     6907   (:x8632
     6908    (svref *x8632-register-entries* (dpb (gpr-ordinal r)
     6909                                         (byte 3 0)
     6910                                         +x8632-32-bit-register+)))
     6911   (:x8664
     6912    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     6913                                         (byte 4 0)
     6914                                         +x86-32-bit-register+)))))
    46256915
    46266916(defun x86-reg64 (r)
    4627   (svref *x8664-register-entries* (dpb (gpr-ordinal r)
    4628                                         (byte 4 0)
    4629                                         +x86-64-bit-register+)))
     6917  (ccl::target-arch-case
     6918   (:x8632
     6919    (error "x8632 doesn't have 64 bit register ~s" r))
     6920   (:x8664
     6921    (svref *x8664-register-entries* (dpb (gpr-ordinal r)
     6922                                         (byte 4 0)
     6923                                         +x86-64-bit-register+)))))
    46306924
    46316925
Note: See TracChangeset for help on using the changeset viewer.