| 1 | ;;;-*- Mode: Lisp; Package: (X86 :use CL) -*-
|
|---|
| 2 | ;;;
|
|---|
| 3 | ;;; Copyright (C) 2005 Clozure Associates and contributors.
|
|---|
| 4 | ;;; This file is part of OpenMCL.
|
|---|
| 5 | ;;;
|
|---|
| 6 | ;;; OpenMCL is licensed under the terms of the Lisp Lesser GNU Public
|
|---|
| 7 | ;;; License known as the LLGPL and distributed with OpenMCL as the
|
|---|
| 8 | ;;; file "LICENSE". The LLGPL consists of a preamble and the LGPL
|
|---|
| 9 | ;;; which is distributed with OpenMCL as the file "LGPL". Where these
|
|---|
| 10 | ;;; conflict the preamble takes precedence.
|
|---|
| 11 | ;;;
|
|---|
| 12 | ;;; OpenMCL is referenced in the preamble as the "LIBRARY."
|
|---|
| 13 | ;;;
|
|---|
| 14 | ;;; The LLGPL is also available online at
|
|---|
| 15 | ;;; http://opensource.franz.com/preamble.html
|
|---|
| 16 |
|
|---|
| 17 | (eval-when (:compile-toplevel :load-toplevel :execute)
|
|---|
| 18 | (require "X86-ARCH")
|
|---|
| 19 | )
|
|---|
| 20 |
|
|---|
| 21 | (in-package "X86")
|
|---|
| 22 |
|
|---|
| 23 | (defconstant +MAX-OPERANDS+ 3) ; max operands per insn
|
|---|
| 24 | (defconstant +MAX-IMMEDIATE-OPERANDS+ 2) ; max immediates per insn (lcall ljmp)
|
|---|
| 25 | (defconstant +MAX-MEMORY-OPERANDS+ 2) ; max memory refs per insn (string ops)
|
|---|
| 26 |
|
|---|
| 27 | ;;; Prefixes will be emitted in the order defined below.
|
|---|
| 28 | ;;; WAIT-PREFIX must be the first prefix since FWAIT is really is an
|
|---|
| 29 | ;;; instruction and so must come before any prefixes.
|
|---|
| 30 |
|
|---|
| 31 | (defconstant +WAIT-PREFIX+ 0)
|
|---|
| 32 | (defconstant +LOCKREP-PREFIX+ 1)
|
|---|
| 33 | (defconstant +ADDR-PREFIX+ 2)
|
|---|
| 34 | (defconstant +DATA-PREFIX+ 3)
|
|---|
| 35 | (defconstant +SEG-PREFIX+ 4)
|
|---|
| 36 | (defconstant +REX-PREFIX+ 5) ; must come last.
|
|---|
| 37 | (defconstant +MAX-PREFIXES+ 6) ; max prefixes per opcode
|
|---|
| 38 |
|
|---|
| 39 | ;;; we define the syntax here (modulo base index scale syntax)
|
|---|
| 40 | (defconstant +REGISTER-PREFIX+ #\%)
|
|---|
| 41 | (defconstant +IMMEDIATE-PREFIX+ #\$)
|
|---|
| 42 | (defconstant +ABSOLUTE-PREFIX+ #\*)
|
|---|
| 43 |
|
|---|
| 44 | (defconstant +TWO-BYTE-OPCODE-ESCAPE+ #x0f)
|
|---|
| 45 | (defconstant +NOP-OPCODE+ #x90)
|
|---|
| 46 |
|
|---|
| 47 | ;;; register numbers
|
|---|
| 48 | (defconstant +EBP-REG-NUM+ 5)
|
|---|
| 49 | (defconstant +ESP-REG-NUM+ 4)
|
|---|
| 50 |
|
|---|
| 51 | ;;; modrm-byte.regmem for twobyte escape
|
|---|
| 52 | (defconstant +ESCAPE-TO-TWO-BYTE-ADDRESSING+ +ESP-REG-NUM+)
|
|---|
| 53 | ;;; index-base-byte.index for no index register addressing
|
|---|
| 54 | (defconstant +NO-INDEX-REGISTER+ +ESP-REG-NUM+)
|
|---|
| 55 | ;;; index-base-byte.base for no base register addressing
|
|---|
| 56 | (defconstant +NO-BASE-REGISTER+ +EBP-REG-NUM+)
|
|---|
| 57 | (defconstant +NO-BASE-REGISTER-16+ 6)
|
|---|
| 58 |
|
|---|
| 59 | ;;; these are the instruction mnemonic suffixes.
|
|---|
| 60 | (defconstant +WORD-MNEM-SUFFIX+ #\w)
|
|---|
| 61 | (defconstant +BYTE-MNEM-SUFFIX+ #\b)
|
|---|
| 62 | (defconstant +SHORT-MNEM-SUFFIX+ #\s)
|
|---|
| 63 | (defconstant +LONG-MNEM-SUFFIX+ #\l)
|
|---|
| 64 | (defconstant +QWORD-MNEM-SUFFIX+ #\q)
|
|---|
| 65 | (defconstant +LONG-DOUBLE-MNEM-SUFFIX+ #\x)
|
|---|
| 66 |
|
|---|
| 67 | ;;; modrm.mode = REGMEM-FIELD-HAS-REG when a register is in there
|
|---|
| 68 | (defconstant +REGMEM-FIELD-HAS-REG+ #x3) ; always = #x3
|
|---|
| 69 | (defconstant +REGMEM-FIELD-HAS-MEM+ (lognot +REGMEM-FIELD-HAS-REG+))
|
|---|
| 70 |
|
|---|
| 71 |
|
|---|
| 72 | ;;; cpu feature flags
|
|---|
| 73 | (defconstant +Cpu086+ #x1) ; Any old cpu will do 0 does the same
|
|---|
| 74 | (defconstant +Cpu186+ #x2) ; i186 or better required
|
|---|
| 75 | (defconstant +Cpu286+ #x4) ; i286 or better required
|
|---|
| 76 | (defconstant +Cpu386+ #x8) ; i386 or better required
|
|---|
| 77 | (defconstant +Cpu486+ #x10) ; i486 or better required
|
|---|
| 78 | (defconstant +Cpu586+ #x20) ; i585 or better required
|
|---|
| 79 | (defconstant +Cpu686+ #x40) ; i686 or better required
|
|---|
| 80 | (defconstant +CpuP4+ #x80) ; Pentium4 or better required
|
|---|
| 81 | (defconstant +CpuK6+ #x100) ; AMD K6 or better required
|
|---|
| 82 | (defconstant +CpuAthlon+ #x200) ; AMD Athlon or better required
|
|---|
| 83 | (defconstant +CpuSledgehammer+ #x400) ; Sledgehammer or better required
|
|---|
| 84 | (defconstant +CpuMMX+ #x800) ; MMX support required
|
|---|
| 85 | (defconstant +CpuMMX2+ #x1000) ; extended MMX support (with SSE or 3DNow!Ext) required
|
|---|
| 86 | (defconstant +CpuSSE+ #x2000) ; Streaming SIMD extensions required
|
|---|
| 87 | (defconstant +CpuSSE2+ #x4000) ; Streaming SIMD extensions 2 required
|
|---|
| 88 | (defconstant +Cpu3dnow+ #x8000) ; 3dnow! support required
|
|---|
| 89 | (defconstant +Cpu3dnowA+ #x10000) ; 3dnow!Extensions support required
|
|---|
| 90 | (defconstant +CpuPNI+ #x20000) ; Prescott New Instructions required
|
|---|
| 91 | (defconstant +CpuPadLock+ #x40000) ; VIA PadLock required
|
|---|
| 92 | ;;; These flags are set by gas depending on the flag-code.
|
|---|
| 93 | (defconstant +Cpu64+ #x4000000) ; 64bit support required
|
|---|
| 94 | (defconstant +CpuNo64+ #x8000000) ; Not supported in the 64bit mode
|
|---|
| 95 | ;;; The default value for unknown CPUs - enable all features to avoid problems.
|
|---|
| 96 | (defconstant +CpuUnknownFlags+ (logior +Cpu086+ +Cpu186+ +Cpu286+ +Cpu386+ +Cpu486+ +Cpu586+ +Cpu686+ +CpuP4+ +CpuSledgehammer+ +CpuMMX+ +CpuMMX2+ +CpuSSE+ +CpuSSE2+ +CpuPNI+ +Cpu3dnow+ +Cpu3dnowA+ +CpuK6+ +CpuAthlon+ +CpuPadLock+))
|
|---|
| 97 |
|
|---|
| 98 | (defparameter *cpu-feature-names*
|
|---|
| 99 | `((:Cpu086 . #x1) ; Any old cpu will do 0 does the same
|
|---|
| 100 | (:Cpu186 . #x2) ; i186 or better required
|
|---|
| 101 | (:Cpu286 . #x4) ; i286 or better required
|
|---|
| 102 | (:Cpu386 . #x8) ; i386 or better required
|
|---|
| 103 | (:Cpu486 . #x10) ; i486 or better required
|
|---|
| 104 | (:Cpu586 . #x20) ; i585 or better required
|
|---|
| 105 | (:Cpu686 . #x40) ; i686 or better required
|
|---|
| 106 | (:CpuP4 . #x80) ; Pentium4 or better required
|
|---|
| 107 | (:CpuK6 . #x100) ; AMD K6 or better required
|
|---|
| 108 | (:CpuAthlon . #x200) ; AMD Athlon or better required
|
|---|
| 109 | (:CpuSledgehammer . #x400) ; Sledgehammer or better required
|
|---|
| 110 | (:CpuMMX . #x800) ; MMX support required
|
|---|
| 111 | (:CpuMMX2 . #x1000) ; extended MMX support (with SSE or 3DNow!Ext) required
|
|---|
| 112 | (:CpuSSE . #x2000) ; Streaming SIMD extensions required
|
|---|
| 113 | (:CpuSSE2 . #x4000) ; Streaming SIMD extensions 2 required
|
|---|
| 114 | (:Cpu3dnow . #x8000) ; 3dnow! support required
|
|---|
| 115 | (:Cpu3dnowA . #x10000) ; 3dnow!Extensions support required
|
|---|
| 116 | (:CpuPNI . #x20000) ; Prescott New Instructions required
|
|---|
| 117 | (:CpuPadLock . #x40000) ; VIA PadLock required
|
|---|
| 118 | ;; These flags are set depending on the flag-code.
|
|---|
| 119 | (:Cpu64 . #x4000000) ; 64bit support required
|
|---|
| 120 | (:CpuNo64 . #x8000000))) ; Not supported in the 64bit mode
|
|---|
| 121 |
|
|---|
| 122 | (defun %encode-cpu-flags (flags)
|
|---|
| 123 | (flet ((encode-atomic-cpu-flag (f)
|
|---|
| 124 | (cdr (assoc f *cpu-feature-names* :test #'eq))))
|
|---|
| 125 | (if flags
|
|---|
| 126 | (if (atom flags)
|
|---|
| 127 | (encode-atomic-cpu-flag flags)
|
|---|
| 128 | (let* ((k 0))
|
|---|
| 129 | (dolist (flag flags k)
|
|---|
| 130 | (let* ((k0 (encode-atomic-cpu-flag flag)))
|
|---|
| 131 | (if k0
|
|---|
| 132 | (setq k (logior k k0))
|
|---|
| 133 | (return))))))
|
|---|
| 134 | 1)))
|
|---|
| 135 |
|
|---|
| 136 |
|
|---|
| 137 | ;;; opcode-modifier bits:
|
|---|
| 138 | (defconstant +opcode-modifier-W+ #x1) ; set if operands can be words or dwords encoded the canonical way
|
|---|
| 139 | (defconstant +opcode-modifier-D+ #x2) ; D = 0 if Reg --> Regmem D = 1 if Regmem --> Reg: MUST BE #x2
|
|---|
| 140 | (defconstant +opcode-modifier-Modrm+ #x4)
|
|---|
| 141 | (defconstant +opcode-modifier-FloatR+ #x8) ; src/dest swap for floats: MUST BE #x8
|
|---|
| 142 | (defconstant +opcode-modifier-ShortForm+ #x10) ; register is in low 3 bits of opcode
|
|---|
| 143 | (defconstant +opcode-modifier-FloatMF+ #x20) ; FP insn memory format bit sized by #x4
|
|---|
| 144 | (defconstant +opcode-modifier-Jump+ #x40) ; special case for jump insns.
|
|---|
| 145 | (defconstant +opcode-modifier-JumpDword+ #x80) ; call and jump
|
|---|
| 146 | (defconstant +opcode-modifier-JumpByte+ #x100) ; loop and jecxz
|
|---|
| 147 | (defconstant +opcode-modifier-JumpInterSegment+ #x200) ; special case for intersegment leaps/calls
|
|---|
| 148 | (defconstant +opcode-modifier-FloatD+ #x400) ; direction for float insns: MUST BE #x400
|
|---|
| 149 | (defconstant +opcode-modifier-Seg2ShortForm+ #x800) ; encoding of load segment reg insns
|
|---|
| 150 | (defconstant +opcode-modifier-Seg3ShortForm+ #x1000) ; fs/gs segment register insns.
|
|---|
| 151 | (defconstant +opcode-modifier-Size16+ #x2000) ; needs size prefix if in 32-bit mode
|
|---|
| 152 | (defconstant +opcode-modifier-Size32+ #x4000) ; needs size prefix if in 16-bit mode
|
|---|
| 153 | (defconstant +opcode-modifier-Size64+ #x8000) ; needs size prefix if in 16-bit mode
|
|---|
| 154 | (defconstant +opcode-modifier-IgnoreSize+ #x10000) ; instruction ignores operand size prefix
|
|---|
| 155 | (defconstant +opcode-modifier-DefaultSize+ #x20000) ; default insn size depends on mode
|
|---|
| 156 | (defconstant +opcode-modifier-No-bSuf+ #x40000) ; b suffix on instruction illegal
|
|---|
| 157 | (defconstant +opcode-modifier-No-wSuf+ #x80000) ; w suffix on instruction illegal
|
|---|
| 158 | (defconstant +opcode-modifier-No-lSuf+ #x100000) ; l suffix on instruction illegal
|
|---|
| 159 | (defconstant +opcode-modifier-No-sSuf+ #x200000) ; s suffix on instruction illegal
|
|---|
| 160 | (defconstant +opcode-modifier-No-qSuf+ #x400000) ; q suffix on instruction illegal
|
|---|
| 161 | (defconstant +opcode-modifier-No-xSuf+ #x800000) ; x suffix on instruction illegal
|
|---|
| 162 | (defconstant +opcode-modifier-FWait+ #x1000000) ; instruction needs FWAIT
|
|---|
| 163 | (defconstant +opcode-modifier-IsString+ #x2000000) ; quick test for string instructions
|
|---|
| 164 | (defconstant +opcode-modifier-regKludge+ #x4000000) ; fake an extra reg operand for clr imul
|
|---|
| 165 | (defconstant +opcode-modifier-IsPrefix+ #x8000000) ; opcode is a prefix
|
|---|
| 166 | (defconstant +opcode-modifier-ImmExt+ #x10000000) ; instruction has extension in 8 bit imm
|
|---|
| 167 | (defconstant +opcode-modifier-NoRex64+ #x20000000) ; instruction don't need Rex64 prefix.
|
|---|
| 168 | (defconstant +opcode-modifier-Rex64+ #x40000000) ; instruction require Rex64 prefix.
|
|---|
| 169 | (defconstant +opcode-modifier-Ugh+ #x80000000) ; deprecated fp insn gets a warning
|
|---|
| 170 |
|
|---|
| 171 |
|
|---|
| 172 | (defconstant +opcode-modifier-NoSuf+ (logior +opcode-modifier-No-bSuf+
|
|---|
| 173 | +opcode-modifier-No-wSuf+
|
|---|
| 174 | +opcode-modifier-No-lSuf+
|
|---|
| 175 | +opcode-modifier-No-sSuf+
|
|---|
| 176 | +opcode-modifier-No-xSuf+
|
|---|
| 177 | +opcode-modifier-No-qSuf+))
|
|---|
| 178 | (defconstant +opcode-modifier-b-Suf+ (logior +opcode-modifier-No-wSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 179 | (defconstant +opcode-modifier-w-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 180 | (defconstant +opcode-modifier-l-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 181 | (defconstant +opcode-modifier-q-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-xSuf+))
|
|---|
| 182 | (defconstant +opcode-modifier-x-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 183 | (defconstant +opcode-modifier-bw-Suf+ (logior +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 184 | (defconstant +opcode-modifier-bl-Suf+ (logior +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 185 | (defconstant +opcode-modifier-wl-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 186 | (defconstant +opcode-modifier-wlq-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
|
|---|
| 187 | (defconstant +opcode-modifier-lq-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
|
|---|
| 188 | (defconstant +opcode-modifier-wq-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-lSuf+ +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
|
|---|
| 189 | (defconstant +opcode-modifier-sl-Suf+ (logior +opcode-modifier-No-bSuf+ +opcode-modifier-No-wSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 190 | (defconstant +opcode-modifier-bwl-Suf+ (logior +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+ +opcode-modifier-No-qSuf+))
|
|---|
| 191 | (defconstant +opcode-modifier-bwlq-Suf+ (logior +opcode-modifier-No-sSuf+ +opcode-modifier-No-xSuf+))
|
|---|
| 192 | (defconstant +opcode-modifier-FP+ +opcode-modifier-NoSuf+)
|
|---|
| 193 | (defconstant +opcode-modifier-l-FP+ +opcode-modifier-l-Suf+)
|
|---|
| 194 | (defconstant +opcode-modifier-q-FP+ (logior +opcode-modifier-q-Suf+ +opcode-modifier-NoRex64+))
|
|---|
| 195 | (defconstant +opcode-modifier-x-FP+ (logior +opcode-modifier-x-Suf+ +opcode-modifier-FloatMF+))
|
|---|
| 196 | (defconstant +opcode-modifier-sl-FP+ (logior +opcode-modifier-sl-Suf+ +opcode-modifier-FloatMF+))
|
|---|
| 197 | ;;; Someone forgot that the FloatR bit reverses the operation when not
|
|---|
| 198 | ;;; equal to the FloatD bit. ie. Changing only FloatD results in the
|
|---|
| 199 | ;;; destination being swapped *and* the direction being reversed.
|
|---|
| 200 | (defconstant +opcode-modifier-FloatDR+ +opcode-modifier-FloatD+)
|
|---|
| 201 |
|
|---|
| 202 | (eval-when (:compile-toplevel :load-toplevel :execute)
|
|---|
| 203 | (defparameter *opcode-modifier-names*
|
|---|
| 204 | `((:w . ,+opcode-modifier-W+)
|
|---|
| 205 | (:d . ,+opcode-modifier-D+)
|
|---|
| 206 | (:modrm . ,+opcode-modifier-Modrm+)
|
|---|
| 207 | (:shortform . ,+opcode-modifier-ShortForm+)
|
|---|
| 208 | (:floatr . ,+opcode-modifier-FloatR+)
|
|---|
| 209 | (:floatmf . ,+opcode-modifier-FloatMF+)
|
|---|
| 210 | (:jump . ,+opcode-modifier-Jump+)
|
|---|
| 211 | (:jumpdword . ,+opcode-modifier-JumpDword+)
|
|---|
| 212 | (:jumpbyte . ,+opcode-modifier-JumpByte+)
|
|---|
| 213 | (:jumpintersegment . ,+opcode-modifier-JumpInterSegment+)
|
|---|
| 214 | (:floatd . ,+opcode-modifier-FloatD+)
|
|---|
| 215 | (:seg2shortform . ,+opcode-modifier-Seg2ShortForm+)
|
|---|
| 216 | (:seg3shortform . ,+opcode-modifier-Seg3ShortForm+)
|
|---|
| 217 | (:size16 . ,+opcode-modifier-Size16+)
|
|---|
| 218 | (:size32 . ,+opcode-modifier-Size32+)
|
|---|
| 219 | (:size64 . ,+opcode-modifier-Size64+)
|
|---|
| 220 | (:ignoresize . ,+opcode-modifier-IgnoreSize+)
|
|---|
| 221 | (:no-bsuf . ,+opcode-modifier-No-bsuf+)
|
|---|
| 222 | (:no-wsuf . ,+opcode-modifier-No-wsuf+)
|
|---|
| 223 | (:no-lsuf . ,+opcode-modifier-No-lsuf+)
|
|---|
| 224 | (:no-ssuf . ,+opcode-modifier-No-ssuf+)
|
|---|
| 225 | (:no-qsuf . ,+opcode-modifier-No-qsuf+)
|
|---|
| 226 | (:no-xsuf . ,+opcode-modifier-No-xsuf+)
|
|---|
| 227 | (:defaultsize . ,+opcode-modifier-DefaultSize+)
|
|---|
| 228 | (:fwait . ,+opcode-modifier-FWait+)
|
|---|
| 229 | (:isstring . ,+opcode-modifier-IsString+)
|
|---|
| 230 | (:regkludge . ,+opcode-modifier-regKludge+)
|
|---|
| 231 | (:isprefix . ,+opcode-modifier-IsPrefix+)
|
|---|
| 232 | (:immext . ,+opcode-modifier-ImmExt+)
|
|---|
| 233 | (:norex64 . ,+opcode-modifier-NoRex64+)
|
|---|
| 234 | (:rex64 . ,+opcode-modifier-Rex64+)
|
|---|
| 235 | (:ugh . ,+opcode-modifier-Ugh+)
|
|---|
| 236 | (:nosuf . ,+opcode-modifier-NoSuf+)
|
|---|
| 237 | (:b-suf . ,+opcode-modifier-b-Suf+)
|
|---|
| 238 | (:w-suf . ,+opcode-modifier-w-Suf+)
|
|---|
| 239 | (:l-suf . ,+opcode-modifier-l-Suf+)
|
|---|
| 240 | (:q-suf . ,+opcode-modifier-q-Suf+)
|
|---|
| 241 | (:x-suf . ,+opcode-modifier-x-suf+)
|
|---|
| 242 | (:wl-suf . ,+opcode-modifier-wl-Suf+)
|
|---|
| 243 | (:wlq-suf . ,+opcode-modifier-wlq-Suf+)
|
|---|
| 244 | (:lq-suf . ,+opcode-modifier-lq-Suf+)
|
|---|
| 245 | (:wq-suf . ,+opcode-modifier-wq-Suf+)
|
|---|
| 246 | (:sl-suf . ,+opcode-modifier-sl-Suf+)
|
|---|
| 247 | (:bwl-suf . ,+opcode-modifier-bwl-Suf+)
|
|---|
| 248 | (:bwlq-suf . ,+opcode-modifier-bwlq-Suf+)
|
|---|
| 249 | (:fp . ,+opcode-modifier-FP+)
|
|---|
| 250 | (:l-fp . ,+opcode-modifier-l-FP+)
|
|---|
| 251 | (:q-fp . ,+opcode-modifier-q-FP+)
|
|---|
| 252 | (:x-fp . ,+opcode-modifier-x-FP+)
|
|---|
| 253 | (:sl-fp . ,+opcode-modifier-sl-FP+)
|
|---|
| 254 | (:floatd . ,+opcode-modifier-FloatD+)
|
|---|
| 255 | (:floatdr . ,+opcode-modifier-FloatDR+)))
|
|---|
| 256 |
|
|---|
| 257 |
|
|---|
| 258 | ;;; By default, this returns NIL if the modifier can't be encoded.
|
|---|
| 259 | ;;; That's an error, but the caller can provide better error context.
|
|---|
| 260 | (defun %encode-opcode-modifier (mod &optional errorp)
|
|---|
| 261 | (flet ((encode-atomic-opcode-modifier (m)
|
|---|
| 262 | (if m
|
|---|
| 263 | (cdr (assoc m *opcode-modifier-names*))
|
|---|
| 264 | 0)))
|
|---|
| 265 | (or
|
|---|
| 266 | (if (atom mod)
|
|---|
| 267 | (encode-atomic-opcode-modifier mod)
|
|---|
| 268 | (let* ((k 0))
|
|---|
| 269 | (dolist (m mod k)
|
|---|
| 270 | (let* ((k0 (encode-atomic-opcode-modifier m)))
|
|---|
| 271 | (if k0
|
|---|
| 272 | (setq k (logior k0 k))
|
|---|
| 273 | (return))))))
|
|---|
| 274 | (if errorp (error "Unknown x86 opcode modifier: ~s" mod)))))
|
|---|
| 275 |
|
|---|
| 276 | )
|
|---|
| 277 | (defmacro encode-opcode-modifier (&rest mod)
|
|---|
| 278 | (%encode-opcode-modifier mod t))
|
|---|
| 279 |
|
|---|
| 280 |
|
|---|
| 281 | ;;; operand-types[i] bits
|
|---|
| 282 | ;;; register
|
|---|
| 283 | (defconstant +operand-type-Reg8+ #x1) ; 8 bit reg
|
|---|
| 284 | (defconstant +operand-type-Reg16+ #x2) ; 16 bit reg
|
|---|
| 285 | (defconstant +operand-type-Reg32+ #x4) ; 32 bit reg
|
|---|
| 286 | (defconstant +operand-type-Reg64+ #x8) ; 64 bit reg
|
|---|
| 287 | ;;; immediate
|
|---|
| 288 | (defconstant +operand-type-Imm8+ #x10) ; 8 bit immediate
|
|---|
| 289 | (defconstant +operand-type-Imm8S+ #x20) ; 8 bit immediate sign extended
|
|---|
| 290 | (defconstant +operand-type-Imm16+ #x40) ; 16 bit immediate
|
|---|
| 291 | (defconstant +operand-type-Imm32+ #x80) ; 32 bit immediate
|
|---|
| 292 | (defconstant +operand-type-Imm32S+ #x100) ; 32 bit immediate sign extended
|
|---|
| 293 | (defconstant +operand-type-Imm64+ #x200) ; 64 bit immediate
|
|---|
| 294 | (defconstant +operand-type-Imm1+ #x400) ; 1 bit immediate
|
|---|
| 295 | ;;; memory
|
|---|
| 296 | (defconstant +operand-type-BaseIndex+ #x800)
|
|---|
| 297 | ;;; Disp8 16 32 are used in different ways depending on the
|
|---|
| 298 | ;;; instruction. For jumps they specify the size of the PC relative
|
|---|
| 299 | ;;; displacement for baseindex type instructions they specify the
|
|---|
| 300 | ;;; size of the offset relative to the base register and for memory
|
|---|
| 301 | ;;; offset instructions such as `mov 1234 %al' they specify the size of
|
|---|
| 302 | ;;; the offset relative to the segment base.
|
|---|
| 303 | (defconstant +operand-type-Disp8+ #x1000) ; 8 bit displacement
|
|---|
| 304 | (defconstant +operand-type-Disp16+ #x2000) ; 16 bit displacement
|
|---|
| 305 | (defconstant +operand-type-Disp32+ #x4000) ; 32 bit displacement
|
|---|
| 306 | (defconstant +operand-type-Disp32S+ #x8000) ; 32 bit signed displacement
|
|---|
| 307 | (defconstant +operand-type-Disp64+ #x10000) ; 64 bit displacement
|
|---|
| 308 | ;;; specials
|
|---|
| 309 | (defconstant +operand-type-InOutPortReg+ #x20000) ; register to hold in/out port addr = dx
|
|---|
| 310 | (defconstant +operand-type-ShiftCount+ #x40000) ; register to hold shift cound = cl
|
|---|
| 311 | (defconstant +operand-type-Control+ #x80000) ; Control register
|
|---|
| 312 | (defconstant +operand-type-Debug+ #x100000) ; Debug register
|
|---|
| 313 | (defconstant +operand-type-Test+ #x200000) ; Test register
|
|---|
| 314 | (defconstant +operand-type-FloatReg+ #x400000) ; Float register
|
|---|
| 315 | (defconstant +operand-type-FloatAcc+ #x800000) ; Float stack top %st(0)
|
|---|
| 316 | (defconstant +operand-type-SReg2+ #x1000000) ; 2 bit segment register
|
|---|
| 317 | (defconstant +operand-type-SReg3+ #x2000000) ; 3 bit segment register
|
|---|
| 318 | (defconstant +operand-type-Acc+ #x4000000) ; Accumulator %al or %ax or %eax
|
|---|
| 319 | (defconstant +operand-type-JumpAbsolute+ #x8000000)
|
|---|
| 320 | (defconstant +operand-type-RegMMX+ #x10000000) ; MMX register
|
|---|
| 321 | (defconstant +operand-type-RegXMM+ #x20000000) ; XMM registers in PIII
|
|---|
| 322 | (defconstant +operand-type-EsSeg+ #x40000000) ; String insn operand with fixed es segment
|
|---|
| 323 |
|
|---|
| 324 | ;;; InvMem is for instructions with a modrm byte that only allow a
|
|---|
| 325 | ;;; general register encoding in the i.tm.mode and i.tm.regmem fields
|
|---|
| 326 | ;;; eg. control reg moves. They really ought to support a memory form
|
|---|
| 327 | ;;; but don't so we add an InvMem flag to the register operand to
|
|---|
| 328 | ;;; indicate that it should be encoded in the i.tm.regmem field.
|
|---|
| 329 | (defconstant +operand-type-InvMem+ #x80000000)
|
|---|
| 330 | (defconstant +operand-type-Label+ #x100000000)
|
|---|
| 331 |
|
|---|
| 332 | (defconstant +operand-type-Reg+ (logior +operand-type-Reg8+ +operand-type-Reg16+ +operand-type-Reg32+ +operand-type-Reg64+)) ; gen'l register
|
|---|
| 333 | (defconstant +operand-type-WordReg+ (logior +operand-type-Reg16+ +operand-type-Reg32+ +operand-type-Reg64+))
|
|---|
| 334 | (defconstant +operand-type-ImplicitRegister+ (logior +operand-type-InOutPortReg+ +operand-type-ShiftCount+ +operand-type-Acc+ +operand-type-FloatAcc+))
|
|---|
| 335 | (defconstant +operand-type-Imm+ (logior +operand-type-Imm8+ +operand-type-Imm8S+ +operand-type-Imm16+ +operand-type-Imm32S+ +operand-type-Imm32+ +operand-type-Imm64+)) ; gen'l immediate
|
|---|
| 336 | (defconstant +operand-type-EncImm+ (logior +operand-type-Imm8+ +operand-type-Imm16+ +operand-type-Imm32+ +operand-type-Imm32S+)) ; Encodable gen'l immediate
|
|---|
| 337 | (defconstant +operand-type-Disp+ (logior +operand-type-Disp8+ +operand-type-Disp16+ +operand-type-Disp32+ +operand-type-Disp32S+ +operand-type-Disp64+)) ; General displacement
|
|---|
| 338 | (defconstant +operand-type-AnyMem+ (logior +operand-type-Disp8+ +operand-type-Disp16+ +operand-type-Disp32+ +operand-type-Disp32S+ +operand-type-BaseIndex+ +operand-type-InvMem+)) ; General memory
|
|---|
| 339 | ;;; The following aliases are defined because the opcode table
|
|---|
| 340 | ;;; carefully specifies the allowed memory types for each instruction.
|
|---|
| 341 | ;;; At the moment we can only tell a memory reference size by the
|
|---|
| 342 | ;;; instruction suffix so there's not much point in defining Mem8
|
|---|
| 343 | ;;; Mem16 Mem32 and Mem64 opcode modifiers - We might as well just use
|
|---|
| 344 | ;;; the suffix directly to check memory operands.
|
|---|
| 345 | (defconstant +operand-type-LLongMem+ +operand-type-AnyMem+); 64 bits (or more)
|
|---|
| 346 | (defconstant +operand-type-LongMem+ +operand-type-AnyMem+) ; 32 bit memory ref
|
|---|
| 347 | (defconstant +operand-type-ShortMem+ +operand-type-AnyMem+) ; 16 bit memory ref
|
|---|
| 348 | (defconstant +operand-type-WordMem+ +operand-type-AnyMem+) ; 16 or 32 bit memory ref
|
|---|
| 349 | (defconstant +operand-type-ByteMem+ +operand-type-AnyMem+) ; 8 bit memory ref
|
|---|
| 350 |
|
|---|
| 351 | (eval-when (:compile-toplevel :load-toplevel :execute)
|
|---|
| 352 |
|
|---|
| 353 | (defparameter *x86-operand-type-names*
|
|---|
| 354 | `((:Reg8 . ,+operand-type-Reg8+)
|
|---|
| 355 | (:Reg16 . ,+operand-type-Reg16+)
|
|---|
| 356 | (:Reg32 . ,+operand-type-Reg32+)
|
|---|
| 357 | (:Reg64 . ,+operand-type-Reg64+)
|
|---|
| 358 | (:Imm8 . ,+operand-type-Imm8+)
|
|---|
| 359 | (:Imm8S . ,+operand-type-Imm8S+)
|
|---|
| 360 | (:Imm16 . ,+operand-type-Imm16+)
|
|---|
| 361 | (:Imm32 . ,+operand-type-Imm32+)
|
|---|
| 362 | (:Imm32S . ,+operand-type-Imm32S+)
|
|---|
| 363 | (:Imm64 . ,+operand-type-Imm64+)
|
|---|
| 364 | (:Imm1 . ,+operand-type-Imm1+)
|
|---|
| 365 | (:BaseIndex . ,+operand-type-BaseIndex+)
|
|---|
| 366 | (:Disp8 . ,+operand-type-Disp8+)
|
|---|
| 367 | (:Disp16 . ,+operand-type-Disp16+)
|
|---|
| 368 | (:Disp32 . ,+operand-type-Disp32+)
|
|---|
| 369 | (:Disp32S . ,+operand-type-Disp32S+)
|
|---|
| 370 | (:Disp64 . ,+operand-type-Disp64+)
|
|---|
| 371 | (:InOutPortReg . ,+operand-type-InOutPortReg+)
|
|---|
| 372 | (:ShiftCount . ,+operand-type-ShiftCount+)
|
|---|
| 373 | (:Control . ,+operand-type-Control+)
|
|---|
| 374 | (:Debug . ,+operand-type-Debug+)
|
|---|
| 375 | (:Test . ,+operand-type-Test+)
|
|---|
| 376 | (:FloatReg . ,+operand-type-FloatReg+)
|
|---|
| 377 | (:FloatAcc . ,+operand-type-FloatAcc+)
|
|---|
| 378 | (:SReg2 . ,+operand-type-SReg2+)
|
|---|
| 379 | (:SReg3 . ,+operand-type-SReg3+)
|
|---|
| 380 | (:Acc . ,+operand-type-Acc+)
|
|---|
| 381 | (:JumpAbsolute . ,+operand-type-JumpAbsolute+)
|
|---|
| 382 | (:RegMMX . ,+operand-type-RegMMX+)
|
|---|
| 383 | (:RegXMM . ,+operand-type-RegXMM+)
|
|---|
| 384 | (:EsSeg . ,+operand-type-EsSeg+)
|
|---|
| 385 | (:InvMem . ,+operand-type-InvMem+)
|
|---|
| 386 | (:Reg . ,+operand-type-Reg+)
|
|---|
| 387 | (:WordReg . ,+operand-type-WordReg+)
|
|---|
| 388 | (:ImplicitRegister . ,+operand-type-ImplicitRegister+)
|
|---|
| 389 | (:Imm . ,+operand-type-Imm+)
|
|---|
| 390 | (:EncImm . ,+operand-type-EncImm+)
|
|---|
| 391 | (:Disp . ,+operand-type-Disp+)
|
|---|
| 392 | (:AnyMem . ,+operand-type-AnyMem+)
|
|---|
| 393 | (:LLongMem . ,+operand-type-LLongMem+)
|
|---|
| 394 | (:LongMem . ,+operand-type-LongMem+)
|
|---|
| 395 | (:ShortMem . ,+operand-type-ShortMem+)
|
|---|
| 396 | (:WordMem . ,+operand-type-WordMem+)
|
|---|
| 397 | (:ByteMem . ,+operand-type-ByteMem+)
|
|---|
| 398 | (:Label . ,+operand-type-Label+)
|
|---|
| 399 | ))
|
|---|
| 400 |
|
|---|
| 401 | (defun %encode-operand-type (optype &optional errorp)
|
|---|
| 402 | (flet ((encode-atomic-operand-type (op)
|
|---|
| 403 | (if op
|
|---|
| 404 | (cdr (assoc op *x86-operand-type-names* :test #'eq))
|
|---|
| 405 | 0)))
|
|---|
| 406 | (or
|
|---|
| 407 | (if (atom optype)
|
|---|
| 408 | (encode-atomic-operand-type optype)
|
|---|
| 409 | (let* ((k 0))
|
|---|
| 410 | (dolist (op optype k)
|
|---|
| 411 | (let* ((k0 (encode-atomic-operand-type op)))
|
|---|
| 412 | (if k0
|
|---|
| 413 | (setq k (logior k k0))
|
|---|
| 414 | (return))))))
|
|---|
| 415 | (if errorp (error "Unknown x86 operand type ~s" optype)))))
|
|---|
| 416 | )
|
|---|
| 417 |
|
|---|
| 418 | (defmacro encode-operand-type (&rest op)
|
|---|
| 419 | (%encode-operand-type op t))
|
|---|
| 420 |
|
|---|
| 421 |
|
|---|
| 422 |
|
|---|
| 423 |
|
|---|
| 424 |
|
|---|
| 425 | (defconstant +RegRex+ #x1) ; Extended register.
|
|---|
| 426 | (defconstant +RegRex64+ #x2) ; Extended 8 bit register.
|
|---|
| 427 |
|
|---|
| 428 | (eval-when (:compile-toplevel :load-toplevel :execute)
|
|---|
| 429 | ;;; these are for register name --> number & type hash lookup
|
|---|
| 430 | (defstruct reg-entry
|
|---|
| 431 | reg-name
|
|---|
| 432 | reg-type
|
|---|
| 433 | reg-flags
|
|---|
| 434 | reg-num ; for encoding in instruction fields
|
|---|
| 435 | ordinal64 ; canonical, ordinal register number
|
|---|
| 436 | ordinal32
|
|---|
| 437 | )
|
|---|
| 438 |
|
|---|
| 439 | (defmethod make-load-form ((r reg-entry) &optional env)
|
|---|
| 440 | (declare (ignore env))
|
|---|
| 441 | (make-load-form-saving-slots r))
|
|---|
| 442 |
|
|---|
| 443 | (defstruct seg-entry
|
|---|
| 444 | seg-name
|
|---|
| 445 | seg-prefix
|
|---|
| 446 | )
|
|---|
| 447 |
|
|---|
| 448 | )
|
|---|
| 449 |
|
|---|
| 450 |
|
|---|
| 451 | (defstruct modrm-byte
|
|---|
| 452 | regmem ; codes register or memory operand
|
|---|
| 453 | reg ; codes register operand (or extended opcode)
|
|---|
| 454 | mode ; how to interpret regmem & reg
|
|---|
| 455 | )
|
|---|
| 456 |
|
|---|
| 457 | ;;; x86-64 extension prefix.
|
|---|
| 458 | ;; typedef int rex-byte
|
|---|
| 459 | (defconstant +REX-OPCODE+ #x40)
|
|---|
| 460 |
|
|---|
| 461 | ;;; Indicates 64 bit operand size.
|
|---|
| 462 | (defconstant +REX-MODE64+ 8)
|
|---|
| 463 | ;;; High extension to reg field of modrm byte.
|
|---|
| 464 | (defconstant +REX-EXTX+ 4)
|
|---|
| 465 | ;;; High extension to SIB index field.
|
|---|
| 466 | (defconstant +REX-EXTY+ 2)
|
|---|
| 467 | ;;; High extension to base field of modrm or SIB or reg field of opcode.
|
|---|
| 468 | (defconstant +REX-EXTZ+ 1)
|
|---|
| 469 |
|
|---|
| 470 | ;;; 386 opcode byte to code indirect addressing.
|
|---|
| 471 | (defstruct sib-byte
|
|---|
| 472 | base
|
|---|
| 473 | index
|
|---|
| 474 | scale
|
|---|
| 475 | )
|
|---|
| 476 |
|
|---|
| 477 |
|
|---|
| 478 | ;;; x86 arch names and features
|
|---|
| 479 | (defstruct arch-entry
|
|---|
| 480 | name ; arch name
|
|---|
| 481 | flags ; cpu feature flags
|
|---|
| 482 | )
|
|---|
| 483 |
|
|---|
| 484 |
|
|---|
| 485 | ;;; The SystemV/386 SVR3.2 assembler and probably all AT&T derived
|
|---|
| 486 | ;;; ix86 Unix assemblers generate floating point instructions with
|
|---|
| 487 | ;;; reversed source and destination registers in certain cases.
|
|---|
| 488 | ;;; Unfortunately gcc and possibly many other programs use this
|
|---|
| 489 | ;;; reversed syntax so we're stuck with it.
|
|---|
| 490 | ;;;
|
|---|
| 491 | ;;; eg. `fsub %st(3) %st' results in st = st - st(3) as expected but
|
|---|
| 492 | ;;;`fsub %st %st(3)' results in st(3) = st - st(3) rather than
|
|---|
| 493 | ;;; the expected st(3) = st(3) - st
|
|---|
| 494 | ;;;
|
|---|
| 495 | ;;; This happens with all the non-commutative arithmetic floating point
|
|---|
| 496 | ;;; operations with two register operands where the source register is
|
|---|
| 497 | ;;; %st and destination register is %st(i). See FloatDR below.
|
|---|
| 498 | ;;;
|
|---|
| 499 | ;;; The affected opcode map is dceX dcfX deeX defX.
|
|---|
| 500 |
|
|---|
| 501 | (defconstant +MOV-AX-DISP32+ #xa0)
|
|---|
| 502 | (defconstant +POP-SEG-SHORT+ #x07)
|
|---|
| 503 | (defconstant +JUMP-PC-RELATIVE+ #xe9)
|
|---|
| 504 | (defconstant +INT-OPCODE+ #xcd)
|
|---|
| 505 | (defconstant +INT3-OPCODE+ #xcc)
|
|---|
| 506 | (defconstant +FWAIT-OPCODE+ #x9b)
|
|---|
| 507 | (defconstant +ADDR-PREFIX-OPCODE+ #x67)
|
|---|
| 508 | (defconstant +DATA-PREFIX-OPCODE+ #x66)
|
|---|
| 509 | (defconstant +LOCK-PREFIX-OPCODE+ #xf0)
|
|---|
| 510 | (defconstant +CS-PREFIX-OPCODE+ #x2e)
|
|---|
| 511 | (defconstant +DS-PREFIX-OPCODE+ #x3e)
|
|---|
| 512 | (defconstant +ES-PREFIX-OPCODE+ #x26)
|
|---|
| 513 | (defconstant +FS-PREFIX-OPCODE+ #x64)
|
|---|
| 514 | (defconstant +GS-PREFIX-OPCODE+ #x65)
|
|---|
| 515 | (defconstant +SS-PREFIX-OPCODE+ #x36)
|
|---|
| 516 | (defconstant +REPNE-PREFIX-OPCODE+ #xf2)
|
|---|
| 517 | (defconstant +REPE-PREFIX-OPCODE+ #xf3)
|
|---|
| 518 |
|
|---|
| 519 |
|
|---|
| 520 | (defstruct (x86-opcode-template (:constructor %make-x86-opcode-template))
|
|---|
| 521 | mnemonic ; fully qualified, includes suffix if applicable
|
|---|
| 522 | flags ; cpuflags
|
|---|
| 523 | ordinal ; unique id
|
|---|
| 524 | operand-types ; as specific as possible
|
|---|
| 525 | operand-classes ; describe how to insert operands in base op, modrm
|
|---|
| 526 | prefixes ; list of 0 or more explicit prefixes
|
|---|
| 527 | base-opcode ; 1-3 bytes
|
|---|
| 528 | rex-prefix ; initial REX value
|
|---|
| 529 | modrm-byte ; initial modrm vale, may be nil if no modrm byte
|
|---|
| 530 | )
|
|---|
| 531 |
|
|---|
| 532 |
|
|---|
| 533 | (eval-when (:compile-toplevel :load-toplevel :execute)
|
|---|
| 534 | (defun parse-x86-opcode-operand-types (types&classes)
|
|---|
| 535 | (ccl::collect ((types))
|
|---|
| 536 | (dolist (t&c types&classes (apply #'vector (types)))
|
|---|
| 537 | (destructuring-bind (type class) t&c
|
|---|
| 538 | (declare (ignore class))
|
|---|
| 539 | (types (%encode-operand-type type t))))))
|
|---|
| 540 |
|
|---|
| 541 |
|
|---|
| 542 |
|
|---|
| 543 | (defparameter *x86-operand-insert-function-keywords*
|
|---|
| 544 | #(:insert-nothing
|
|---|
| 545 | :insert-modrm-reg
|
|---|
| 546 | :insert-modrm-rm
|
|---|
| 547 | :insert-memory
|
|---|
| 548 | :insert-opcode-reg
|
|---|
| 549 | :insert-opcode-reg4
|
|---|
| 550 | :insert-cc
|
|---|
| 551 | :insert-label
|
|---|
| 552 | :insert-imm8-for-int
|
|---|
| 553 | :insert-extra
|
|---|
| 554 | :insert-imm8
|
|---|
| 555 | :insert-imm8s
|
|---|
| 556 | :insert-imm16
|
|---|
| 557 | :insert-imm32s
|
|---|
| 558 | :insert-imm32
|
|---|
| 559 | :insert-imm64
|
|---|
| 560 | :insert-mmx-reg
|
|---|
| 561 | :insert-mmx-rm
|
|---|
| 562 | :insert-xmm-reg
|
|---|
| 563 | :insert-xmm-rm
|
|---|
| 564 | :insert-reg4-pseudo-rm-high
|
|---|
| 565 | :insert-reg4-pseudo-rm-low
|
|---|
| 566 | ))
|
|---|
| 567 |
|
|---|
| 568 | (defun parse-x86-opcode-operand-classes (types&classes)
|
|---|
| 569 | (ccl::collect ((classes))
|
|---|
| 570 | (dolist (t&c types&classes (apply #'vector (classes)))
|
|---|
| 571 | (destructuring-bind (type class) t&c
|
|---|
| 572 | (declare (ignore type))
|
|---|
| 573 | (classes (or (position class *x86-operand-insert-function-keywords*)
|
|---|
| 574 | (error "Unknown operand class: ~s" class)))))))
|
|---|
| 575 |
|
|---|
| 576 | (defun parse-x86-opcode-name (name&flags)
|
|---|
| 577 | (string-downcase (if (atom name&flags) name&flags (car name&flags))))
|
|---|
| 578 |
|
|---|
| 579 |
|
|---|
| 580 | (defun parse-x86-opcode-flags (name&flags)
|
|---|
| 581 | (if (atom name&flags)
|
|---|
| 582 | 0
|
|---|
| 583 | (%encode-opcode-modifier (cdr name&flags))))
|
|---|
| 584 |
|
|---|
| 585 | )
|
|---|
| 586 |
|
|---|
| 587 | ;;; Any instruction with no operands.
|
|---|
| 588 | (defstruct x86-instruction
|
|---|
| 589 | opcode-template
|
|---|
| 590 | rex-prefix ; ignored in 32-bit assembly
|
|---|
| 591 | base-opcode
|
|---|
| 592 | modrm-byte
|
|---|
| 593 | sib-byte
|
|---|
| 594 | seg-prefix
|
|---|
| 595 | disp
|
|---|
| 596 | imm
|
|---|
| 597 | extra
|
|---|
| 598 | )
|
|---|
| 599 |
|
|---|
| 600 | (defun need-modrm-byte (instruction)
|
|---|
| 601 | (or (x86-instruction-modrm-byte instruction)
|
|---|
| 602 | (error "Bug: no modrm byte in ~s" instruction)))
|
|---|
| 603 |
|
|---|
| 604 | (defun need-rex-prefix (instruction)
|
|---|
| 605 | (or (x86-instruction-rex-prefix instruction)
|
|---|
| 606 | (error "Bug: no REX prefix in ~s" instruction)))
|
|---|
| 607 |
|
|---|
| 608 |
|
|---|
| 609 |
|
|---|
| 610 |
|
|---|
| 611 | (defconstant modrm-mod-byte (byte 2 6))
|
|---|
| 612 | (defconstant modrm-reg-byte (byte 3 3))
|
|---|
| 613 | (defconstant modrm-rm-byte (byte 3 0))
|
|---|
| 614 |
|
|---|
| 615 | (defconstant sib-scale-byte (byte 2 6))
|
|---|
| 616 | (defconstant sib-index-byte (byte 3 3))
|
|---|
| 617 | (defconstant sib-base-byte (byte 3 0))
|
|---|
| 618 |
|
|---|
| 619 | (defun mode-from-disp-size (type)
|
|---|
| 620 | (cond ((logtest type (x86::encode-operand-type :disp8)) 1)
|
|---|
| 621 | ((logtest type (x86::encode-operand-type :disp16 :disp32 :disp32S)) 2)
|
|---|
| 622 | (t 0)))
|
|---|
| 623 |
|
|---|
| 624 |
|
|---|
| 625 | (defun insert-memory-operand-values (instruction
|
|---|
| 626 | explicit-seg
|
|---|
| 627 | disp
|
|---|
| 628 | base
|
|---|
| 629 | index
|
|---|
| 630 | scale
|
|---|
| 631 | memtype)
|
|---|
| 632 | (declare (special *ds-segment-register* *ss-segment-register*)) ;fwd refs
|
|---|
| 633 | (let* ((rm-byte (x86-instruction-modrm-byte instruction))
|
|---|
| 634 | (sib 0)
|
|---|
| 635 | (default-seg *ds-segment-register*))
|
|---|
| 636 | (cond ((null base)
|
|---|
| 637 | (setf (ldb modrm-mod-byte rm-byte) 0
|
|---|
| 638 | (ldb modrm-rm-byte rm-byte) +escape-to-two-byte-addressing+
|
|---|
| 639 | (ldb sib-base-byte sib) +no-base-register+
|
|---|
| 640 | memtype (encode-operand-type :disp32s))
|
|---|
| 641 | (cond ((null index)
|
|---|
| 642 | ;; Just a displacement.
|
|---|
| 643 | (setf (ldb sib-index-byte sib) +no-index-register+))
|
|---|
| 644 | (t
|
|---|
| 645 | ;; No base, but index
|
|---|
| 646 | (let* ((index-reg (reg-entry-reg-num index)))
|
|---|
| 647 | (setf (ldb sib-index-byte sib) index-reg
|
|---|
| 648 | (ldb sib-scale-byte sib) (or scale 0))
|
|---|
| 649 | (when (logtest (reg-entry-reg-flags index) +RegRex+)
|
|---|
| 650 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 651 | (logior +rex-exty+ (need-rex-prefix instruction))))))))
|
|---|
| 652 | ((= (reg-entry-reg-type base) (encode-operand-type :baseIndex))
|
|---|
| 653 | ;; RIP-relative. Need a displacement if we don't already
|
|---|
| 654 | ;; have one.
|
|---|
| 655 | (setf (ldb modrm-rm-byte rm-byte) +no-base-register+)
|
|---|
| 656 | (setq memtype
|
|---|
| 657 | (logior (encode-operand-type :disp32s)
|
|---|
| 658 | (encode-operand-type :label)
|
|---|
| 659 | (logandc2 memtype (encode-operand-type :disp)))))
|
|---|
| 660 | (t
|
|---|
| 661 | ;; have a real base register (not just %rip). Maybe an
|
|---|
| 662 | ;; index register, too.
|
|---|
| 663 | (let* ((baseregnum (reg-entry-reg-num base)))
|
|---|
| 664 | (setf (ldb modrm-rm-byte rm-byte) baseregnum)
|
|---|
| 665 | (when (logtest (reg-entry-reg-flags base) +RegRex+)
|
|---|
| 666 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 667 | (logior 1 (need-rex-prefix instruction))))
|
|---|
| 668 | (setf (ldb sib-base-byte sib) baseregnum)
|
|---|
| 669 | (cond ((= (logand baseregnum 7) +ebp-reg-num+)
|
|---|
| 670 | (setq default-seg *ss-segment-register*)
|
|---|
| 671 | (unless disp
|
|---|
| 672 | (setf memtype (logior memtype (encode-operand-type :disp8)))))
|
|---|
| 673 | ((= baseregnum x86::+esp-reg-num+)
|
|---|
| 674 | (setq default-seg x86::*ss-segment-register*)))
|
|---|
| 675 | (setf (ldb sib-scale-byte sib) (or scale 0))
|
|---|
| 676 | (if (null index)
|
|---|
| 677 | (setf (ldb sib-index-byte sib) +no-index-register+)
|
|---|
| 678 | (progn
|
|---|
| 679 | (setf (ldb sib-index-byte sib)
|
|---|
| 680 | (reg-entry-reg-num index)
|
|---|
| 681 | (ldb modrm-rm-byte rm-byte) +escape-to-two-byte-addressing+)
|
|---|
| 682 | (when (logtest (reg-entry-reg-flags index) +RegRex+)
|
|---|
| 683 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 684 | (logior +rex-exty+
|
|---|
| 685 | (need-rex-prefix instruction)))))))
|
|---|
| 686 | (setf (ldb modrm-mod-byte rm-byte) (mode-from-disp-size memtype))))
|
|---|
| 687 | (setf (x86-instruction-modrm-byte instruction) rm-byte)
|
|---|
| 688 | (when (= (ldb modrm-rm-byte rm-byte) +escape-to-two-byte-addressing+)
|
|---|
| 689 | (setf (x86-instruction-sib-byte instruction) sib))
|
|---|
| 690 | (when (logtest memtype (encode-operand-type :disp))
|
|---|
| 691 | (unless disp (setq disp 0))
|
|---|
| 692 | (setf (x86-instruction-disp instruction) disp
|
|---|
| 693 | (x86-instruction-extra instruction) memtype))
|
|---|
| 694 | (when (and explicit-seg
|
|---|
| 695 | (not (eq explicit-seg default-seg)))
|
|---|
| 696 | (setf (x86-instruction-seg-prefix instruction)
|
|---|
| 697 | (seg-entry-seg-prefix explicit-seg)))))
|
|---|
| 698 |
|
|---|
| 699 | (defun insert-memory (instruction operand)
|
|---|
| 700 | (insert-memory-operand-values instruction
|
|---|
| 701 | (x86-memory-operand-seg operand)
|
|---|
| 702 | (x86-memory-operand-disp operand)
|
|---|
| 703 | (x86-memory-operand-base operand)
|
|---|
| 704 | (x86-memory-operand-index operand)
|
|---|
| 705 | (x86-memory-operand-scale operand)
|
|---|
| 706 | (x86-memory-operand-type operand)))
|
|---|
| 707 |
|
|---|
| 708 |
|
|---|
| 709 | (defmacro def-x8664-opcode (name&flags types-and-classes base-opcode
|
|---|
| 710 | modrm-byte
|
|---|
| 711 | rex-prefix
|
|---|
| 712 | &rest prefixes)
|
|---|
| 713 | `(%make-x86-opcode-template
|
|---|
| 714 | :mnemonic ,(parse-x86-opcode-name name&flags)
|
|---|
| 715 | :flags ,(parse-x86-opcode-flags name&flags)
|
|---|
| 716 | :operand-types ,(parse-x86-opcode-operand-types types-and-classes)
|
|---|
| 717 | :operand-classes ,(parse-x86-opcode-operand-classes types-and-classes)
|
|---|
| 718 | :base-opcode ,base-opcode
|
|---|
| 719 | :prefixes ',prefixes
|
|---|
| 720 | :rex-prefix ,rex-prefix
|
|---|
| 721 | :modrm-byte ,modrm-byte))
|
|---|
| 722 |
|
|---|
| 723 |
|
|---|
| 724 | (defparameter *x8664-opcode-templates*
|
|---|
| 725 | (vector
|
|---|
| 726 | ;; adc
|
|---|
| 727 | (def-x8664-opcode adcq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 728 | #x11 #o300 #x48)
|
|---|
| 729 | (def-x8664-opcode adcq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 730 | #x13 #o000 #x48)
|
|---|
| 731 | (def-x8664-opcode adcq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 732 | #x11 #x00 #x48)
|
|---|
| 733 | (def-x8664-opcode adcq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 734 | #x83 #o320 #x48)
|
|---|
| 735 | (def-x8664-opcode adcq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 736 | #x15 nil #x48)
|
|---|
| 737 | (def-x8664-opcode adcq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 738 | #x81 #o320 #x48)
|
|---|
| 739 | (def-x8664-opcode adcq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 740 | #x83 #o020 #x48)
|
|---|
| 741 | (def-x8664-opcode adcq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 742 | #x81 #o020 #x48)
|
|---|
| 743 |
|
|---|
| 744 | (def-x8664-opcode adcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 745 | #x11 #o300 #x00)
|
|---|
| 746 | (def-x8664-opcode adcl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 747 | #x13 #o000 #x00)
|
|---|
| 748 | (def-x8664-opcode adcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 749 | #x11 #x00 #x00)
|
|---|
| 750 | (def-x8664-opcode adcl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 751 | #x83 #o320 #x00)
|
|---|
| 752 | (def-x8664-opcode adcl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 753 | #x15 nil nil)
|
|---|
| 754 | (def-x8664-opcode adcl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 755 | #x81 #o320 #x00)
|
|---|
| 756 | (def-x8664-opcode adcl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 757 | #x83 #o020 #x00)
|
|---|
| 758 | (def-x8664-opcode adcl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 759 | #x81 #o020 #x00)
|
|---|
| 760 |
|
|---|
| 761 | (def-x8664-opcode adcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 762 | #x11 #o300 #x00 #x66)
|
|---|
| 763 | (def-x8664-opcode adcw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 764 | #x13 #o000 #x00 #x66)
|
|---|
| 765 | (def-x8664-opcode adcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 766 | #x11 #x00 #x00 #x66)
|
|---|
| 767 | (def-x8664-opcode adcw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 768 | #x83 #o320 #x00 #x66)
|
|---|
| 769 | (def-x8664-opcode adcw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 770 | #x15 nil nil #x66)
|
|---|
| 771 | (def-x8664-opcode adcw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 772 | #x81 #o320 #x00 #x66)
|
|---|
| 773 | (def-x8664-opcode adcw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 774 | #x83 #o020 #x00 #x66)
|
|---|
| 775 | (def-x8664-opcode adcw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 776 | #x81 #o020 #x00 #x66)
|
|---|
| 777 |
|
|---|
| 778 | (def-x8664-opcode adcb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 779 | #x10 #o300 #x00)
|
|---|
| 780 | (def-x8664-opcode adcb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 781 | #x12 #o000 #x00)
|
|---|
| 782 | (def-x8664-opcode adcb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 783 | #x10 #x00 #x00)
|
|---|
| 784 | (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:acc :insert-nothing))
|
|---|
| 785 | #x14 nil nil)
|
|---|
| 786 | (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 787 | #x80 #o320 #x00)
|
|---|
| 788 | (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 789 | #x80 #o320 #x00)
|
|---|
| 790 | (def-x8664-opcode adcb ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 791 | #x80 #o020 #x00)
|
|---|
| 792 |
|
|---|
| 793 | ;; add
|
|---|
| 794 | (def-x8664-opcode addq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 795 | #x01 #o300 #x48)
|
|---|
| 796 | (def-x8664-opcode addq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 797 | #x03 #o000 #x48)
|
|---|
| 798 | (def-x8664-opcode addq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 799 | #x01 #x00 #x48)
|
|---|
| 800 | (def-x8664-opcode addq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 801 | #x83 #o300 #x48)
|
|---|
| 802 | (def-x8664-opcode addq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 803 | #x05 nil #x48)
|
|---|
| 804 | (def-x8664-opcode addq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 805 | #x81 #o300 #x48)
|
|---|
| 806 | (def-x8664-opcode addq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 807 | #x83 #o000 #x48)
|
|---|
| 808 | (def-x8664-opcode addq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 809 | #x81 #o000 #x48)
|
|---|
| 810 |
|
|---|
| 811 | (def-x8664-opcode addl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 812 | #x01 #o300 #x00)
|
|---|
| 813 | (def-x8664-opcode addl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 814 | #x03 #o000 #x00)
|
|---|
| 815 | (def-x8664-opcode addl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 816 | #x01 #x00 #x00)
|
|---|
| 817 | (def-x8664-opcode addl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 818 | #x83 #o300 #x00)
|
|---|
| 819 | (def-x8664-opcode addl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 820 | #x05 nil nil)
|
|---|
| 821 | (def-x8664-opcode addl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 822 | #x81 #o300 #x00)
|
|---|
| 823 | (def-x8664-opcode addl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 824 | #x83 #o000 #x00)
|
|---|
| 825 | (def-x8664-opcode addl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 826 | #x81 #o000 #x00)
|
|---|
| 827 |
|
|---|
| 828 | (def-x8664-opcode addw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 829 | #x01 #o300 #x00 #x66)
|
|---|
| 830 | (def-x8664-opcode addw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 831 | #x03 #o000 #x00 #x66)
|
|---|
| 832 | (def-x8664-opcode addw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 833 | #x01 #x00 #x00 #x66)
|
|---|
| 834 | (def-x8664-opcode addw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 835 | #x83 #o300 #x00 #x66)
|
|---|
| 836 | (def-x8664-opcode addw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 837 | #x05 nil nil #x66)
|
|---|
| 838 | (def-x8664-opcode addw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 839 | #x81 #o300 #x00 #x66)
|
|---|
| 840 | (def-x8664-opcode addw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 841 | #x83 #o000 #x00 #x66)
|
|---|
| 842 | (def-x8664-opcode addw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 843 | #x81 #o000 #x00 #x66)
|
|---|
| 844 |
|
|---|
| 845 | (def-x8664-opcode addb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 846 | #x00 #o300 #x00)
|
|---|
| 847 | (def-x8664-opcode addb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 848 | #x02 #o000 #x00)
|
|---|
| 849 | (def-x8664-opcode addb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 850 | #x00 #x00 #x00)
|
|---|
| 851 | (def-x8664-opcode addb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
|
|---|
| 852 | #x04 nil nil)
|
|---|
| 853 | (def-x8664-opcode addb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 854 | #x80 #o300 #x00)
|
|---|
| 855 | (def-x8664-opcode addb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 856 | #x80 #o000 #x00)
|
|---|
| 857 |
|
|---|
| 858 | ;; and
|
|---|
| 859 | (def-x8664-opcode andq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 860 | #x21 #o300 #x48)
|
|---|
| 861 | (def-x8664-opcode andq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 862 | #x23 #o000 #x48)
|
|---|
| 863 | (def-x8664-opcode andq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 864 | #x21 #x00 #x48)
|
|---|
| 865 | (def-x8664-opcode andq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 866 | #x83 #o340 #x48)
|
|---|
| 867 | (def-x8664-opcode andq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 868 | #x25 nil #x48)
|
|---|
| 869 | (def-x8664-opcode andq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 870 | #x81 #o340 #x48)
|
|---|
| 871 | (def-x8664-opcode andq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 872 | #x83 #o040 #x48)
|
|---|
| 873 | (def-x8664-opcode andq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 874 | #x81 #o040 #x48)
|
|---|
| 875 |
|
|---|
| 876 | (def-x8664-opcode andl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 877 | #x21 #o300 #x00)
|
|---|
| 878 | (def-x8664-opcode andl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 879 | #x23 #o000 #x00)
|
|---|
| 880 | (def-x8664-opcode andl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 881 | #x21 #x00 #x00)
|
|---|
| 882 | (def-x8664-opcode andl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 883 | #x83 #o340 #x00)
|
|---|
| 884 | (def-x8664-opcode andl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 885 | #x25 nil nil)
|
|---|
| 886 | (def-x8664-opcode andl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 887 | #x81 #o340 #x00)
|
|---|
| 888 | (def-x8664-opcode andl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 889 | #x83 #o040 #x00)
|
|---|
| 890 | (def-x8664-opcode andl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 891 | #x81 #o040 #x00)
|
|---|
| 892 |
|
|---|
| 893 | (def-x8664-opcode andw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 894 | #x21 #o300 #x00 #x66)
|
|---|
| 895 | (def-x8664-opcode andw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 896 | #x23 #o000 #x00 #x66)
|
|---|
| 897 | (def-x8664-opcode andw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 898 | #x21 #x00 #x00 #x66)
|
|---|
| 899 | (def-x8664-opcode andw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 900 | #x83 #o340 #x00 #x66)
|
|---|
| 901 | (def-x8664-opcode andw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 902 | #x25 nil nil #x66)
|
|---|
| 903 | (def-x8664-opcode andw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 904 | #x81 #o340 #x00 #x66)
|
|---|
| 905 | (def-x8664-opcode andw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 906 | #x83 #o040 #x00 #x66)
|
|---|
| 907 | (def-x8664-opcode andw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 908 | #x81 #o040 #x00 #x66)
|
|---|
| 909 |
|
|---|
| 910 | (def-x8664-opcode andb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 911 | #x20 #o300 #x00)
|
|---|
| 912 | (def-x8664-opcode andb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 913 | #x22 #o000 #x00)
|
|---|
| 914 | (def-x8664-opcode andb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 915 | #x20 #o000 #x00)
|
|---|
| 916 | (def-x8664-opcode andb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
|
|---|
| 917 | #x24 nil nil)
|
|---|
| 918 | (def-x8664-opcode andb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 919 | #x80 #o340 #x00)
|
|---|
| 920 | (def-x8664-opcode andb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 921 | #x80 #o040 #x00)
|
|---|
| 922 |
|
|---|
| 923 | ;; bsf
|
|---|
| 924 | (def-x8664-opcode bsfq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 925 | #x0fbc #o300 #x48)
|
|---|
| 926 | (def-x8664-opcode bsfq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 927 | #x0fbc #o000 #x48)
|
|---|
| 928 |
|
|---|
| 929 | (def-x8664-opcode bsfl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 930 | #x0fbc #o300 #x00)
|
|---|
| 931 | (def-x8664-opcode bsfl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 932 | #x0fbc #o000 #x00)
|
|---|
| 933 |
|
|---|
| 934 | (def-x8664-opcode bsfw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 935 | #x0fbc #o300 #x00 #x66)
|
|---|
| 936 | (def-x8664-opcode bsfw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 937 | #x0fbc #o000 #x00 #x66)
|
|---|
| 938 |
|
|---|
| 939 | ;; bsr
|
|---|
| 940 | (def-x8664-opcode bsrq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 941 | #x0fbd #o300 #x48)
|
|---|
| 942 | (def-x8664-opcode bsrq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 943 | #x0fbd #o000 #x48)
|
|---|
| 944 |
|
|---|
| 945 | (def-x8664-opcode bsrl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 946 | #x0fbd #o300 #x00)
|
|---|
| 947 | (def-x8664-opcode bsrl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 948 | #x0fbd #o000 #x00)
|
|---|
| 949 |
|
|---|
| 950 | (def-x8664-opcode bsrw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 951 | #x0fbd #o300 #x00 #x66)
|
|---|
| 952 | (def-x8664-opcode bsrw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 953 | #x0fbd #o000 #x00 #x66)
|
|---|
| 954 |
|
|---|
| 955 | ;; bswap
|
|---|
| 956 | (def-x8664-opcode bswapq ((:reg64 :insert-opcode-reg))
|
|---|
| 957 | #x0fc8 nil #x48)
|
|---|
| 958 |
|
|---|
| 959 | (def-x8664-opcode bswapl ((:reg64 :insert-opcode-reg))
|
|---|
| 960 | #x0fc8 nil #x00)
|
|---|
| 961 |
|
|---|
| 962 | ;; bt
|
|---|
| 963 | (def-x8664-opcode btq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 964 | #x0fba #o340 #x48)
|
|---|
| 965 | (def-x8664-opcode btq ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 966 | #x0fba #o040 #x48)
|
|---|
| 967 | (def-x8664-opcode btq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 968 | #x0fa3 #o300 #x48)
|
|---|
| 969 | (def-x8664-opcode btq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 970 | #x0fa3 #o000 #x48)
|
|---|
| 971 |
|
|---|
| 972 | (def-x8664-opcode btl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 973 | #x0fba #o340 #x00)
|
|---|
| 974 | (def-x8664-opcode btl ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 975 | #x0fba #o040 #x00)
|
|---|
| 976 | (def-x8664-opcode btl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 977 | #x0fa3 #o300 #x00)
|
|---|
| 978 | (def-x8664-opcode btl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 979 | #x0fa3 #o000 #x00)
|
|---|
| 980 |
|
|---|
| 981 | (def-x8664-opcode btw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 982 | #x0fba #o340 #x00 #x66)
|
|---|
| 983 | (def-x8664-opcode btw ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 984 | #x0fba #o040 #x00 #x66)
|
|---|
| 985 | (def-x8664-opcode btw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 986 | #x0fa3 #o300 #x00 #x66)
|
|---|
| 987 | (def-x8664-opcode btw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 988 | #x0fa3 #o000 #x00 #x66)
|
|---|
| 989 |
|
|---|
| 990 | ;; btc
|
|---|
| 991 | (def-x8664-opcode btcq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 992 | #x0fba #o370 #x48)
|
|---|
| 993 | (def-x8664-opcode btcq ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 994 | #x0fba #o070 #x48)
|
|---|
| 995 | (def-x8664-opcode btcq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 996 | #x0fbb #o300 #x48)
|
|---|
| 997 | (def-x8664-opcode btcq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 998 | #x0fbb #o000 #x48)
|
|---|
| 999 |
|
|---|
| 1000 | (def-x8664-opcode btcl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 1001 | #x0fba #o370 #x00)
|
|---|
| 1002 | (def-x8664-opcode btcl ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1003 | #x0fba #o070 #x00)
|
|---|
| 1004 | (def-x8664-opcode btcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1005 | #x0fbb #o300 #x00)
|
|---|
| 1006 | (def-x8664-opcode btcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1007 | #x0fbb #o000 #x00)
|
|---|
| 1008 |
|
|---|
| 1009 | (def-x8664-opcode btcw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 1010 | #x0fba #o370 #x00 #x66)
|
|---|
| 1011 | (def-x8664-opcode btcw ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1012 | #x0fba #o070 #x00 #x66)
|
|---|
| 1013 | (def-x8664-opcode btcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1014 | #x0fbb #o300 #x00 #x66)
|
|---|
| 1015 | (def-x8664-opcode btcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1016 | #x0fbb #o000 #x00 #x66)
|
|---|
| 1017 |
|
|---|
| 1018 | ;; btr
|
|---|
| 1019 | (def-x8664-opcode btrq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 1020 | #x0fba #o360 #x48)
|
|---|
| 1021 | (def-x8664-opcode btrq ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1022 | #x0fba #o060 #x48)
|
|---|
| 1023 | (def-x8664-opcode btrq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 1024 | #x0fb3 #o300 #x48)
|
|---|
| 1025 | (def-x8664-opcode btrq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1026 | #x0fb3 #o000 #x48)
|
|---|
| 1027 |
|
|---|
| 1028 | (def-x8664-opcode btrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 1029 | #x0fba #o360 #x00)
|
|---|
| 1030 | (def-x8664-opcode btrl ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1031 | #x0fba #o060 #x00)
|
|---|
| 1032 | (def-x8664-opcode btrl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1033 | #x0fb3 #o300 #x00)
|
|---|
| 1034 | (def-x8664-opcode btrl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1035 | #x0fb3 #o000 #x00)
|
|---|
| 1036 |
|
|---|
| 1037 | (def-x8664-opcode btrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 1038 | #x0fba #o360 #x00 #x66)
|
|---|
| 1039 | (def-x8664-opcode btrw ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1040 | #x0fba #o060 #x00 #x66)
|
|---|
| 1041 | (def-x8664-opcode btrw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1042 | #x0fb3 #o300 #x00 #x66)
|
|---|
| 1043 | (def-x8664-opcode btrw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1044 | #x0fb3 #o000 #x00 #x66)
|
|---|
| 1045 |
|
|---|
| 1046 | ;; bts
|
|---|
| 1047 | (def-x8664-opcode btsq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 1048 | #x0fba #o350 #x48)
|
|---|
| 1049 | (def-x8664-opcode btsq ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1050 | #x0fba #o050 #x48)
|
|---|
| 1051 | (def-x8664-opcode btsq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 1052 | #x0fab #o300 #x48)
|
|---|
| 1053 | (def-x8664-opcode btsq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1054 | #x0fab #o000 #x48)
|
|---|
| 1055 |
|
|---|
| 1056 | (def-x8664-opcode btsl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 1057 | #x0fba #o350 #x00)
|
|---|
| 1058 | (def-x8664-opcode btsl ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1059 | #x0fba #o050 #x00)
|
|---|
| 1060 | (def-x8664-opcode btsl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1061 | #x0fab #o300 #x00)
|
|---|
| 1062 | (def-x8664-opcode btsl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1063 | #x0fab #o000 #x00)
|
|---|
| 1064 |
|
|---|
| 1065 | (def-x8664-opcode btsw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 1066 | #x0fba #o350 #x00 #x66)
|
|---|
| 1067 | (def-x8664-opcode btsw ((:imm8 :insert-imm8) (:anymem :insert-memory))
|
|---|
| 1068 | #x0fba #o050 #x00 #x66)
|
|---|
| 1069 | (def-x8664-opcode btsw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1070 | #x0fab #o300 #x00 #x66)
|
|---|
| 1071 | (def-x8664-opcode btsw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1072 | #x0fab #o000 #x00 #x66)
|
|---|
| 1073 |
|
|---|
| 1074 | ;; call
|
|---|
| 1075 | ;; Probably need to align CALL instructions within the containing function,
|
|---|
| 1076 | ;; so that return addresses are tagged appropriately.
|
|---|
| 1077 | (def-x8664-opcode call ((:label :insert-label))
|
|---|
| 1078 | #xe8 nil nil)
|
|---|
| 1079 |
|
|---|
| 1080 | (def-x8664-opcode call ((:reg64 :insert-modrm-rm))
|
|---|
| 1081 | #xff #o320 #x0)
|
|---|
| 1082 |
|
|---|
| 1083 | (def-x8664-opcode call ((:anymem :insert-memory))
|
|---|
| 1084 | #xff #o020 #x0)
|
|---|
| 1085 |
|
|---|
| 1086 | ;; cbtw
|
|---|
| 1087 | (def-x8664-opcode cbtw ()
|
|---|
| 1088 | #x98 nil nil #x66)
|
|---|
| 1089 |
|
|---|
| 1090 | ;; clc
|
|---|
| 1091 | (def-x8664-opcode clc ()
|
|---|
| 1092 | #xf8 nil nil)
|
|---|
| 1093 |
|
|---|
| 1094 | ;; cld
|
|---|
| 1095 | (def-x8664-opcode cld ()
|
|---|
| 1096 | #xfc nil nil)
|
|---|
| 1097 |
|
|---|
| 1098 | ;; cltd
|
|---|
| 1099 | (def-x8664-opcode cltd ()
|
|---|
| 1100 | #x99 nil nil)
|
|---|
| 1101 |
|
|---|
| 1102 |
|
|---|
| 1103 | ;; cltq
|
|---|
| 1104 | (def-x8664-opcode cltq ()
|
|---|
| 1105 | #x98 nil #x48)
|
|---|
| 1106 |
|
|---|
| 1107 | ;; cmc
|
|---|
| 1108 | (def-x8664-opcode cmc ()
|
|---|
| 1109 | #xf5 nil nil)
|
|---|
| 1110 |
|
|---|
| 1111 | ;; cmovCC
|
|---|
| 1112 | (def-x8664-opcode cmovccq
|
|---|
| 1113 | ((:imm8 :insert-cc) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1114 | #x0f40 #o300 #x48)
|
|---|
| 1115 | (def-x8664-opcode cmovccq
|
|---|
| 1116 | ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1117 | #x0f40 #o000 #x48)
|
|---|
| 1118 | (def-x8664-opcode cmovccl
|
|---|
| 1119 | ((:imm8 :insert-cc) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1120 | #x0f40 #o300 #x00)
|
|---|
| 1121 | (def-x8664-opcode cmovccl
|
|---|
| 1122 | ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1123 | #x0f40 #o000 #x00)
|
|---|
| 1124 | (def-x8664-opcode cmovccw
|
|---|
| 1125 | ((:imm8 :insert-cc) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1126 | #x0f40 #o300 #x00 #x66)
|
|---|
| 1127 | (def-x8664-opcode cmovccw
|
|---|
| 1128 | ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1129 | #x0f40 #o000 #x00 #x66)
|
|---|
| 1130 |
|
|---|
| 1131 | (def-x8664-opcode cmovoq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1132 | #x0f40 #o300 #x48)
|
|---|
| 1133 | (def-x8664-opcode cmovoq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1134 | #x0f40 #o000 #x48)
|
|---|
| 1135 | (def-x8664-opcode cmovol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1136 | #x0f40 #o300 #x00)
|
|---|
| 1137 | (def-x8664-opcode cmovol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1138 | #x0f40 #o000 #x00)
|
|---|
| 1139 | (def-x8664-opcode cmovow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1140 | #x0f40 #o300 #x00 #x66)
|
|---|
| 1141 | (def-x8664-opcode cmovow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1142 | #x0f40 #o000 #x00 #x66)
|
|---|
| 1143 |
|
|---|
| 1144 | (def-x8664-opcode cmovnoq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1145 | #x0f41 #o300 #x48)
|
|---|
| 1146 | (def-x8664-opcode cmovnoq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1147 | #x0f41 #o000 #x48)
|
|---|
| 1148 | (def-x8664-opcode cmovnol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1149 | #x0f41 #o300 #x00)
|
|---|
| 1150 | (def-x8664-opcode cmovnol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1151 | #x0f41 #o000 #x00)
|
|---|
| 1152 | (def-x8664-opcode cmovnow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1153 | #x0f41 #o300 #x00 #x66)
|
|---|
| 1154 | (def-x8664-opcode cmovnow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1155 | #x0f41 #o000 #x00 #x66)
|
|---|
| 1156 |
|
|---|
| 1157 | (def-x8664-opcode cmovbq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1158 | #x0f42 #o300 #x48)
|
|---|
| 1159 | (def-x8664-opcode cmovbq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1160 | #x0f42 #o000 #x48)
|
|---|
| 1161 | (def-x8664-opcode cmovbl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1162 | #x0f42 #o300 #x00)
|
|---|
| 1163 | (def-x8664-opcode cmovbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1164 | #x0f42 #o000 #x00)
|
|---|
| 1165 | (def-x8664-opcode cmovbw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1166 | #x0f42 #o300 #x00 #x66)
|
|---|
| 1167 | (def-x8664-opcode cmovbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1168 | #x0f42 #o000 #x00 #x66)
|
|---|
| 1169 |
|
|---|
| 1170 | (def-x8664-opcode cmovaeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1171 | #x0f43 #o300 #x48)
|
|---|
| 1172 | (def-x8664-opcode cmovaeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1173 | #x0f43 #o000 #x48)
|
|---|
| 1174 | (def-x8664-opcode cmovael ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1175 | #x0f43 #o300 #x00)
|
|---|
| 1176 | (def-x8664-opcode cmovael ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1177 | #x0f43 #o000 #x00)
|
|---|
| 1178 | (def-x8664-opcode cmovaew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1179 | #x0f43 #o300 #x00 #x66)
|
|---|
| 1180 | (def-x8664-opcode cmovaew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1181 | #x0f43 #o000 #x00 #x66)
|
|---|
| 1182 |
|
|---|
| 1183 | (def-x8664-opcode cmoveq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1184 | #x0f44 #o300 #x48)
|
|---|
| 1185 | (def-x8664-opcode cmoveq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1186 | #x0f44 #o000 #x48)
|
|---|
| 1187 | (def-x8664-opcode cmovel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1188 | #x0f44 #o300 #x00)
|
|---|
| 1189 | (def-x8664-opcode cmovel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1190 | #x0f44 #o000 #x00)
|
|---|
| 1191 | (def-x8664-opcode cmovew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1192 | #x0f44 #o300 #x00 #x66)
|
|---|
| 1193 | (def-x8664-opcode cmovew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1194 | #x0f44 #o000 #x00 #x66)
|
|---|
| 1195 |
|
|---|
| 1196 | (def-x8664-opcode cmovneq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1197 | #x0f45 #o300 #x48)
|
|---|
| 1198 | (def-x8664-opcode cmovneq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1199 | #x0f45 #o000 #x48)
|
|---|
| 1200 | (def-x8664-opcode cmovnel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1201 | #x0f45 #o300 #x00)
|
|---|
| 1202 | (def-x8664-opcode cmovnel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1203 | #x0f45 #o000 #x00)
|
|---|
| 1204 | (def-x8664-opcode cmovnew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1205 | #x0f45 #o300 #x00 #x66)
|
|---|
| 1206 | (def-x8664-opcode cmovnew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1207 | #x0f45 #o000 #x00 #x66)
|
|---|
| 1208 |
|
|---|
| 1209 | (def-x8664-opcode cmovbeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1210 | #x0f46 #o300 #x48)
|
|---|
| 1211 | (def-x8664-opcode cmovbeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1212 | #x0f46 #o000 #x48)
|
|---|
| 1213 | (def-x8664-opcode cmovbel ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-reg))
|
|---|
| 1214 | #x0f46 #o300 #x00)
|
|---|
| 1215 | (def-x8664-opcode cmovbel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1216 | #x0f46 #o000 #x00)
|
|---|
| 1217 | (def-x8664-opcode cmovbew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1218 | #x0f46 #o300 #x00 #x66)
|
|---|
| 1219 | (def-x8664-opcode cmovbew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1220 | #x0f46 #o000 #x00 #x66)
|
|---|
| 1221 |
|
|---|
| 1222 | (def-x8664-opcode cmovaq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1223 | #x0f47 #o300 #x48)
|
|---|
| 1224 | (def-x8664-opcode cmovaq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1225 | #x0f47 #o000 #x48)
|
|---|
| 1226 | (def-x8664-opcode cmoval ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1227 | #x0f47 #o300 #x00)
|
|---|
| 1228 | (def-x8664-opcode cmoval ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1229 | #x0f47 #o000 #x00)
|
|---|
| 1230 | (def-x8664-opcode cmovaw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1231 | #x0f47 #o300 #x00 #x66)
|
|---|
| 1232 | (def-x8664-opcode cmovaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1233 | #x0f47 #o000 #x00 #x66)
|
|---|
| 1234 |
|
|---|
| 1235 | (def-x8664-opcode cmovsq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1236 | #x0f48 #o300 #x48)
|
|---|
| 1237 | (def-x8664-opcode cmovsq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1238 | #x0f48 #o000 #x48)
|
|---|
| 1239 | (def-x8664-opcode cmovsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1240 | #x0f48 #o300 #x00)
|
|---|
| 1241 | (def-x8664-opcode cmovsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1242 | #x0f48 #o000 #x00)
|
|---|
| 1243 | (def-x8664-opcode cmovsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1244 | #x0f48 #o300 #x00 #x66)
|
|---|
| 1245 | (def-x8664-opcode cmovsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1246 | #x0f48 #o000 #x00 #x66)
|
|---|
| 1247 |
|
|---|
| 1248 | (def-x8664-opcode cmovnsq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1249 | #x0f49 #o300 #x48)
|
|---|
| 1250 | (def-x8664-opcode cmovnsq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1251 | #x0f49 #o000 #x48)
|
|---|
| 1252 | (def-x8664-opcode cmovnsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1253 | #x0f49 #o300 #x00)
|
|---|
| 1254 | (def-x8664-opcode cmovnsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1255 | #x0f49 #o000 #x00)
|
|---|
| 1256 | (def-x8664-opcode cmovnsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1257 | #x0f49 #o300 #x00 #x66)
|
|---|
| 1258 | (def-x8664-opcode cmovnsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1259 | #x0f49 #o000 #x00 #x66)
|
|---|
| 1260 |
|
|---|
| 1261 | (def-x8664-opcode cmovpeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1262 | #x0f4a #o300 #x48)
|
|---|
| 1263 | (def-x8664-opcode cmovpeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1264 | #x0f4a #o000 #x48)
|
|---|
| 1265 | (def-x8664-opcode cmovpel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1266 | #x0f4a #o300 #x00)
|
|---|
| 1267 | (def-x8664-opcode cmovpel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1268 | #x0f4a #o000 #x00)
|
|---|
| 1269 | (def-x8664-opcode cmovpew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1270 | #x0f4a #o300 #x00 #x66)
|
|---|
| 1271 | (def-x8664-opcode cmovpew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1272 | #x0f4a #o000 #x00 #x66)
|
|---|
| 1273 |
|
|---|
| 1274 | (def-x8664-opcode cmovpoq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1275 | #x0f4b #o300 #x48)
|
|---|
| 1276 | (def-x8664-opcode cmovpoq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1277 | #x0f4b #o000 #x48)
|
|---|
| 1278 | (def-x8664-opcode cmovpol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1279 | #x0f4b #o300 #x00)
|
|---|
| 1280 | (def-x8664-opcode cmovpol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1281 | #x0f4b #o000 #x00)
|
|---|
| 1282 | (def-x8664-opcode cmovpow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1283 | #x0f4b #o300 #x00 #x66)
|
|---|
| 1284 | (def-x8664-opcode cmovpow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1285 | #x0f4b #o000 #x00 #x66)
|
|---|
| 1286 |
|
|---|
| 1287 | (def-x8664-opcode cmovlq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1288 | #x0f4c #o300 #x48)
|
|---|
| 1289 | (def-x8664-opcode cmovlq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1290 | #x0f4c #o000 #x48)
|
|---|
| 1291 | (def-x8664-opcode cmovll ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1292 | #x0f4c #o300 #x00)
|
|---|
| 1293 | (def-x8664-opcode cmovll ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1294 | #x0f4c #o000 #x00)
|
|---|
| 1295 | (def-x8664-opcode cmovlw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1296 | #x0f4c #o300 #x00 #x66)
|
|---|
| 1297 | (def-x8664-opcode cmovlw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1298 | #x0f4c #o000 #x00 #x66)
|
|---|
| 1299 |
|
|---|
| 1300 | (def-x8664-opcode cmovgeq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1301 | #x0f4d #o300 #x48)
|
|---|
| 1302 | (def-x8664-opcode cmovgeq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1303 | #x0f4d #o000 #x48)
|
|---|
| 1304 | (def-x8664-opcode cmovgel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1305 | #x0f4d #o300 #x00)
|
|---|
| 1306 | (def-x8664-opcode cmovgel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1307 | #x0f4d #o000 #x00)
|
|---|
| 1308 | (def-x8664-opcode cmovgew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1309 | #x0f4d #o300 #x00 #x66)
|
|---|
| 1310 | (def-x8664-opcode cmovgew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1311 | #x0f4d #o000 #x00 #x66)
|
|---|
| 1312 |
|
|---|
| 1313 | (def-x8664-opcode cmovleq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1314 | #x0f4e #o300 #x48)
|
|---|
| 1315 | (def-x8664-opcode cmovleq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1316 | #x0f4e #o000 #x48)
|
|---|
| 1317 | (def-x8664-opcode cmovlel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1318 | #x0f4e #o300 #x00)
|
|---|
| 1319 | (def-x8664-opcode cmovlel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1320 | #x0f4e #o000 #x00)
|
|---|
| 1321 | (def-x8664-opcode cmovlew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1322 | #x0f4e #o300 #x00 #x66)
|
|---|
| 1323 | (def-x8664-opcode cmovlew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1324 | #x0f4e #o000 #x00 #x66)
|
|---|
| 1325 |
|
|---|
| 1326 | (def-x8664-opcode cmovgq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1327 | #x0f4f #o300 #x48)
|
|---|
| 1328 | (def-x8664-opcode cmovgq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1329 | #x0f4f #o000 #x48)
|
|---|
| 1330 | (def-x8664-opcode cmovgl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1331 | #x0f4f #o300 #x00)
|
|---|
| 1332 | (def-x8664-opcode cmovgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1333 | #x0f4f #o000 #x00)
|
|---|
| 1334 | (def-x8664-opcode cmovgw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1335 | #x0f4f #o300 #x00 #x66)
|
|---|
| 1336 | (def-x8664-opcode cmovgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1337 | #x0f4f #o000 #x00 #x66)
|
|---|
| 1338 |
|
|---|
| 1339 |
|
|---|
| 1340 | ;; cmp
|
|---|
| 1341 |
|
|---|
| 1342 | (def-x8664-opcode cmpq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 1343 | #x39 #o300 #x48)
|
|---|
| 1344 | (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1345 | #x39 #o300 #x48)
|
|---|
| 1346 | (def-x8664-opcode cmpq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1347 | #x3b #o000 #x48)
|
|---|
| 1348 | (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1349 | #x3b #o000 #x48)
|
|---|
| 1350 | (def-x8664-opcode cmpq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1351 | #x39 #x00 #x48)
|
|---|
| 1352 | (def-x8664-opcode rcmpq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1353 | #x39 #x00 #x48)
|
|---|
| 1354 | (def-x8664-opcode cmpq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 1355 | #x83 #o370 #x48)
|
|---|
| 1356 | (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-rm) (:imm8s :insert-imm8s))
|
|---|
| 1357 | #x83 #o370 #x48)
|
|---|
| 1358 | (def-x8664-opcode cmpq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 1359 | #x3d nil #x48)
|
|---|
| 1360 | (def-x8664-opcode rcmpq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 1361 | #x3d nil #x48)
|
|---|
| 1362 | (def-x8664-opcode cmpq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 1363 | #x81 #o370 #x48)
|
|---|
| 1364 | (def-x8664-opcode rcmpq ((:reg64 :insert-modrm-rm) (:imm32s :insert-imm32s))
|
|---|
| 1365 | #x81 #o370 #x48)
|
|---|
| 1366 | (def-x8664-opcode cmpq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 1367 | #x83 #o070 #x48)
|
|---|
| 1368 | (def-x8664-opcode rcmpq ((:anymem :insert-memory) (:imm8s :insert-imm8s))
|
|---|
| 1369 | #x83 #o070 #x48)
|
|---|
| 1370 | (def-x8664-opcode cmpq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 1371 | #x81 #o070 #x48)
|
|---|
| 1372 | (def-x8664-opcode rcmpq ((:anymem :insert-memory) (:imm32s :insert-imm32s))
|
|---|
| 1373 | #x81 #o070 #x48)
|
|---|
| 1374 |
|
|---|
| 1375 | (def-x8664-opcode cmpl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1376 | #x39 #o300 #x00)
|
|---|
| 1377 | (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1378 | #x39 #o300 #x00)
|
|---|
| 1379 | (def-x8664-opcode cmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1380 | #x3b #o000 #x00)
|
|---|
| 1381 | (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1382 | #x3b #o000 #x00)
|
|---|
| 1383 | (def-x8664-opcode cmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1384 | #x39 #x00 #x00)
|
|---|
| 1385 | (def-x8664-opcode rcmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1386 | #x39 #x00 #x00)
|
|---|
| 1387 | (def-x8664-opcode cmpl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 1388 | #x83 #o370 #x00)
|
|---|
| 1389 | (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm8s :insert-imm8s))
|
|---|
| 1390 | #x83 #o370 #x00)
|
|---|
| 1391 | (def-x8664-opcode cmpl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 1392 | #x3d nil nil)
|
|---|
| 1393 | (def-x8664-opcode rcmpl ((:acc :insert-nothing) (:imm32s :insert-imm32s))
|
|---|
| 1394 | #x3d nil nil)
|
|---|
| 1395 | (def-x8664-opcode cmpl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 1396 | #x81 #o370 #x00)
|
|---|
| 1397 | (def-x8664-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm32s :insert-imm32s))
|
|---|
| 1398 | #x81 #o370 #x00)
|
|---|
| 1399 | (def-x8664-opcode cmpl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 1400 | #x83 #o070 #x00)
|
|---|
| 1401 | (def-x8664-opcode rcmpl ((:anymem :insert-memory) (:imm8s :insert-imm8s))
|
|---|
| 1402 | #x83 #o070 #x00)
|
|---|
| 1403 | (def-x8664-opcode cmpl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 1404 | #x81 #o070 #x00)
|
|---|
| 1405 | (def-x8664-opcode rcmpl ((:anymem :insert-memory) (:imm32s :insert-imm32s))
|
|---|
| 1406 | #x81 #o070 #x00)
|
|---|
| 1407 |
|
|---|
| 1408 | (def-x8664-opcode cmpw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1409 | #x39 #o300 #x00 #x66)
|
|---|
| 1410 | (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1411 | #x39 #o300 #x00 #x66)
|
|---|
| 1412 | (def-x8664-opcode cmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1413 | #x3b #o000 #x00 #x66)
|
|---|
| 1414 | (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1415 | #x3b #o000 #x00 #x66)
|
|---|
| 1416 | (def-x8664-opcode cmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1417 | #x39 #x00 #x00 #x66)
|
|---|
| 1418 | (def-x8664-opcode rcmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1419 | #x39 #x00 #x00 #x66)
|
|---|
| 1420 | (def-x8664-opcode cmpw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 1421 | #x83 #o370 #x00 #x66)
|
|---|
| 1422 | (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm8s :insert-imm8s))
|
|---|
| 1423 | #x83 #o370 #x00 #x66)
|
|---|
| 1424 | (def-x8664-opcode cmpw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 1425 | #x3d nil nil #x66)
|
|---|
| 1426 | (def-x8664-opcode rcmpw ((:acc :insert-nothing) (:imm16 :insert-imm16))
|
|---|
| 1427 | #x3d nil nil #x66)
|
|---|
| 1428 | (def-x8664-opcode cmpw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 1429 | #x81 #o370 #x00 #x66)
|
|---|
| 1430 | (def-x8664-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm16 :insert-imm16))
|
|---|
| 1431 | #x81 #o370 #x00 #x66)
|
|---|
| 1432 | (def-x8664-opcode cmpw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 1433 | #x83 #o070 #x00 #x66)
|
|---|
| 1434 | (def-x8664-opcode rcmpw ((:anymem :insert-memory) (:imm8s :insert-imm8s))
|
|---|
| 1435 | #x83 #o070 #x00 #x66)
|
|---|
| 1436 | (def-x8664-opcode cmpw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 1437 | #x81 #o070 #x00 #x66)
|
|---|
| 1438 | (def-x8664-opcode rcmpw ((:anymem :insert-memory) (:imm16 :insert-imm16))
|
|---|
| 1439 | #x81 #o070 #x00 #x66)
|
|---|
| 1440 |
|
|---|
| 1441 | (def-x8664-opcode cmpb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 1442 | #x38 #o300 #x00)
|
|---|
| 1443 | (def-x8664-opcode rcmpb ((:reg8 :insert-modrm-rm) (:reg8 :insert-modrm-reg))
|
|---|
| 1444 | #x38 #o300 #x00)
|
|---|
| 1445 | (def-x8664-opcode cmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 1446 | #x3a #o000 #x00)
|
|---|
| 1447 | (def-x8664-opcode rcmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1448 | #x3a #o000 #x00)
|
|---|
| 1449 | (def-x8664-opcode cmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1450 | #x38 #x00 #x00)
|
|---|
| 1451 | (def-x8664-opcode rcmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 1452 | #x38 #x00 #x00)
|
|---|
| 1453 | (def-x8664-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:acc :insert-nothing))
|
|---|
| 1454 | #x3c nil nil)
|
|---|
| 1455 | (def-x8664-opcode rcmpb ((:acc :insert-nothing) ((:imm8s :imm8) :insert-imm8s))
|
|---|
| 1456 | #x3c nil nil)
|
|---|
| 1457 | (def-x8664-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 1458 | #x80 #o370 #x00)
|
|---|
| 1459 | (def-x8664-opcode rcmpb ((:reg8 :insert-modrm-rm) ((:imm8s :imm8) :insert-imm8s))
|
|---|
| 1460 | #x80 #o370 #x00)
|
|---|
| 1461 | (def-x8664-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 1462 | #x80 #o070 #x00)
|
|---|
| 1463 | (def-x8664-opcode rcmpb ((:anymem :insert-memory) ((:imm8s :imm8) :insert-imm8s))
|
|---|
| 1464 | #x80 #o070 #x00)
|
|---|
| 1465 |
|
|---|
| 1466 | ;; cmps
|
|---|
| 1467 | (def-x8664-opcode cmpsq ()
|
|---|
| 1468 | #xa7 nil #x48)
|
|---|
| 1469 |
|
|---|
| 1470 | (def-x8664-opcode cmpsl ()
|
|---|
| 1471 | #xa7 nil nil)
|
|---|
| 1472 |
|
|---|
| 1473 | (def-x8664-opcode cmpsw ()
|
|---|
| 1474 | #xa7 nil nil #x66)
|
|---|
| 1475 |
|
|---|
| 1476 | (def-x8664-opcode cmpsb ()
|
|---|
| 1477 | #xa6 nil nil)
|
|---|
| 1478 |
|
|---|
| 1479 | ;; cmpxchg
|
|---|
| 1480 | (def-x8664-opcode cmpxchgq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 1481 | #x0fb1 #o300 #x48)
|
|---|
| 1482 | (def-x8664-opcode cmpxchgq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1483 | #x0fb1 #o000 #x48)
|
|---|
| 1484 |
|
|---|
| 1485 | (def-x8664-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1486 | #x0fb1 #o300 #x00)
|
|---|
| 1487 | (def-x8664-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1488 | #x0fb1 #o000 #x00)
|
|---|
| 1489 |
|
|---|
| 1490 | (def-x8664-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1491 | #x0fb1 #o300 #x00 #x66)
|
|---|
| 1492 | (def-x8664-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1493 | #x0fb1 #o000 #x00 #x66)
|
|---|
| 1494 |
|
|---|
| 1495 | (def-x8664-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1496 | #x0fb0 #o300 #x00)
|
|---|
| 1497 | (def-x8664-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1498 | #x0fb0 #o000 #x00)
|
|---|
| 1499 |
|
|---|
| 1500 | ;; cpuid
|
|---|
| 1501 | (def-x8664-opcode cpuid ()
|
|---|
| 1502 | #x0fa2 nil nil)
|
|---|
| 1503 |
|
|---|
| 1504 | ;; cqto
|
|---|
| 1505 | (def-x8664-opcode cqto ()
|
|---|
| 1506 | #x99 nil #x48)
|
|---|
| 1507 |
|
|---|
| 1508 | ;; cwtd
|
|---|
| 1509 | (def-x8664-opcode cwtd ()
|
|---|
| 1510 | #x99 nil nil #x66)
|
|---|
| 1511 |
|
|---|
| 1512 | ;; cwtl
|
|---|
| 1513 | (def-x8664-opcode cwtl ()
|
|---|
| 1514 | #x98 nil nil)
|
|---|
| 1515 |
|
|---|
| 1516 | ;; dec (not the 1-byte form). This exists on x8664, but gas doesn't
|
|---|
| 1517 | ;; know that.
|
|---|
| 1518 | (def-x8664-opcode decq ((:reg64 :insert-modrm-rm))
|
|---|
| 1519 | #xff #o310 #x48)
|
|---|
| 1520 | (def-x8664-opcode decq ((:anymem :insert-memory))
|
|---|
| 1521 | #xff #o010 #x48)
|
|---|
| 1522 |
|
|---|
| 1523 | (def-x8664-opcode decl ((:reg32 :insert-modrm-rm))
|
|---|
| 1524 | #xff #o310 #x00)
|
|---|
| 1525 | (def-x8664-opcode decl ((:anymem :insert-memory))
|
|---|
| 1526 | #xff #o010 #x00)
|
|---|
| 1527 |
|
|---|
| 1528 | (def-x8664-opcode decw ((:reg16 :insert-modrm-rm))
|
|---|
| 1529 | #xff #o310 #x00 #x66)
|
|---|
| 1530 | (def-x8664-opcode decw ((:anymem :insert-memory))
|
|---|
| 1531 | #xff #o010 #x00 #x66)
|
|---|
| 1532 |
|
|---|
| 1533 | (def-x8664-opcode decb ((:reg8 :insert-modrm-rm))
|
|---|
| 1534 | #xfe #o310 #x00)
|
|---|
| 1535 | (def-x8664-opcode decb ((:anymem :insert-memory))
|
|---|
| 1536 | #xfe #o010 #x00)
|
|---|
| 1537 |
|
|---|
| 1538 | ;; div
|
|---|
| 1539 | (def-x8664-opcode divq ((:reg64 :insert-modrm-rm))
|
|---|
| 1540 | #xf7 #o360 #x48)
|
|---|
| 1541 | (def-x8664-opcode divq ((:anymem :insert-memory))
|
|---|
| 1542 | #xf7 #o060 #x48)
|
|---|
| 1543 |
|
|---|
| 1544 | (def-x8664-opcode divl ((:reg32 :insert-modrm-rm))
|
|---|
| 1545 | #xf7 #o360 #x00)
|
|---|
| 1546 | (def-x8664-opcode divl ((:anymem :insert-memory))
|
|---|
| 1547 | #xf7 #o060 #x00)
|
|---|
| 1548 |
|
|---|
| 1549 | (def-x8664-opcode divw ((:reg16 :insert-modrm-rm))
|
|---|
| 1550 | #xf7 #o360 #x00 #x66)
|
|---|
| 1551 | (def-x8664-opcode divw ((:anymem :insert-memory))
|
|---|
| 1552 | #xf7 #o060 #x00 #x66)
|
|---|
| 1553 |
|
|---|
| 1554 | (def-x8664-opcode divb ((:reg8 :insert-modrm-rm))
|
|---|
| 1555 | #xf6 #o360 #x00)
|
|---|
| 1556 | (def-x8664-opcode divl ((:anymem :insert-memory))
|
|---|
| 1557 | #xf6 #o060 #x00)
|
|---|
| 1558 |
|
|---|
| 1559 | ;; enter.
|
|---|
| 1560 |
|
|---|
| 1561 | (def-x8664-opcode enter ((:imm16 :insert-imm16) (:imm8 :insert-extra))
|
|---|
| 1562 | #xc8 nil nil)
|
|---|
| 1563 |
|
|---|
| 1564 | ;; hlt
|
|---|
| 1565 | (def-x8664-opcode hlt ()
|
|---|
| 1566 | #xf4 nil nil)
|
|---|
| 1567 |
|
|---|
| 1568 | ;; idiv. Note that GAS doesn't know about newer(?) idiv forms
|
|---|
| 1569 | (def-x8664-opcode idivq ((:reg64 :insert-modrm-rm))
|
|---|
| 1570 | #xf7 #o370 #x48)
|
|---|
| 1571 | (def-x8664-opcode idivq ((:anymem :insert-memory))
|
|---|
| 1572 | #xf7 #o070 #x48)
|
|---|
| 1573 |
|
|---|
| 1574 | (def-x8664-opcode idivl ((:reg32 :insert-modrm-rm))
|
|---|
| 1575 | #xf7 #o370 #x00)
|
|---|
| 1576 | (def-x8664-opcode idivl ((:anymem :insert-memory))
|
|---|
| 1577 | #xf7 #o070 #x00)
|
|---|
| 1578 |
|
|---|
| 1579 | (def-x8664-opcode idivw ((:reg16 :insert-modrm-rm))
|
|---|
| 1580 | #xf7 #o370 #x00 #x66)
|
|---|
| 1581 | (def-x8664-opcode idivw ((:anymem :insert-memory))
|
|---|
| 1582 | #xf7 #o070 #x00 #x66)
|
|---|
| 1583 |
|
|---|
| 1584 | (def-x8664-opcode idivb ((:reg8 :insert-modrm-rm))
|
|---|
| 1585 | #xf6 #o370 #x00)
|
|---|
| 1586 | (def-x8664-opcode idivl ((:anymem :insert-memory))
|
|---|
| 1587 | #xf6 #o070 #x00)
|
|---|
| 1588 |
|
|---|
| 1589 | ;; imul
|
|---|
| 1590 | (def-x8664-opcode imulq ((:reg64 :insert-modrm-rm))
|
|---|
| 1591 | #xf7 #o350 #x48)
|
|---|
| 1592 | (def-x8664-opcode imulq ((:anymem :insert-memory))
|
|---|
| 1593 | #xf7 #o050 #x48)
|
|---|
| 1594 |
|
|---|
| 1595 | (def-x8664-opcode imulq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1596 | #x6b #o300 #x48)
|
|---|
| 1597 | (def-x8664-opcode imulq ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1598 | #x6b #o000 #x48)
|
|---|
| 1599 | (def-x8664-opcode imulq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1600 | #x69 #o300 #x48)
|
|---|
| 1601 | (def-x8664-opcode imulq ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1602 | #x69 #o000 #x48)
|
|---|
| 1603 | (def-x8664-opcode imulq ((:reg64 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1604 | #x0faf #o300 #x48)
|
|---|
| 1605 | (def-x8664-opcode imulq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1606 | #x0faf #o000 #x48)
|
|---|
| 1607 |
|
|---|
| 1608 |
|
|---|
| 1609 | (def-x8664-opcode imull ((:reg32 :insert-modrm-rm))
|
|---|
| 1610 | #xf7 #o350 #x00)
|
|---|
| 1611 | (def-x8664-opcode imull ((:anymem :insert-memory))
|
|---|
| 1612 | #xf7 #o050 #x00)
|
|---|
| 1613 |
|
|---|
| 1614 | (def-x8664-opcode imull ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1615 | #x6b #o300 #x00)
|
|---|
| 1616 | (def-x8664-opcode imull ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1617 | #x6b #o000 #x00)
|
|---|
| 1618 | (def-x8664-opcode imull ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1619 | #x69 #o300 #x00)
|
|---|
| 1620 | (def-x8664-opcode imull ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1621 | #x69 #o000 #x00)
|
|---|
| 1622 | (def-x8664-opcode imull ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1623 | #x0faf #o300 #x00)
|
|---|
| 1624 | (def-x8664-opcode imull ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1625 | #x0faf #o000 #x00)
|
|---|
| 1626 |
|
|---|
| 1627 | (def-x8664-opcode imulw ((:reg16 :insert-modrm-rm))
|
|---|
| 1628 | #xf7 #o350 #x00 #x66)
|
|---|
| 1629 | (def-x8664-opcode imulw ((:anymem :insert-memory))
|
|---|
| 1630 | #xf7 #o050 #x00 #x66)
|
|---|
| 1631 |
|
|---|
| 1632 | (def-x8664-opcode imulw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1633 | #x6b #o300 #x00 #x66)
|
|---|
| 1634 | (def-x8664-opcode imulw ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1635 | #x6b #o000 #x00 #x66)
|
|---|
| 1636 | (def-x8664-opcode imulw ((:imm32s :insert-imm32s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1637 | #x69 #o300 #x00 #x66)
|
|---|
| 1638 | (def-x8664-opcode imulw ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1639 | #x69 #o000 #x00 #x66)
|
|---|
| 1640 | (def-x8664-opcode imulw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1641 | #x0faf #o300 #x00 #x66)
|
|---|
| 1642 | (def-x8664-opcode imulw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1643 | #x0faf #o000 #x00 #x66)
|
|---|
| 1644 |
|
|---|
| 1645 | (def-x8664-opcode imulb ((:reg8 :insert-modrm-rm))
|
|---|
| 1646 | #xf6 #o350 #x00)
|
|---|
| 1647 | (def-x8664-opcode imulb ((:anymem :insert-memory))
|
|---|
| 1648 | #xf6 #o050 #x00)
|
|---|
| 1649 |
|
|---|
| 1650 | ;; inc (but not the one-byte form) is available on x86-64.
|
|---|
| 1651 | (def-x8664-opcode incq ((:reg64 :insert-modrm-rm))
|
|---|
| 1652 | #xff #o300 #x48)
|
|---|
| 1653 | (def-x8664-opcode incq ((:anymem :insert-memory))
|
|---|
| 1654 | #xff #o000 #x48)
|
|---|
| 1655 |
|
|---|
| 1656 | (def-x8664-opcode incl ((:reg32 :insert-modrm-rm))
|
|---|
| 1657 | #xff #o300 #x00)
|
|---|
| 1658 | (def-x8664-opcode incl ((:anymem :insert-memory))
|
|---|
| 1659 | #xff #o000 #x00)
|
|---|
| 1660 |
|
|---|
| 1661 | (def-x8664-opcode incw ((:reg16 :insert-modrm-rm))
|
|---|
| 1662 | #xff #o300 #x00 #x66)
|
|---|
| 1663 | (def-x8664-opcode incw ((:anymem :insert-memory))
|
|---|
| 1664 | #xff #o000 #x00 #x66)
|
|---|
| 1665 |
|
|---|
| 1666 | (def-x8664-opcode incb ((:reg8 :insert-modrm-rm))
|
|---|
| 1667 | #xfe #o300 #x00)
|
|---|
| 1668 | (def-x8664-opcode incb ((:anymem :insert-memory))
|
|---|
| 1669 | #xfe #o000 #x00)
|
|---|
| 1670 |
|
|---|
| 1671 | ;; int. See also UUOs.
|
|---|
| 1672 | (def-x8664-opcode int ((:imm8 :insert-imm8-for-int))
|
|---|
| 1673 | #xcd nil nil)
|
|---|
| 1674 |
|
|---|
| 1675 | ;; Jcc. Generate the short form here; maybe relax later.
|
|---|
| 1676 | (def-x8664-opcode (jcc :jump) ((:imm8 :insert-cc) (:label :insert-label))
|
|---|
| 1677 | #x70 nil nil)
|
|---|
| 1678 | (def-x8664-opcode (jcc.pt :jump) ((:imm8 :insert-cc) (:label :insert-label))
|
|---|
| 1679 | #x70 nil nil #x3e)
|
|---|
| 1680 | (def-x8664-opcode (jcc.pn :jump) ((:imm8 :insert-cc) (:label :insert-label))
|
|---|
| 1681 | #x70 nil nil #x2e)
|
|---|
| 1682 |
|
|---|
| 1683 | (def-x8664-opcode (jo :jump) ((:label :insert-label))
|
|---|
| 1684 | #x70 nil nil)
|
|---|
| 1685 | (def-x8664-opcode (jo.pt :jump) ((:label :insert-label))
|
|---|
| 1686 | #x70 nil nil #x3e)
|
|---|
| 1687 | (def-x8664-opcode (jo.pn :jump) ((:label :insert-label))
|
|---|
| 1688 | #x70 nil nil #x2e)
|
|---|
| 1689 | (def-x8664-opcode (jno :jump) ((:label :insert-label))
|
|---|
| 1690 | #x71 nil nil)
|
|---|
| 1691 | (def-x8664-opcode (jno.pt :jump) ((:label :insert-label))
|
|---|
| 1692 | #x71 nil nil #x3e)
|
|---|
| 1693 | (def-x8664-opcode (jno.pn :jump) ((:label :insert-label))
|
|---|
| 1694 | #x71 nil nil #x2e)
|
|---|
| 1695 | (def-x8664-opcode (jb :jump) ((:label :insert-label))
|
|---|
| 1696 | #x72 nil nil)
|
|---|
| 1697 | (def-x8664-opcode (jb.pt :jump) ((:label :insert-label))
|
|---|
| 1698 | #x72 nil nil #x3e)
|
|---|
| 1699 | (def-x8664-opcode (jb.pn :jump) ((:label :insert-label))
|
|---|
| 1700 | #x72 nil nil #x2e)
|
|---|
| 1701 | (def-x8664-opcode (jae :jump) ((:label :insert-label))
|
|---|
| 1702 | #x73 nil nil)
|
|---|
| 1703 | (def-x8664-opcode (jae.pt :jump) ((:label :insert-label))
|
|---|
| 1704 | #x73 nil nil #x3e)
|
|---|
| 1705 | (def-x8664-opcode (jae.pn :jump) ((:label :insert-label))
|
|---|
| 1706 | #x73 nil nil #x2e)
|
|---|
| 1707 | (def-x8664-opcode (je :jump) ((:label :insert-label))
|
|---|
| 1708 | #x74 nil nil)
|
|---|
| 1709 | (def-x8664-opcode (je.pt :jump) ((:label :insert-label))
|
|---|
| 1710 | #x74 nil nil #x3e)
|
|---|
| 1711 | (def-x8664-opcode (je.pn :jump) ((:label :insert-label))
|
|---|
| 1712 | #x74 nil nil #x2e)
|
|---|
| 1713 | (def-x8664-opcode (jz :jump) ((:label :insert-label))
|
|---|
| 1714 | #x74 nil nil)
|
|---|
| 1715 | (def-x8664-opcode (jz.pt :jump) ((:label :insert-label))
|
|---|
| 1716 | #x74 nil nil #x3e)
|
|---|
| 1717 | (def-x8664-opcode (jz.pn :jump) ((:label :insert-label))
|
|---|
| 1718 | #x74 nil nil #x2e)
|
|---|
| 1719 | (def-x8664-opcode (jne :jump) ((:label :insert-label))
|
|---|
| 1720 | #x75 nil nil)
|
|---|
| 1721 | (def-x8664-opcode (jne.pt :jump) ((:label :insert-label))
|
|---|
| 1722 | #x75 nil nil #x3e)
|
|---|
| 1723 | (def-x8664-opcode (jne.pn :jump) ((:label :insert-label))
|
|---|
| 1724 | #x75 nil nil #x2e)
|
|---|
| 1725 | (def-x8664-opcode (jnz :jump) ((:label :insert-label))
|
|---|
| 1726 | #x75 nil nil)
|
|---|
| 1727 | (def-x8664-opcode (jnz.pt :jump) ((:label :insert-label))
|
|---|
| 1728 | #x75 nil nil #x3e)
|
|---|
| 1729 | (def-x8664-opcode (jnz.pn :jump) ((:label :insert-label))
|
|---|
| 1730 | #x75 nil nil #x2e)
|
|---|
| 1731 | (def-x8664-opcode (jbe :jump) ((:label :insert-label))
|
|---|
| 1732 | #x76 nil nil)
|
|---|
| 1733 | (def-x8664-opcode (jbe.pt :jump) ((:label :insert-label))
|
|---|
| 1734 | #x76 nil nil #x3e)
|
|---|
| 1735 | (def-x8664-opcode (jbe.pn :jump) ((:label :insert-label))
|
|---|
| 1736 | #x76 nil nil #x2e)
|
|---|
| 1737 | (def-x8664-opcode (ja :jump) ((:label :insert-label))
|
|---|
| 1738 | #x77 nil nil)
|
|---|
| 1739 | (def-x8664-opcode (ja.pt :jump) ((:label :insert-label))
|
|---|
| 1740 | #x77 nil nil #x3e)
|
|---|
| 1741 | (def-x8664-opcode (ja.pn :jump) ((:label :insert-label))
|
|---|
| 1742 | #x77 nil nil #x2e)
|
|---|
| 1743 | (def-x8664-opcode (js :jump) ((:label :insert-label))
|
|---|
| 1744 | #x78 nil nil)
|
|---|
| 1745 | (def-x8664-opcode (js.pt :jump) ((:label :insert-label))
|
|---|
| 1746 | #x78 nil nil #x3e)
|
|---|
| 1747 | (def-x8664-opcode (js.pn :jump) ((:label :insert-label))
|
|---|
| 1748 | #x78 nil nil #x2e)
|
|---|
| 1749 | (def-x8664-opcode (jns :jump) ((:label :insert-label))
|
|---|
| 1750 | #x79 nil nil)
|
|---|
| 1751 | (def-x8664-opcode (jns.pt :jump) ((:label :insert-label))
|
|---|
| 1752 | #x79 nil nil #x3e)
|
|---|
| 1753 | (def-x8664-opcode (jns.pn :jump) ((:label :insert-label))
|
|---|
| 1754 | #x79 nil nil #x2e)
|
|---|
| 1755 | (def-x8664-opcode (jpe :jump) ((:label :insert-label))
|
|---|
| 1756 | #x7a nil nil)
|
|---|
| 1757 | (def-x8664-opcode (jpe.pt :jump) ((:label :insert-label))
|
|---|
| 1758 | #x7a nil nil #x3e)
|
|---|
| 1759 | (def-x8664-opcode (jpe.pn :jump) ((:label :insert-label))
|
|---|
| 1760 | #x7a nil nil #x2e)
|
|---|
| 1761 | (def-x8664-opcode (jpo :jump) ((:label :insert-label))
|
|---|
| 1762 | #x7b nil nil)
|
|---|
| 1763 | (def-x8664-opcode (jpo.pt :jump) ((:label :insert-label))
|
|---|
| 1764 | #x7b nil nil #x3e)
|
|---|
| 1765 | (def-x8664-opcode (jpo.pn :jump) ((:label :insert-label))
|
|---|
| 1766 | #x7b nil nil #x2e)
|
|---|
| 1767 | (def-x8664-opcode (jl :jump) ((:label :insert-label))
|
|---|
| 1768 | #x7c nil nil)
|
|---|
| 1769 | (def-x8664-opcode (jl.pt :jump) ((:label :insert-label))
|
|---|
| 1770 | #x7c nil nil #x3e)
|
|---|
| 1771 | (def-x8664-opcode (jl.pn :jump) ((:label :insert-label))
|
|---|
| 1772 | #x7c nil nil #x2e)
|
|---|
| 1773 | (def-x8664-opcode (jge :jump) ((:label :insert-label))
|
|---|
| 1774 | #x7d nil nil)
|
|---|
| 1775 | (def-x8664-opcode (jge.pt :jump) ((:label :insert-label))
|
|---|
| 1776 | #x7d nil nil #x3e)
|
|---|
| 1777 | (def-x8664-opcode (jge.pn :jump) ((:label :insert-label))
|
|---|
| 1778 | #x7d nil nil #x2e)
|
|---|
| 1779 | (def-x8664-opcode (jle :jump) ((:label :insert-label))
|
|---|
| 1780 | #x7e nil nil)
|
|---|
| 1781 | (def-x8664-opcode (jle.pt :jump) ((:label :insert-label))
|
|---|
| 1782 | #x7e nil nil #x3e)
|
|---|
| 1783 | (def-x8664-opcode (jle.pn :jump) ((:label :insert-label))
|
|---|
| 1784 | #x7e nil nil #x2e)
|
|---|
| 1785 | (def-x8664-opcode (jg :jump) ((:label :insert-label))
|
|---|
| 1786 | #x7f nil nil)
|
|---|
| 1787 | (def-x8664-opcode (jg.pt :jump) ((:label :insert-label))
|
|---|
| 1788 | #x7f nil nil #x3e)
|
|---|
| 1789 | (def-x8664-opcode (jg.pn :jump) ((:label :insert-label))
|
|---|
| 1790 | #x7f nil nil #x2e)
|
|---|
| 1791 |
|
|---|
| 1792 | ;; jmp . Translating the 8-bit pc-relative version to the 32-bit
|
|---|
| 1793 | ;; pc-relative version happens during relaxation.
|
|---|
| 1794 | (def-x8664-opcode (jmp :jump) ((:label :insert-label))
|
|---|
| 1795 | #xeb nil nil)
|
|---|
| 1796 |
|
|---|
| 1797 | (def-x8664-opcode jmp ((:reg64 :insert-modrm-rm))
|
|---|
| 1798 | #xff #o340 #x0)
|
|---|
| 1799 |
|
|---|
| 1800 | (def-x8664-opcode jmp ((:anymem :insert-memory))
|
|---|
| 1801 | #xff #o040 #x0)
|
|---|
| 1802 |
|
|---|
| 1803 | ;; lea
|
|---|
| 1804 | (def-x8664-opcode leaq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1805 | #x8d 0 #x48)
|
|---|
| 1806 |
|
|---|
| 1807 | (def-x8664-opcode leal ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1808 | #x8d 0 #x00)
|
|---|
| 1809 |
|
|---|
| 1810 | (def-x8664-opcode leaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1811 | #x8d 0 #x00 #x66)
|
|---|
| 1812 |
|
|---|
| 1813 | ;; leave
|
|---|
| 1814 | (def-x8664-opcode leave ()
|
|---|
| 1815 | #xc9 nil nil)
|
|---|
| 1816 |
|
|---|
| 1817 | ;; lock
|
|---|
| 1818 | (def-x8664-opcode lock ()
|
|---|
| 1819 | #xf0 nil nil)
|
|---|
| 1820 |
|
|---|
| 1821 | ;; lods
|
|---|
| 1822 | (def-x8664-opcode lodsq ()
|
|---|
| 1823 | #xac nil #x48)
|
|---|
| 1824 |
|
|---|
| 1825 | (def-x8664-opcode lodsl ()
|
|---|
| 1826 | #xac nil nil)
|
|---|
| 1827 |
|
|---|
| 1828 | ;; loop
|
|---|
| 1829 | (def-x8664-opcode loopq ((:label :insert-label))
|
|---|
| 1830 | #xe2 nil #x48)
|
|---|
| 1831 |
|
|---|
| 1832 | (def-x8664-opcode loopl ((:label :insert-label))
|
|---|
| 1833 | #xe2 nil nil)
|
|---|
| 1834 |
|
|---|
| 1835 | (def-x8664-opcode loopzq ((:label :insert-label))
|
|---|
| 1836 | #xe1 nil #x48)
|
|---|
| 1837 |
|
|---|
| 1838 | (def-x8664-opcode loopzl ((:label :insert-label))
|
|---|
| 1839 | #xe1 nil nil)
|
|---|
| 1840 |
|
|---|
| 1841 | (def-x8664-opcode loopnzq ((:label :insert-label))
|
|---|
| 1842 | #xe0 nil #x48)
|
|---|
| 1843 |
|
|---|
| 1844 | (def-x8664-opcode loopnzl ((:label :insert-label))
|
|---|
| 1845 | #xe0 nil nil)
|
|---|
| 1846 |
|
|---|
| 1847 | ;; mov, including the MMX/XMM variants.
|
|---|
| 1848 | (def-x8664-opcode movq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 1849 | #x0f6f #o300 0)
|
|---|
| 1850 | (def-x8664-opcode movq ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
|
|---|
| 1851 | #x0f7f #o0 0)
|
|---|
| 1852 | (def-x8664-opcode movq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 1853 | #x0f6f #o0 0)
|
|---|
| 1854 | (def-x8664-opcode movq ((:regxmm :insert-xmm-reg) (:regxmm :insert-xmm-rm))
|
|---|
| 1855 | #x0f7e #o300 0 #xf3)
|
|---|
| 1856 | (def-x8664-opcode movq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 1857 | #x0f7e #o000 0 #xf3)
|
|---|
| 1858 | (def-x8664-opcode movq ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
|
|---|
| 1859 | #x0fd6 #o000 0 #x66)
|
|---|
| 1860 |
|
|---|
| 1861 | (def-x8664-opcode movq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 1862 | #x89 #o300 #x48)
|
|---|
| 1863 | (def-x8664-opcode movq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1864 | #x8b #o0 #x48)
|
|---|
| 1865 | (def-x8664-opcode movq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1866 | #x89 #o0 #x48)
|
|---|
| 1867 | (def-x8664-opcode movq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 1868 | #xc7 #o300 #x48)
|
|---|
| 1869 | (def-x8664-opcode movq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 1870 | #xc7 #o000 #x48)
|
|---|
| 1871 | (def-x8664-opcode movq ((:imm64 :insert-imm64) (:reg64 :insert-opcode-reg))
|
|---|
| 1872 | #xb8 nil #x48)
|
|---|
| 1873 |
|
|---|
| 1874 | (def-x8664-opcode movl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1875 | #x89 #o300 #x00)
|
|---|
| 1876 | (def-x8664-opcode movl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1877 | #x8b #o0 #x00)
|
|---|
| 1878 | (def-x8664-opcode movl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1879 | #x89 #o0 #x00)
|
|---|
| 1880 | (def-x8664-opcode movl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 1881 | #xc7 #o300 #x00)
|
|---|
| 1882 | (def-x8664-opcode movl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 1883 | #xc7 #o000 #x00)
|
|---|
| 1884 |
|
|---|
| 1885 |
|
|---|
| 1886 | (def-x8664-opcode movw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1887 | #x89 #o300 #x00 #x66)
|
|---|
| 1888 | (def-x8664-opcode movw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1889 | #x8b #o0 #x00 #x66)
|
|---|
| 1890 | (def-x8664-opcode movw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1891 | #x89 #o0 #x00 #x66)
|
|---|
| 1892 | (def-x8664-opcode movw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 1893 | #xc7 #o300 #x00 #x66)
|
|---|
| 1894 | (def-x8664-opcode movw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 1895 | #xc7 #o000 #x00 #x66)
|
|---|
| 1896 |
|
|---|
| 1897 | (def-x8664-opcode movb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 1898 | #x88 #o300 0)
|
|---|
| 1899 | (def-x8664-opcode movb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 1900 | #x8a #o0 0)
|
|---|
| 1901 | (def-x8664-opcode movb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 1902 | #x88 #o0 0)
|
|---|
| 1903 | (def-x8664-opcode movb ((:imm8s :insert-imm8s) (:reg8 :insert-opcode-reg))
|
|---|
| 1904 | #xb0 nil 0)
|
|---|
| 1905 | (def-x8664-opcode movb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 1906 | #xc6 #o000 0)
|
|---|
| 1907 |
|
|---|
| 1908 | ;; movd
|
|---|
| 1909 | (def-x8664-opcode movd ((:reg64 :insert-modrm-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 1910 | #x0f6e #o300 #x48)
|
|---|
| 1911 | (def-x8664-opcode movd ((:reg32 :insert-modrm-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 1912 | #x0f6e #o300 0)
|
|---|
| 1913 | (def-x8664-opcode movd ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 1914 | #x0f6e #o000 0)
|
|---|
| 1915 | (def-x8664-opcode movd ((:regmmx :insert-mmx-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 1916 | #x0f7e #o300 #x48)
|
|---|
| 1917 | (def-x8664-opcode movd ((:regmmx :insert-mmx-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1918 | #x0f7e #o300 #x0)
|
|---|
| 1919 | (def-x8664-opcode movd ((:regmmx :insert-mmx-reg) (:anymem :insert-memory))
|
|---|
| 1920 | #x0f7e #o000 #x0)
|
|---|
| 1921 |
|
|---|
| 1922 | (def-x8664-opcode movd ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 1923 | #x0f6e #o300 #x48 #x66)
|
|---|
| 1924 | (def-x8664-opcode movd ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 1925 | #x0f6e #o300 0 #x66)
|
|---|
| 1926 | (def-x8664-opcode movd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 1927 | #x0f6e #o000 0 #x66)
|
|---|
| 1928 | (def-x8664-opcode movd ((:regxmm :insert-xmm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 1929 | #x0f7e #o300 #x48 #x66)
|
|---|
| 1930 | (def-x8664-opcode movd ((:regxmm :insert-xmm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 1931 | #x0f7e #o300 #x0 #x66)
|
|---|
| 1932 | (def-x8664-opcode movd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
|
|---|
| 1933 | #x0f7e #o000 #x0 #x66)
|
|---|
| 1934 |
|
|---|
| 1935 | ;; sign-extending mov
|
|---|
| 1936 | (def-x8664-opcode movsbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1937 | #x0fbe #o300 0)
|
|---|
| 1938 | (def-x8664-opcode movsbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1939 | #x0fbe #o000 0)
|
|---|
| 1940 | (def-x8664-opcode movsbw ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 1941 | #x0fbe #o300 0 #x66)
|
|---|
| 1942 | (def-x8664-opcode movsbw ((:anymem :insert-memory) (:reg16 :insert-modrm-rm))
|
|---|
| 1943 | #x0fbe #o300 0 #x66)
|
|---|
| 1944 | (def-x8664-opcode movsbq ((:reg8 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1945 | #x0fbe #o300 #x48)
|
|---|
| 1946 | (def-x8664-opcode movsbq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1947 | #x0fbe #o000 #x48)
|
|---|
| 1948 | (def-x8664-opcode movswl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1949 | #x0fbf #o300 0)
|
|---|
| 1950 | (def-x8664-opcode movswl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1951 | #x0fbf #o000 0)
|
|---|
| 1952 | (def-x8664-opcode movswq ((:reg16 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1953 | #x0fbf #o300 #x48)
|
|---|
| 1954 | (def-x8664-opcode movswq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1955 | #x0fbf #o000 #x48)
|
|---|
| 1956 | (def-x8664-opcode movslq ((:reg32 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1957 | #x63 #o300 #x48)
|
|---|
| 1958 | (def-x8664-opcode movslq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1959 | #x63 #o000 #x48)
|
|---|
| 1960 |
|
|---|
| 1961 | ;; zero-extending MOVs
|
|---|
| 1962 | (def-x8664-opcode movzbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1963 | #x0fb6 #o300 0)
|
|---|
| 1964 | (def-x8664-opcode movzbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1965 | #x0fb6 #o000 0)
|
|---|
| 1966 | (def-x8664-opcode movzbw ((:reg8 :insert-modrm-rm) (:reg16 :insert-modrm-reg))
|
|---|
| 1967 | #x0fb6 #o300 0 #x66)
|
|---|
| 1968 | (def-x8664-opcode movzbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 1969 | #x0fb6 #o300 0 #x66)
|
|---|
| 1970 | (def-x8664-opcode movzwl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 1971 | #x0fb7 #o300 0)
|
|---|
| 1972 | (def-x8664-opcode movzwl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 1973 | #x0fb7 #o000 0)
|
|---|
| 1974 | (def-x8664-opcode movzbq ((:reg8 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1975 | #x0fb6 #o300 #x48)
|
|---|
| 1976 | (def-x8664-opcode movzbq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1977 | #x0fb6 #o000 #x48)
|
|---|
| 1978 | (def-x8664-opcode movzwq ((:reg16 :insert-modrm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 1979 | #x0fb7 #o300 #x48)
|
|---|
| 1980 | (def-x8664-opcode movzwq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 1981 | #x0fb7 #o000 #x48)
|
|---|
| 1982 |
|
|---|
| 1983 | ;; mul
|
|---|
| 1984 | (def-x8664-opcode mulq ((:reg64 :insert-modrm-rm))
|
|---|
| 1985 | #xf7 #o340 #x48)
|
|---|
| 1986 | (def-x8664-opcode mulq ((:anymem :insert-memory))
|
|---|
| 1987 | #xf7 #o040 #x48)
|
|---|
| 1988 |
|
|---|
| 1989 | (def-x8664-opcode mull ((:reg32 :insert-modrm-rm))
|
|---|
| 1990 | #xf7 #o340 #x00)
|
|---|
| 1991 | (def-x8664-opcode mull ((:anymem :insert-memory))
|
|---|
| 1992 | #xf7 #o040 #x00)
|
|---|
| 1993 |
|
|---|
| 1994 | (def-x8664-opcode mulw ((:reg16 :insert-modrm-rm))
|
|---|
| 1995 | #xf7 #o340 #x00 #x66)
|
|---|
| 1996 | (def-x8664-opcode mulw ((:anymem :insert-memory))
|
|---|
| 1997 | #xf7 #o040 #x00 #x66)
|
|---|
| 1998 |
|
|---|
| 1999 | (def-x8664-opcode mulb ((:reg8 :insert-modrm-rm))
|
|---|
| 2000 | #xf6 #o340 #x00)
|
|---|
| 2001 | (def-x8664-opcode mull ((:anymem :insert-memory))
|
|---|
| 2002 | #xf6 #o040 #x00)
|
|---|
| 2003 |
|
|---|
| 2004 | ;; neg
|
|---|
| 2005 | (def-x8664-opcode negq ((:reg64 :insert-modrm-rm))
|
|---|
| 2006 | #xf7 #o330 #x48)
|
|---|
| 2007 | (def-x8664-opcode negq ((:anymem :insert-memory))
|
|---|
| 2008 | #xf7 #o030 #x48)
|
|---|
| 2009 |
|
|---|
| 2010 | (def-x8664-opcode negl ((:reg32 :insert-modrm-rm))
|
|---|
| 2011 | #xf7 #o330 #x00)
|
|---|
| 2012 | (def-x8664-opcode negl ((:anymem :insert-memory))
|
|---|
| 2013 | #xf7 #o030 #x00)
|
|---|
| 2014 |
|
|---|
| 2015 | (def-x8664-opcode negw ((:reg16 :insert-modrm-rm))
|
|---|
| 2016 | #xf7 #o330 #x00 #x66)
|
|---|
| 2017 | (def-x8664-opcode negw ((:anymem :insert-memory))
|
|---|
| 2018 | #xf7 #o030 #x00 #x66)
|
|---|
| 2019 |
|
|---|
| 2020 | (def-x8664-opcode negb ((:reg8 :insert-modrm-rm))
|
|---|
| 2021 | #xf6 #o330 #x00)
|
|---|
| 2022 | (def-x8664-opcode negb ((:anymem :insert-memory))
|
|---|
| 2023 | #xf6 #o030 #x00)
|
|---|
| 2024 |
|
|---|
| 2025 | ;; nop
|
|---|
| 2026 | (def-x8664-opcode nop ()
|
|---|
| 2027 | #x90 nil nil)
|
|---|
| 2028 |
|
|---|
| 2029 | ;; not
|
|---|
| 2030 | (def-x8664-opcode notq ((:reg64 :insert-modrm-rm))
|
|---|
| 2031 | #xf7 #o320 #x48)
|
|---|
| 2032 | (def-x8664-opcode notq ((:anymem :insert-memory))
|
|---|
| 2033 | #xf7 #o020 #x48)
|
|---|
| 2034 | (def-x8664-opcode notl ((:reg32 :insert-modrm-rm))
|
|---|
| 2035 | #xf7 #o320 #x0)
|
|---|
| 2036 | (def-x8664-opcode notl ((:anymem :insert-memory))
|
|---|
| 2037 | #xf7 #o020 #x0)
|
|---|
| 2038 | (def-x8664-opcode notw ((:reg16 :insert-modrm-rm))
|
|---|
| 2039 | #xf7 #o320 #x0 #x66)
|
|---|
| 2040 | (def-x8664-opcode notw ((:anymem :insert-memory))
|
|---|
| 2041 | #xf7 #o020 #x0 #x66)
|
|---|
| 2042 | (def-x8664-opcode notb ((:reg8 :insert-modrm-rm))
|
|---|
| 2043 | #xf6 #o320 #x0)
|
|---|
| 2044 | (def-x8664-opcode notb ((:anymem :insert-memory))
|
|---|
| 2045 | #xf6 #o020 #x0)
|
|---|
| 2046 |
|
|---|
| 2047 | ;; or
|
|---|
| 2048 | (def-x8664-opcode orq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2049 | #x09 #o300 #x48)
|
|---|
| 2050 | (def-x8664-opcode orq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 2051 | #x0b #o000 #x48)
|
|---|
| 2052 | (def-x8664-opcode orq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2053 | #x09 #x00 #x48)
|
|---|
| 2054 | (def-x8664-opcode orq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 2055 | #x83 #o310 #x48)
|
|---|
| 2056 | (def-x8664-opcode orq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2057 | #x0d nil #x48)
|
|---|
| 2058 | (def-x8664-opcode orq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 2059 | #x81 #o310 #x48)
|
|---|
| 2060 | (def-x8664-opcode orq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2061 | #x83 #o010 #x48)
|
|---|
| 2062 | (def-x8664-opcode orq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2063 | #x81 #o010 #x48)
|
|---|
| 2064 |
|
|---|
| 2065 | (def-x8664-opcode orl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 2066 | #x09 #o300 #x00)
|
|---|
| 2067 | (def-x8664-opcode orl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 2068 | #x0b #o000 #x00)
|
|---|
| 2069 | (def-x8664-opcode orl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2070 | #x09 #x00 #x00)
|
|---|
| 2071 | (def-x8664-opcode orl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 2072 | #x83 #o310 #x00)
|
|---|
| 2073 | (def-x8664-opcode orl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2074 | #x0d nil nil)
|
|---|
| 2075 | (def-x8664-opcode orl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 2076 | #x81 #o310 #x00)
|
|---|
| 2077 | (def-x8664-opcode orl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2078 | #x83 #o010 #x00)
|
|---|
| 2079 | (def-x8664-opcode orl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2080 | #x81 #o010 #x00)
|
|---|
| 2081 |
|
|---|
| 2082 | (def-x8664-opcode orw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 2083 | #x09 #o300 #x00 #x66)
|
|---|
| 2084 | (def-x8664-opcode orw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 2085 | #x0b #o000 #x00 #x66)
|
|---|
| 2086 | (def-x8664-opcode orw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2087 | #x09 #x00 #x00 #x66)
|
|---|
| 2088 | (def-x8664-opcode orw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 2089 | #x83 #o310 #x00 #x66)
|
|---|
| 2090 | (def-x8664-opcode orw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 2091 | #x0d nil nil #x66)
|
|---|
| 2092 | (def-x8664-opcode orw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 2093 | #x81 #o310 #x00 #x66)
|
|---|
| 2094 | (def-x8664-opcode orw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2095 | #x83 #o010 #x00 #x66)
|
|---|
| 2096 | (def-x8664-opcode orw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 2097 | #x81 #o010 #x00 #x66)
|
|---|
| 2098 |
|
|---|
| 2099 | (def-x8664-opcode orb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 2100 | #x08 #o300 #x00)
|
|---|
| 2101 | (def-x8664-opcode orb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 2102 | #x0a #o000 #x00)
|
|---|
| 2103 | (def-x8664-opcode orb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2104 | #x08 #x00 #x00)
|
|---|
| 2105 | (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
|
|---|
| 2106 | #x0c nil nil)
|
|---|
| 2107 | (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 2108 | #x80 #o310 #x00)
|
|---|
| 2109 | (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 2110 | #x80 #o310 #x00)
|
|---|
| 2111 | (def-x8664-opcode orb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2112 | #x80 #o010 #x00)
|
|---|
| 2113 |
|
|---|
| 2114 | ;; pop
|
|---|
| 2115 | (def-x8664-opcode popq ((:reg64 :insert-opcode-reg))
|
|---|
| 2116 | #x58 nil #x0)
|
|---|
| 2117 | (def-x8664-opcode popq ((:anymem :insert-memory))
|
|---|
| 2118 | #x8f #o000 #x0)
|
|---|
| 2119 | (def-x8664-opcode popw ((:reg16 :insert-opcode-reg))
|
|---|
| 2120 | #x58 nil #x0 #x66)
|
|---|
| 2121 | (def-x8664-opcode popw ((:anymem :insert-memory))
|
|---|
| 2122 | #x8f #o000 #x0 #x66)
|
|---|
| 2123 |
|
|---|
| 2124 | ;; popf
|
|---|
| 2125 | (def-x8664-opcode popfq ()
|
|---|
| 2126 | #x9d nil #x48)
|
|---|
| 2127 | (def-x8664-opcode popfl ()
|
|---|
| 2128 | #x9d nil nil)
|
|---|
| 2129 |
|
|---|
| 2130 | ;; push . It's not clear how "pushw $imm16" is encoded.
|
|---|
| 2131 | (def-x8664-opcode pushq ((:reg64 :insert-opcode-reg))
|
|---|
| 2132 | #x50 nil #x0)
|
|---|
| 2133 | (def-x8664-opcode pushq ((:anymem :insert-memory))
|
|---|
| 2134 | #xff #o060 #x0)
|
|---|
| 2135 | (def-x8664-opcode pushq ((:imm8s :insert-imm8s))
|
|---|
| 2136 | #x6a nil nil)
|
|---|
| 2137 | (def-x8664-opcode pushq ((:imm32s :insert-imm32s))
|
|---|
| 2138 | #x68 nil nil)
|
|---|
| 2139 |
|
|---|
| 2140 | (def-x8664-opcode pushw ((:reg16 :insert-opcode-reg))
|
|---|
| 2141 | #x50 nil 0 #x66)
|
|---|
| 2142 | (def-x8664-opcode pushw ((:anymem :insert-memory))
|
|---|
| 2143 | #xff #o060 #x0 #x66)
|
|---|
| 2144 |
|
|---|
| 2145 | ;; pushf
|
|---|
| 2146 | (def-x8664-opcode pushfq ()
|
|---|
| 2147 | #x9c nil nil)
|
|---|
| 2148 | (def-x8664-opcode pushfw ()
|
|---|
| 2149 | #x9c nil nil #x66)
|
|---|
| 2150 |
|
|---|
| 2151 | ;; rcl. Note that the :ShiftCount operand type only matches %cl.
|
|---|
| 2152 | (def-x8664-opcode rclq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2153 | #xd1 #o320 #x48)
|
|---|
| 2154 | (def-x8664-opcode rclq ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2155 | #xd1 #o020 #x48)
|
|---|
| 2156 | (def-x8664-opcode rclq ((:reg64 :insert-modrm-rm))
|
|---|
| 2157 | #xd1 #o320 #x48)
|
|---|
| 2158 | (def-x8664-opcode rclq ((:anymem :insert-memory))
|
|---|
| 2159 | #xd1 #o020 #x48)
|
|---|
| 2160 | (def-x8664-opcode rclq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 2161 | #xc1 #o320 #x48)
|
|---|
| 2162 | (def-x8664-opcode rclq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2163 | #xd3 #o320 #x48)
|
|---|
| 2164 |
|
|---|
| 2165 | (def-x8664-opcode rcll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2166 | #xd1 #o320 #x0)
|
|---|
| 2167 | (def-x8664-opcode rcll ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2168 | #xd1 #o020 #x0)
|
|---|
| 2169 | (def-x8664-opcode rcll ((:reg32 :insert-modrm-rm))
|
|---|
| 2170 | #xd1 #o320 #x0)
|
|---|
| 2171 | (def-x8664-opcode rcll ((:anymem :insert-memory))
|
|---|
| 2172 | #xd1 #o020 #x0)
|
|---|
| 2173 | (def-x8664-opcode rcll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 2174 | #xc1 #o320 #x0)
|
|---|
| 2175 | (def-x8664-opcode rcll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2176 | #xd3 #o320 #x0)
|
|---|
| 2177 |
|
|---|
| 2178 | (def-x8664-opcode rclw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2179 | #xd1 #o320 #x0 #x66)
|
|---|
| 2180 | (def-x8664-opcode rclw ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2181 | #xd1 #o020 #x0 #x66)
|
|---|
| 2182 | (def-x8664-opcode rclw ((:reg16 :insert-modrm-rm))
|
|---|
| 2183 | #xd1 #o320 #x0 #x66)
|
|---|
| 2184 | (def-x8664-opcode rclw ((:anymem :insert-memory))
|
|---|
| 2185 | #xd1 #o020 #x0 #x66)
|
|---|
| 2186 | (def-x8664-opcode rclw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 2187 | #xc1 #o320 #x0 #x66)
|
|---|
| 2188 | (def-x8664-opcode rclw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2189 | #xd3 #o320 #x0 #x66)
|
|---|
| 2190 |
|
|---|
| 2191 | (def-x8664-opcode rclb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2192 | #xd0 #o320 #x0)
|
|---|
| 2193 | (def-x8664-opcode rclb ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2194 | #xd0 #o020 #x0)
|
|---|
| 2195 | (def-x8664-opcode rclb ((:reg8 :insert-modrm-rm))
|
|---|
| 2196 | #xd0 #o320 #x0)
|
|---|
| 2197 | (def-x8664-opcode rclb ((:anymem :insert-memory))
|
|---|
| 2198 | #xd0 #o020 #x0)
|
|---|
| 2199 | (def-x8664-opcode rclb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 2200 | #xc0 #o320 #x0)
|
|---|
| 2201 | (def-x8664-opcode rclb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2202 | #xd2 #o320 #x0)
|
|---|
| 2203 |
|
|---|
| 2204 | ;; rcr
|
|---|
| 2205 | (def-x8664-opcode rcrq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2206 | #xd1 #o330 #x48)
|
|---|
| 2207 | (def-x8664-opcode rcrq ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2208 | #xd1 #o030 #x48)
|
|---|
| 2209 | (def-x8664-opcode rcrq ((:reg64 :insert-modrm-rm))
|
|---|
| 2210 | #xd1 #o330 #x48)
|
|---|
| 2211 | (def-x8664-opcode rcrq ((:anymem :insert-memory))
|
|---|
| 2212 | #xd1 #o030 #x48)
|
|---|
| 2213 | (def-x8664-opcode rcrq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 2214 | #xc1 #o330 #x48)
|
|---|
| 2215 | (def-x8664-opcode rcrq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2216 | #xd3 #o330 #x48)
|
|---|
| 2217 |
|
|---|
| 2218 | (def-x8664-opcode rcrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2219 | #xd1 #o330 #x0)
|
|---|
| 2220 | (def-x8664-opcode rcrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2221 | #xd1 #o030 #x0)
|
|---|
| 2222 | (def-x8664-opcode rcrl ((:reg32 :insert-modrm-rm))
|
|---|
| 2223 | #xd1 #o330 #x0)
|
|---|
| 2224 | (def-x8664-opcode rcrl ((:anymem :insert-memory))
|
|---|
| 2225 | #xd1 #o030 #x0)
|
|---|
| 2226 | (def-x8664-opcode rcrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 2227 | #xc1 #o330 #x0)
|
|---|
| 2228 | (def-x8664-opcode rcrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2229 | #xd3 #o330 #x0)
|
|---|
| 2230 |
|
|---|
| 2231 | (def-x8664-opcode rcrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2232 | #xd1 #o330 #x0 #x66)
|
|---|
| 2233 | (def-x8664-opcode rcrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2234 | #xd1 #o030 #x0 #x66)
|
|---|
| 2235 | (def-x8664-opcode rcrw ((:reg16 :insert-modrm-rm))
|
|---|
| 2236 | #xd1 #o330 #x0 #x66)
|
|---|
| 2237 | (def-x8664-opcode rcrw ((:anymem :insert-memory))
|
|---|
| 2238 | #xd1 #o030 #x0 #x66)
|
|---|
| 2239 | (def-x8664-opcode rcrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 2240 | #xc1 #o330 #x0 #x66)
|
|---|
| 2241 | (def-x8664-opcode rcrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2242 | #xd3 #o330 #x0 #x66)
|
|---|
| 2243 |
|
|---|
| 2244 | (def-x8664-opcode rcrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2245 | #xd0 #o330 #x0)
|
|---|
| 2246 | (def-x8664-opcode rcrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2247 | #xd0 #o030 #x0)
|
|---|
| 2248 | (def-x8664-opcode rcrb ((:reg8 :insert-modrm-rm))
|
|---|
| 2249 | #xd0 #o330 #x0)
|
|---|
| 2250 | (def-x8664-opcode rcrb ((:anymem :insert-memory))
|
|---|
| 2251 | #xd0 #o030 #x0)
|
|---|
| 2252 | (def-x8664-opcode rcrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 2253 | #xc0 #o330 #x0)
|
|---|
| 2254 | (def-x8664-opcode rcrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2255 | #xd2 #o330 #x0)
|
|---|
| 2256 |
|
|---|
| 2257 | ;; repe, repne. These are really prefixes, that should
|
|---|
| 2258 | ;; only be used before string instructions.
|
|---|
| 2259 | (def-x8664-opcode repe ()
|
|---|
| 2260 | #xf3 nil nil)
|
|---|
| 2261 |
|
|---|
| 2262 | (def-x8664-opcode repne ()
|
|---|
| 2263 | #xf2 nil nil)
|
|---|
| 2264 |
|
|---|
| 2265 | ;; ret
|
|---|
| 2266 | (def-x8664-opcode ret ()
|
|---|
| 2267 | #xc3 nil nil)
|
|---|
| 2268 |
|
|---|
| 2269 | (def-x8664-opcode ret ((:imm16 :insert-imm16))
|
|---|
| 2270 | #xc2 nil nil)
|
|---|
| 2271 |
|
|---|
| 2272 | ;; rol
|
|---|
| 2273 | (def-x8664-opcode rolq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2274 | #xd1 #o300 #x48)
|
|---|
| 2275 | (def-x8664-opcode rolq ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2276 | #xd1 #o000 #x48)
|
|---|
| 2277 | (def-x8664-opcode rolq ((:reg64 :insert-modrm-rm))
|
|---|
| 2278 | #xd1 #o300 #x48)
|
|---|
| 2279 | (def-x8664-opcode rolq ((:anymem :insert-memory))
|
|---|
| 2280 | #xd1 #o000 #x48)
|
|---|
| 2281 | (def-x8664-opcode rolq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 2282 | #xc1 #o300 #x48)
|
|---|
| 2283 | (def-x8664-opcode rolq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2284 | #xd3 #o300 #x48)
|
|---|
| 2285 |
|
|---|
| 2286 | (def-x8664-opcode roll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2287 | #xd1 #o300 #x0)
|
|---|
| 2288 | (def-x8664-opcode roll ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2289 | #xd1 #o000 #x0)
|
|---|
| 2290 | (def-x8664-opcode roll ((:reg32 :insert-modrm-rm))
|
|---|
| 2291 | #xd1 #o300 #x0)
|
|---|
| 2292 | (def-x8664-opcode roll ((:anymem :insert-memory))
|
|---|
| 2293 | #xd1 #o000 #x0)
|
|---|
| 2294 | (def-x8664-opcode roll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 2295 | #xc1 #o300 #x0)
|
|---|
| 2296 | (def-x8664-opcode roll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2297 | #xd3 #o300 #x0)
|
|---|
| 2298 |
|
|---|
| 2299 | (def-x8664-opcode rolw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2300 | #xd1 #o300 #x0 #x66)
|
|---|
| 2301 | (def-x8664-opcode rolw ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2302 | #xd1 #o000 #x0 #x66)
|
|---|
| 2303 | (def-x8664-opcode rolw ((:reg16 :insert-modrm-rm))
|
|---|
| 2304 | #xd1 #o300 #x0 #x66)
|
|---|
| 2305 | (def-x8664-opcode rolw ((:anymem :insert-memory))
|
|---|
| 2306 | #xd1 #o000 #x0 #x66)
|
|---|
| 2307 | (def-x8664-opcode rolw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 2308 | #xc1 #o300 #x0 #x66)
|
|---|
| 2309 | (def-x8664-opcode rolw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2310 | #xd3 #o300 #x0 #x66)
|
|---|
| 2311 |
|
|---|
| 2312 | (def-x8664-opcode rolb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2313 | #xd0 #o300 #x0)
|
|---|
| 2314 | (def-x8664-opcode rolb ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2315 | #xd0 #o000 #x0)
|
|---|
| 2316 | (def-x8664-opcode rolb ((:reg8 :insert-modrm-rm))
|
|---|
| 2317 | #xd0 #o300 #x0)
|
|---|
| 2318 | (def-x8664-opcode rolb ((:anymem :insert-memory))
|
|---|
| 2319 | #xd0 #o000 #x0)
|
|---|
| 2320 | (def-x8664-opcode rolb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 2321 | #xc0 #o300 #x0)
|
|---|
| 2322 | (def-x8664-opcode rolb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2323 | #xd2 #o300 #x0)
|
|---|
| 2324 |
|
|---|
| 2325 | ;; ror
|
|---|
| 2326 | (def-x8664-opcode rorq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2327 | #xd1 #o310 #x48)
|
|---|
| 2328 | (def-x8664-opcode rorq ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2329 | #xd1 #o010 #x48)
|
|---|
| 2330 | (def-x8664-opcode rorq ((:reg64 :insert-modrm-rm))
|
|---|
| 2331 | #xd1 #o310 #x48)
|
|---|
| 2332 | (def-x8664-opcode rorq ((:anymem :insert-memory))
|
|---|
| 2333 | #xd1 #o010 #x48)
|
|---|
| 2334 | (def-x8664-opcode rorq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 2335 | #xc1 #o310 #x48)
|
|---|
| 2336 | (def-x8664-opcode rorq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2337 | #xd3 #o310 #x48)
|
|---|
| 2338 |
|
|---|
| 2339 | (def-x8664-opcode rorl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2340 | #xd1 #o310 #x0)
|
|---|
| 2341 | (def-x8664-opcode rorl ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2342 | #xd1 #o010 #x0)
|
|---|
| 2343 | (def-x8664-opcode rorl ((:reg32 :insert-modrm-rm))
|
|---|
| 2344 | #xd1 #o310 #x0)
|
|---|
| 2345 | (def-x8664-opcode rorl ((:anymem :insert-memory))
|
|---|
| 2346 | #xd1 #o010 #x0)
|
|---|
| 2347 | (def-x8664-opcode rorl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 2348 | #xc1 #o310 #x0)
|
|---|
| 2349 | (def-x8664-opcode rorl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2350 | #xd3 #o310 #x0)
|
|---|
| 2351 |
|
|---|
| 2352 | (def-x8664-opcode rorw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2353 | #xd1 #o310 #x0 #x66)
|
|---|
| 2354 | (def-x8664-opcode rorw ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2355 | #xd1 #o010 #x0 #x66)
|
|---|
| 2356 | (def-x8664-opcode rorw ((:reg16 :insert-modrm-rm))
|
|---|
| 2357 | #xd1 #o310 #x0 #x66)
|
|---|
| 2358 | (def-x8664-opcode rorw ((:anymem :insert-memory))
|
|---|
| 2359 | #xd1 #o010 #x0 #x66)
|
|---|
| 2360 | (def-x8664-opcode rorw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 2361 | #xc1 #o310 #x0 #x66)
|
|---|
| 2362 | (def-x8664-opcode rorw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2363 | #xd3 #o310 #x0 #x66)
|
|---|
| 2364 |
|
|---|
| 2365 | (def-x8664-opcode rorb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2366 | #xd0 #o310 #x0)
|
|---|
| 2367 | (def-x8664-opcode rorb ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2368 | #xd0 #o010 #x0)
|
|---|
| 2369 | (def-x8664-opcode rorb ((:reg8 :insert-modrm-rm))
|
|---|
| 2370 | #xd0 #o310 #x0)
|
|---|
| 2371 | (def-x8664-opcode rorb ((:anymem :insert-memory))
|
|---|
| 2372 | #xd0 #o010 #x0)
|
|---|
| 2373 | (def-x8664-opcode rorb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 2374 | #xc0 #o310 #x0)
|
|---|
| 2375 | (def-x8664-opcode rorb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2376 | #xd2 #o310 #x0)
|
|---|
| 2377 |
|
|---|
| 2378 | ;; sar
|
|---|
| 2379 | (def-x8664-opcode sarq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2380 | #xd1 #o370 #x48)
|
|---|
| 2381 | (def-x8664-opcode sarq ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2382 | #xd1 #o070 #x48)
|
|---|
| 2383 | (def-x8664-opcode sarq ((:reg64 :insert-modrm-rm))
|
|---|
| 2384 | #xd1 #o370 #x48)
|
|---|
| 2385 | (def-x8664-opcode sarq ((:anymem :insert-memory))
|
|---|
| 2386 | #xd1 #o070 #x48)
|
|---|
| 2387 | (def-x8664-opcode sarq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 2388 | #xc1 #o370 #x48)
|
|---|
| 2389 | (def-x8664-opcode sarq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2390 | #xd3 #o370 #x48)
|
|---|
| 2391 |
|
|---|
| 2392 | (def-x8664-opcode sarl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2393 | #xd1 #o370 #x0)
|
|---|
| 2394 | (def-x8664-opcode sarl ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2395 | #xd1 #o070 #x0)
|
|---|
| 2396 | (def-x8664-opcode sarl ((:reg32 :insert-modrm-rm))
|
|---|
| 2397 | #xd1 #o370 #x0)
|
|---|
| 2398 | (def-x8664-opcode sarl ((:anymem :insert-memory))
|
|---|
| 2399 | #xd1 #o070 #x0)
|
|---|
| 2400 | (def-x8664-opcode sarl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 2401 | #xc1 #o370 #x0)
|
|---|
| 2402 | (def-x8664-opcode sarl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2403 | #xd3 #o370 #x0)
|
|---|
| 2404 |
|
|---|
| 2405 | (def-x8664-opcode sarw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2406 | #xd1 #o370 #x0 #x66)
|
|---|
| 2407 | (def-x8664-opcode sarw ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2408 | #xd1 #o070 #x0 #x66)
|
|---|
| 2409 | (def-x8664-opcode sarw ((:reg16 :insert-modrm-rm))
|
|---|
| 2410 | #xd1 #o370 #x0 #x66)
|
|---|
| 2411 | (def-x8664-opcode sarw ((:anymem :insert-memory))
|
|---|
| 2412 | #xd1 #o070 #x0 #x66)
|
|---|
| 2413 | (def-x8664-opcode sarw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 2414 | #xc1 #o370 #x0 #x66)
|
|---|
| 2415 | (def-x8664-opcode sarw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2416 | #xd3 #o370 #x0 #x66)
|
|---|
| 2417 |
|
|---|
| 2418 | (def-x8664-opcode sarb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2419 | #xd0 #o370 #x0)
|
|---|
| 2420 | (def-x8664-opcode sarb ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2421 | #xd0 #o070 #x0)
|
|---|
| 2422 | (def-x8664-opcode sarb ((:reg8 :insert-modrm-rm))
|
|---|
| 2423 | #xd0 #o370 #x0)
|
|---|
| 2424 | (def-x8664-opcode sarb ((:anymem :insert-memory))
|
|---|
| 2425 | #xd0 #o070 #x0)
|
|---|
| 2426 | (def-x8664-opcode sarb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 2427 | #xc0 #o370 #x0)
|
|---|
| 2428 | (def-x8664-opcode sarb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2429 | #xd2 #o370 #x0)
|
|---|
| 2430 |
|
|---|
| 2431 | ;; sbb
|
|---|
| 2432 | (def-x8664-opcode sbbq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2433 | #x19 #o300 #x48)
|
|---|
| 2434 | (def-x8664-opcode sbbq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 2435 | #x1b #o000 #x48)
|
|---|
| 2436 | (def-x8664-opcode sbbq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2437 | #x19 #x00 #x48)
|
|---|
| 2438 | (def-x8664-opcode sbbq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 2439 | #x83 #o330 #x48)
|
|---|
| 2440 | (def-x8664-opcode sbbq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2441 | #x1d nil #x48)
|
|---|
| 2442 | (def-x8664-opcode sbbq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 2443 | #x81 #o330 #x48)
|
|---|
| 2444 | (def-x8664-opcode sbbq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2445 | #x83 #o030 #x48)
|
|---|
| 2446 | (def-x8664-opcode sbbq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2447 | #x81 #o030 #x48)
|
|---|
| 2448 |
|
|---|
| 2449 | (def-x8664-opcode sbbl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 2450 | #x19 #o300 #x00)
|
|---|
| 2451 | (def-x8664-opcode sbbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 2452 | #x1b #o000 #x00)
|
|---|
| 2453 | (def-x8664-opcode sbbl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2454 | #x19 #x00 #x00)
|
|---|
| 2455 | (def-x8664-opcode sbbl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 2456 | #x83 #o330 #x00)
|
|---|
| 2457 | (def-x8664-opcode sbbl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2458 | #x1d nil nil)
|
|---|
| 2459 | (def-x8664-opcode sbbl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 2460 | #x81 #o330 #x00)
|
|---|
| 2461 | (def-x8664-opcode sbbl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2462 | #x83 #o030 #x00)
|
|---|
| 2463 | (def-x8664-opcode sbbl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2464 | #x81 #o030 #x00)
|
|---|
| 2465 |
|
|---|
| 2466 | (def-x8664-opcode sbbw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 2467 | #x19 #o300 #x00 #x66)
|
|---|
| 2468 | (def-x8664-opcode sbbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 2469 | #x1b #o000 #x00 #x66)
|
|---|
| 2470 | (def-x8664-opcode sbbw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2471 | #x19 #x00 #x00 #x66)
|
|---|
| 2472 | (def-x8664-opcode sbbw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 2473 | #x83 #o330 #x00 #x66)
|
|---|
| 2474 | (def-x8664-opcode sbbw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 2475 | #x1d nil nil #x66)
|
|---|
| 2476 | (def-x8664-opcode sbbw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 2477 | #x81 #o330 #x00 #x66)
|
|---|
| 2478 | (def-x8664-opcode sbbw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2479 | #x83 #o030 #x00 #x66)
|
|---|
| 2480 | (def-x8664-opcode sbbw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 2481 | #x81 #o030 #x00 #x66)
|
|---|
| 2482 |
|
|---|
| 2483 | (def-x8664-opcode sbbb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 2484 | #x18 #o300 #x00)
|
|---|
| 2485 | (def-x8664-opcode sbbb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 2486 | #x1a #o000 #x00)
|
|---|
| 2487 | (def-x8664-opcode sbbb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2488 | #x18 #x00 #x00)
|
|---|
| 2489 | (def-x8664-opcode sbbb ((:imm8 :insert-imm8) (:acc :insert-nothing))
|
|---|
| 2490 | #x1c nil nil)
|
|---|
| 2491 | (def-x8664-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 2492 | #x80 #o330 #x00)
|
|---|
| 2493 | (def-x8664-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 2494 | #x80 #o330 #x00)
|
|---|
| 2495 | (def-x8664-opcode sbbb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2496 | #x80 #o030 #x00)
|
|---|
| 2497 |
|
|---|
| 2498 | ;; scas
|
|---|
| 2499 | (def-x8664-opcode scasq ()
|
|---|
| 2500 | #xaf nil #x48)
|
|---|
| 2501 | (def-x8664-opcode scasl ()
|
|---|
| 2502 | #xaf nil nil)
|
|---|
| 2503 | (def-x8664-opcode scasw ()
|
|---|
| 2504 | #xaf nil nil #x66)
|
|---|
| 2505 | (def-x8664-opcode scasb ()
|
|---|
| 2506 | #xae nil nil)
|
|---|
| 2507 |
|
|---|
| 2508 |
|
|---|
| 2509 | ;; setcc
|
|---|
| 2510 | (def-x8664-opcode setcc ((:imm8 :insert-cc) (:reg8 :insert-modrm-rm))
|
|---|
| 2511 | #x0f90 #o300 0)
|
|---|
| 2512 | (def-x8664-opcode seto ((:reg8 :insert-modrm-rm))
|
|---|
| 2513 | #x0f90 #o300 0)
|
|---|
| 2514 | (def-x8664-opcode seto ((:anymem :insert-memory))
|
|---|
| 2515 | #x0f90 #o000 0)
|
|---|
| 2516 | (def-x8664-opcode setno ((:reg8 :insert-modrm-rm))
|
|---|
| 2517 | #x0f91 #o300 0)
|
|---|
| 2518 | (def-x8664-opcode setno ((:anymem :insert-memory))
|
|---|
| 2519 | #x0f91 #o000 0)
|
|---|
| 2520 | (def-x8664-opcode setb ((:reg8 :insert-modrm-rm))
|
|---|
| 2521 | #x0f92 #o300 0)
|
|---|
| 2522 | (def-x8664-opcode setb ((:anymem :insert-memory))
|
|---|
| 2523 | #x0f92 #o000 0)
|
|---|
| 2524 | (def-x8664-opcode setc ((:reg8 :insert-modrm-rm))
|
|---|
| 2525 | #x0f92 #o300 0)
|
|---|
| 2526 | (def-x8664-opcode setc ((:anymem :insert-memory))
|
|---|
| 2527 | #x0f92 #o000 0)
|
|---|
| 2528 | (def-x8664-opcode setae ((:reg8 :insert-modrm-rm))
|
|---|
| 2529 | #x0f93 #o300 0)
|
|---|
| 2530 | (def-x8664-opcode setae ((:anymem :insert-memory))
|
|---|
| 2531 | #x0f93 #o000 0)
|
|---|
| 2532 | (def-x8664-opcode sete ((:reg8 :insert-modrm-rm))
|
|---|
| 2533 | #x0f94 #o300 0)
|
|---|
| 2534 | (def-x8664-opcode sete ((:anymem :insert-memory))
|
|---|
| 2535 | #x0f94 #o000 0)
|
|---|
| 2536 | (def-x8664-opcode setne ((:reg8 :insert-modrm-rm))
|
|---|
| 2537 | #x0f95 #o300 0)
|
|---|
| 2538 | (def-x8664-opcode setne ((:anymem :insert-memory))
|
|---|
| 2539 | #x0f95 #o000 0)
|
|---|
| 2540 | (def-x8664-opcode setbe ((:reg8 :insert-modrm-rm))
|
|---|
| 2541 | #x0f96 #o300 0)
|
|---|
| 2542 | (def-x8664-opcode setbe ((:anymem :insert-memory))
|
|---|
| 2543 | #x0f96 #o000 0)
|
|---|
| 2544 | (def-x8664-opcode seta ((:reg8 :insert-modrm-rm))
|
|---|
| 2545 | #x0f97 #o300 0)
|
|---|
| 2546 | (def-x8664-opcode seta ((:anymem :insert-memory))
|
|---|
| 2547 | #x0f97 #o000 0)
|
|---|
| 2548 | (def-x8664-opcode sets ((:reg8 :insert-modrm-rm))
|
|---|
| 2549 | #x0f98 #o300 0)
|
|---|
| 2550 | (def-x8664-opcode sets ((:anymem :insert-memory))
|
|---|
| 2551 | #x0f98 #o000 0)
|
|---|
| 2552 | (def-x8664-opcode setns ((:reg8 :insert-modrm-rm))
|
|---|
| 2553 | #x0f99 #o300 0)
|
|---|
| 2554 | (def-x8664-opcode setns ((:anymem :insert-memory))
|
|---|
| 2555 | #x0f99 #o000 0)
|
|---|
| 2556 | (def-x8664-opcode setpe ((:reg8 :insert-modrm-rm))
|
|---|
| 2557 | #x0f9a #o300 0)
|
|---|
| 2558 | (def-x8664-opcode setpe ((:anymem :insert-memory))
|
|---|
| 2559 | #x0f9a #o000 0)
|
|---|
| 2560 | (def-x8664-opcode setpo ((:reg8 :insert-modrm-rm))
|
|---|
| 2561 | #x0f9b #o300 0)
|
|---|
| 2562 | (def-x8664-opcode setpo ((:anymem :insert-memory))
|
|---|
| 2563 | #x0f9b #o000 0)
|
|---|
| 2564 | (def-x8664-opcode setl ((:reg8 :insert-modrm-rm))
|
|---|
| 2565 | #x0f9c #o300 0)
|
|---|
| 2566 | (def-x8664-opcode setl ((:anymem :insert-memory))
|
|---|
| 2567 | #x0f9c #o000 0)
|
|---|
| 2568 | (def-x8664-opcode setge ((:reg8 :insert-modrm-rm))
|
|---|
| 2569 | #x0f9d #o300 0)
|
|---|
| 2570 | (def-x8664-opcode setge ((:anymem :insert-memory))
|
|---|
| 2571 | #x0f9d #o000 0)
|
|---|
| 2572 | (def-x8664-opcode setle ((:reg8 :insert-modrm-rm))
|
|---|
| 2573 | #x0f9e #o300 0)
|
|---|
| 2574 | (def-x8664-opcode setle ((:anymem :insert-memory))
|
|---|
| 2575 | #x0f9e #o000 0)
|
|---|
| 2576 | (def-x8664-opcode setg ((:reg8 :insert-modrm-rm))
|
|---|
| 2577 | #x0f9f #o300 0)
|
|---|
| 2578 | (def-x8664-opcode setg ((:anymem :insert-memory))
|
|---|
| 2579 | #x0f9f #o000 0)
|
|---|
| 2580 |
|
|---|
| 2581 | ;; shl
|
|---|
| 2582 | (def-x8664-opcode shlq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2583 | #xd1 #o340 #x48)
|
|---|
| 2584 | (def-x8664-opcode shlq ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2585 | #xd1 #o040 #x48)
|
|---|
| 2586 | (def-x8664-opcode shlq ((:reg64 :insert-modrm-rm))
|
|---|
| 2587 | #xd1 #o340 #x48)
|
|---|
| 2588 | (def-x8664-opcode shlq ((:anymem :insert-memory))
|
|---|
| 2589 | #xd1 #o040 #x48)
|
|---|
| 2590 | (def-x8664-opcode shlq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 2591 | #xc1 #o340 #x48)
|
|---|
| 2592 | (def-x8664-opcode shlq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2593 | #xd3 #o340 #x48)
|
|---|
| 2594 |
|
|---|
| 2595 | (def-x8664-opcode shll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2596 | #xd1 #o340 #x0)
|
|---|
| 2597 | (def-x8664-opcode shll ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2598 | #xd1 #o040 #x0)
|
|---|
| 2599 | (def-x8664-opcode shll ((:reg32 :insert-modrm-rm))
|
|---|
| 2600 | #xd1 #o340 #x0)
|
|---|
| 2601 | (def-x8664-opcode shll ((:anymem :insert-memory))
|
|---|
| 2602 | #xd1 #o040 #x0)
|
|---|
| 2603 | (def-x8664-opcode shll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 2604 | #xc1 #o340 #x0)
|
|---|
| 2605 | (def-x8664-opcode shll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2606 | #xd3 #o340 #x0)
|
|---|
| 2607 |
|
|---|
| 2608 | (def-x8664-opcode shlw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2609 | #xd1 #o340 #x0 #x66)
|
|---|
| 2610 | (def-x8664-opcode shlw ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2611 | #xd1 #o040 #x0 #x66)
|
|---|
| 2612 | (def-x8664-opcode shlw ((:reg16 :insert-modrm-rm))
|
|---|
| 2613 | #xd1 #o340 #x0 #x66)
|
|---|
| 2614 | (def-x8664-opcode shlw ((:anymem :insert-memory))
|
|---|
| 2615 | #xd1 #o040 #x0 #x66)
|
|---|
| 2616 | (def-x8664-opcode shlw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 2617 | #xc1 #o340 #x0 #x66)
|
|---|
| 2618 | (def-x8664-opcode shlw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2619 | #xd3 #o340 #x0 #x66)
|
|---|
| 2620 |
|
|---|
| 2621 | (def-x8664-opcode shlb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2622 | #xd0 #o340 #x0)
|
|---|
| 2623 | (def-x8664-opcode shlb ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2624 | #xd0 #o040 #x0)
|
|---|
| 2625 | (def-x8664-opcode shlb ((:reg8 :insert-modrm-rm))
|
|---|
| 2626 | #xd0 #o340 #x0)
|
|---|
| 2627 | (def-x8664-opcode shlb ((:anymem :insert-memory))
|
|---|
| 2628 | #xd0 #o040 #x0)
|
|---|
| 2629 | (def-x8664-opcode shlb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 2630 | #xc0 #o340 #x0)
|
|---|
| 2631 | (def-x8664-opcode shlb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2632 | #xd2 #o340 #x0)
|
|---|
| 2633 |
|
|---|
| 2634 | ;; shld
|
|---|
| 2635 | (def-x8664-opcode shldq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2636 | #x0fa4 #o300 #x48)
|
|---|
| 2637 | (def-x8664-opcode shldq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2638 | #x0fa4 #o000 #x48)
|
|---|
| 2639 | (def-x8664-opcode shldq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2640 | #x0fa5 #o300 #x48)
|
|---|
| 2641 | (def-x8664-opcode shldq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2642 | #x0fa5 #o000 #x48)
|
|---|
| 2643 | (def-x8664-opcode shldq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2644 | #x0fa5 #o300 #x48)
|
|---|
| 2645 | (def-x8664-opcode shldq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2646 | #x0fa5 #o000 #x48)
|
|---|
| 2647 |
|
|---|
| 2648 | (def-x8664-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2649 | #x0fa4 #o300 #x0)
|
|---|
| 2650 | (def-x8664-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2651 | #x0fa4 #o000 #x0)
|
|---|
| 2652 | (def-x8664-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2653 | #x0fa5 #o300 #x0)
|
|---|
| 2654 | (def-x8664-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2655 | #x0fa5 #o000 #x0)
|
|---|
| 2656 | (def-x8664-opcode shldl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2657 | #x0fa5 #o300 #x0)
|
|---|
| 2658 | (def-x8664-opcode shldl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2659 | #x0fa5 #o000 #x0)
|
|---|
| 2660 |
|
|---|
| 2661 | (def-x8664-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2662 | #x0fa4 #o300 #x0 #x66)
|
|---|
| 2663 | (def-x8664-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2664 | #x0fa4 #o000 #x0 #x66)
|
|---|
| 2665 | (def-x8664-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2666 | #x0fa5 #o300 #x0 #x66)
|
|---|
| 2667 | (def-x8664-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2668 | #x0fa5 #o000 #x0 #x66)
|
|---|
| 2669 | (def-x8664-opcode shldw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2670 | #x0fa5 #o300 #x0 #x66)
|
|---|
| 2671 | (def-x8664-opcode shldw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2672 | #x0fa5 #o000 #x0 #x66)
|
|---|
| 2673 |
|
|---|
| 2674 | ;; shr
|
|---|
| 2675 | (def-x8664-opcode shrq ((:imm1 :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2676 | #xd1 #o350 #x48)
|
|---|
| 2677 | (def-x8664-opcode shrq ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2678 | #xd1 #o050 #x48)
|
|---|
| 2679 | (def-x8664-opcode shrq ((:reg64 :insert-modrm-rm))
|
|---|
| 2680 | #xd1 #o350 #x48)
|
|---|
| 2681 | (def-x8664-opcode shrq ((:anymem :insert-memory))
|
|---|
| 2682 | #xd1 #o050 #x48)
|
|---|
| 2683 | (def-x8664-opcode shrq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-rm))
|
|---|
| 2684 | #xc1 #o350 #x48)
|
|---|
| 2685 | (def-x8664-opcode shrq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-rm))
|
|---|
| 2686 | #xd3 #o350 #x48)
|
|---|
| 2687 |
|
|---|
| 2688 | (def-x8664-opcode shrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2689 | #xd1 #o350 #x0)
|
|---|
| 2690 | (def-x8664-opcode shrl ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2691 | #xd1 #o050 #x0)
|
|---|
| 2692 | (def-x8664-opcode shrl ((:reg32 :insert-modrm-rm))
|
|---|
| 2693 | #xd1 #o350 #x0)
|
|---|
| 2694 | (def-x8664-opcode shrl ((:anymem :insert-memory))
|
|---|
| 2695 | #xd1 #o050 #x0)
|
|---|
| 2696 | (def-x8664-opcode shrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm))
|
|---|
| 2697 | #xc1 #o350 #x0)
|
|---|
| 2698 | (def-x8664-opcode shrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm))
|
|---|
| 2699 | #xd3 #o350 #x0)
|
|---|
| 2700 |
|
|---|
| 2701 | (def-x8664-opcode shrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2702 | #xd1 #o350 #x0 #x66)
|
|---|
| 2703 | (def-x8664-opcode shrw ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2704 | #xd1 #o050 #x0 #x66)
|
|---|
| 2705 | (def-x8664-opcode shrw ((:reg16 :insert-modrm-rm))
|
|---|
| 2706 | #xd1 #o350 #x0 #x66)
|
|---|
| 2707 | (def-x8664-opcode shrw ((:anymem :insert-memory))
|
|---|
| 2708 | #xd1 #o050 #x0 #x66)
|
|---|
| 2709 | (def-x8664-opcode shrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm))
|
|---|
| 2710 | #xc1 #o350 #x0 #x66)
|
|---|
| 2711 | (def-x8664-opcode shrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm))
|
|---|
| 2712 | #xd3 #o350 #x0 #x66)
|
|---|
| 2713 |
|
|---|
| 2714 | (def-x8664-opcode shrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2715 | #xd0 #o350 #x0)
|
|---|
| 2716 | (def-x8664-opcode shrb ((:imm1 :insert-nothing) (:anymem :insert-memory))
|
|---|
| 2717 | #xd0 #o050 #x0)
|
|---|
| 2718 | (def-x8664-opcode shrb ((:reg8 :insert-modrm-rm))
|
|---|
| 2719 | #xd0 #o350 #x0)
|
|---|
| 2720 | (def-x8664-opcode shrb ((:anymem :insert-memory))
|
|---|
| 2721 | #xd0 #o050 #x0)
|
|---|
| 2722 | (def-x8664-opcode shrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm))
|
|---|
| 2723 | #xc0 #o350 #x0)
|
|---|
| 2724 | (def-x8664-opcode shrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm))
|
|---|
| 2725 | #xd2 #o350 #x0)
|
|---|
| 2726 |
|
|---|
| 2727 | ;; shrd
|
|---|
| 2728 | (def-x8664-opcode shrdq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2729 | #x0fac #o300 #x48)
|
|---|
| 2730 | (def-x8664-opcode shrdq ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2731 | #x0fac #o000 #x48)
|
|---|
| 2732 | (def-x8664-opcode shrdq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2733 | #x0fad #o300 #x48)
|
|---|
| 2734 | (def-x8664-opcode shrdq ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2735 | #x0fad #o000 #x48)
|
|---|
| 2736 | (def-x8664-opcode shrdq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2737 | #x0fad #o300 #x48)
|
|---|
| 2738 | (def-x8664-opcode shrdq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2739 | #x0fad #o000 #x48)
|
|---|
| 2740 |
|
|---|
| 2741 | (def-x8664-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2742 | #x0fac #o300 #x0)
|
|---|
| 2743 | (def-x8664-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2744 | #x0fac #o000 #x0)
|
|---|
| 2745 | (def-x8664-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2746 | #x0fad #o300 #x0)
|
|---|
| 2747 | (def-x8664-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2748 | #x0fad #o000 #x0)
|
|---|
| 2749 | (def-x8664-opcode shrdl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2750 | #x0fad #o300 #x0)
|
|---|
| 2751 | (def-x8664-opcode shrdl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2752 | #x0fad #o000 #x0)
|
|---|
| 2753 |
|
|---|
| 2754 | (def-x8664-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2755 | #x0fac #o300 #x0 #x66)
|
|---|
| 2756 | (def-x8664-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2757 | #x0fac #o000 #x0 #x66)
|
|---|
| 2758 | (def-x8664-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2759 | #x0fad #o300 #x0 #x66)
|
|---|
| 2760 | (def-x8664-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2761 | #x0fad #o000 #x0 #x66)
|
|---|
| 2762 | (def-x8664-opcode shrdw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2763 | #x0fad #o300 #x0 #x66)
|
|---|
| 2764 | (def-x8664-opcode shrdw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2765 | #x0fad #o000 #x0 #x66)
|
|---|
| 2766 |
|
|---|
| 2767 | ;; stc
|
|---|
| 2768 | (def-x8664-opcode stc ()
|
|---|
| 2769 | #xf9 nil nil)
|
|---|
| 2770 |
|
|---|
| 2771 | ;; std
|
|---|
| 2772 | (def-x8664-opcode std ()
|
|---|
| 2773 | #xfd nil nil)
|
|---|
| 2774 |
|
|---|
| 2775 | ;; sub
|
|---|
| 2776 | (def-x8664-opcode subq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2777 | #x29 #o300 #x48)
|
|---|
| 2778 | (def-x8664-opcode subq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 2779 | #x2b #o000 #x48)
|
|---|
| 2780 | (def-x8664-opcode subq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2781 | #x29 #x00 #x48)
|
|---|
| 2782 | (def-x8664-opcode subq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 2783 | #x83 #o350 #x48)
|
|---|
| 2784 | (def-x8664-opcode subq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2785 | #x2d nil #x48)
|
|---|
| 2786 | (def-x8664-opcode subq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 2787 | #x81 #o350 #x48)
|
|---|
| 2788 | (def-x8664-opcode subq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2789 | #x83 #o050 #x48)
|
|---|
| 2790 | (def-x8664-opcode subq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2791 | #x81 #o050 #x48)
|
|---|
| 2792 |
|
|---|
| 2793 | (def-x8664-opcode subl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 2794 | #x29 #o300 #x00)
|
|---|
| 2795 | (def-x8664-opcode subl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 2796 | #x2b #o000 #x00)
|
|---|
| 2797 | (def-x8664-opcode subl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2798 | #x29 #x00 #x00)
|
|---|
| 2799 | (def-x8664-opcode subl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 2800 | #x83 #o350 #x00)
|
|---|
| 2801 | (def-x8664-opcode subl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2802 | #x2d nil nil)
|
|---|
| 2803 | (def-x8664-opcode subl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 2804 | #x81 #o350 #x00)
|
|---|
| 2805 | (def-x8664-opcode subl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2806 | #x83 #o050 #x00)
|
|---|
| 2807 | (def-x8664-opcode subl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2808 | #x81 #o050 #x00)
|
|---|
| 2809 |
|
|---|
| 2810 | (def-x8664-opcode subw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 2811 | #x29 #o300 #x00 #x66)
|
|---|
| 2812 | (def-x8664-opcode subw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 2813 | #x2b #o000 #x00 #x66)
|
|---|
| 2814 | (def-x8664-opcode subw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2815 | #x29 #x00 #x00 #x66)
|
|---|
| 2816 | (def-x8664-opcode subw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 2817 | #x83 #o350 #x00 #x66)
|
|---|
| 2818 | (def-x8664-opcode subw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 2819 | #x2d nil nil #x66)
|
|---|
| 2820 | (def-x8664-opcode subw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 2821 | #x81 #o350 #x00 #x66)
|
|---|
| 2822 | (def-x8664-opcode subw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2823 | #x83 #o050 #x00 #x66)
|
|---|
| 2824 | (def-x8664-opcode subw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 2825 | #x81 #o050 #x00 #x66)
|
|---|
| 2826 |
|
|---|
| 2827 | (def-x8664-opcode subb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 2828 | #x28 #o300 #x00)
|
|---|
| 2829 | (def-x8664-opcode subb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 2830 | #x2a #o000 #x00)
|
|---|
| 2831 | (def-x8664-opcode subb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2832 | #x2a #x00 #x00)
|
|---|
| 2833 | (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
|
|---|
| 2834 | #x2c nil nil)
|
|---|
| 2835 | (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 2836 | #x80 #o350 #x00)
|
|---|
| 2837 | (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 2838 | #x80 #o350 #x00)
|
|---|
| 2839 | (def-x8664-opcode subb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2840 | #x80 #o050 #x00)
|
|---|
| 2841 |
|
|---|
| 2842 | ;; syscall
|
|---|
| 2843 | (def-x8664-opcode syscall ()
|
|---|
| 2844 | #x0f0f nil nil)
|
|---|
| 2845 |
|
|---|
| 2846 | ;; test
|
|---|
| 2847 | (def-x8664-opcode testq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2848 | #x85 #o300 #x48)
|
|---|
| 2849 | (def-x8664-opcode testq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2850 | #x85 #o000 #x48)
|
|---|
| 2851 | (def-x8664-opcode testq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 2852 | #x87 #o000 #x48)
|
|---|
| 2853 | (def-x8664-opcode testq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2854 | #xa9 nil #x48)
|
|---|
| 2855 | (def-x8664-opcode testq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 2856 | #xf7 #o300 #x48)
|
|---|
| 2857 | (def-x8664-opcode testq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2858 | #xf7 #o000 #x48)
|
|---|
| 2859 |
|
|---|
| 2860 | (def-x8664-opcode testl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 2861 | #x85 #o300 #x00)
|
|---|
| 2862 | (def-x8664-opcode testl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2863 | #x85 #o000 #x00)
|
|---|
| 2864 | (def-x8664-opcode testl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 2865 | #x87 #o000 #x00)
|
|---|
| 2866 | (def-x8664-opcode testl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2867 | #xa9 nil #x00)
|
|---|
| 2868 | (def-x8664-opcode testl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 2869 | #xf7 #o300 #x00)
|
|---|
| 2870 | (def-x8664-opcode testl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2871 | #xf7 #o000 #x00)
|
|---|
| 2872 |
|
|---|
| 2873 |
|
|---|
| 2874 | (def-x8664-opcode testw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 2875 | #x85 #o300 #x00 #x66)
|
|---|
| 2876 | (def-x8664-opcode testw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2877 | #x85 #o000 #x00 #x66)
|
|---|
| 2878 | (def-x8664-opcode testw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 2879 | #x87 #o000 #x00 #x66)
|
|---|
| 2880 | (def-x8664-opcode testw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 2881 | #xa9 nil #x00 #x66)
|
|---|
| 2882 | (def-x8664-opcode testw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 2883 | #xf7 #o300 #x00 #x66)
|
|---|
| 2884 | (def-x8664-opcode testw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 2885 | #xf7 #o000 #x00 #x66)
|
|---|
| 2886 |
|
|---|
| 2887 |
|
|---|
| 2888 | (def-x8664-opcode testb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 2889 | #x84 #o300 #x00)
|
|---|
| 2890 | (def-x8664-opcode testb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2891 | #x84 #o000 #x00)
|
|---|
| 2892 | (def-x8664-opcode testb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 2893 | #x86 #o000 #x00)
|
|---|
| 2894 | (def-x8664-opcode testb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
|
|---|
| 2895 | #xa8 nil #x00)
|
|---|
| 2896 | (def-x8664-opcode testb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 2897 | #xf6 #o300 #x00)
|
|---|
| 2898 | (def-x8664-opcode testb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2899 | #xf6 #o000 #x00)
|
|---|
| 2900 |
|
|---|
| 2901 | ;; ud2a (not to be confused with all of the other undefined/accidental
|
|---|
| 2902 | ;; instructions) is "officially undefined".
|
|---|
| 2903 | (def-x8664-opcode ud2a ()
|
|---|
| 2904 | #x0f0b nil nil)
|
|---|
| 2905 |
|
|---|
| 2906 | (def-x8664-opcode ud2b ()
|
|---|
| 2907 | #x0fb9 nil nil)
|
|---|
| 2908 |
|
|---|
| 2909 | ;; xadd
|
|---|
| 2910 | (def-x8664-opcode xaddq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2911 | #x0fc1 #o300 #x48)
|
|---|
| 2912 | (def-x8664-opcode xaddq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2913 | #x0fc1 #o000 #x48)
|
|---|
| 2914 |
|
|---|
| 2915 | (def-x8664-opcode xaddl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 2916 | #x0fc1 #o300 #x00)
|
|---|
| 2917 | (def-x8664-opcode xaddl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2918 | #x0fc1 #o000 #x00)
|
|---|
| 2919 |
|
|---|
| 2920 | (def-x8664-opcode xaddw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 2921 | #x0fc1 #o300 #x00 #x66)
|
|---|
| 2922 | (def-x8664-opcode xaddw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2923 | #x0fc1 #o000 #x00 #x66)
|
|---|
| 2924 |
|
|---|
| 2925 | (def-x8664-opcode xaddb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 2926 | #x0fc0 #o300 #x00)
|
|---|
| 2927 | (def-x8664-opcode xaddb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2928 | #x0fc0 #o000 #x00)
|
|---|
| 2929 |
|
|---|
| 2930 | ;; xchg
|
|---|
| 2931 | ;; Allegedly, using the opcode #x9x to implement "(xchg (% eax) (% eax))"
|
|---|
| 2932 | ;; doesn't zero-extend eax to rax on x86-64. (So don't special-case
|
|---|
| 2933 | ;; :acc as source or destination, and use #x86 and a modrm byte in all cases.)
|
|---|
| 2934 | (def-x8664-opcode xchgq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2935 | #x87 #o300 #x48)
|
|---|
| 2936 | (def-x8664-opcode xchgq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2937 | #x87 #o000 #x48)
|
|---|
| 2938 | (def-x8664-opcode xchgq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 2939 | #x89 #o000 #x48)
|
|---|
| 2940 |
|
|---|
| 2941 | (def-x8664-opcode xchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 2942 | #x87 #o300 #x00)
|
|---|
| 2943 | (def-x8664-opcode xchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2944 | #x87 #o000 #x00)
|
|---|
| 2945 | (def-x8664-opcode xchgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 2946 | #x89 #o000 #x00)
|
|---|
| 2947 |
|
|---|
| 2948 | (def-x8664-opcode xchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 2949 | #x87 #o300 #x00 #x66)
|
|---|
| 2950 | (def-x8664-opcode xchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2951 | #x87 #o000 #x00 #x66)
|
|---|
| 2952 | (def-x8664-opcode xchgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 2953 | #x89 #o000 #x00 #x66)
|
|---|
| 2954 |
|
|---|
| 2955 | (def-x8664-opcode xchgl ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 2956 | #x86 #o300 #x00)
|
|---|
| 2957 | (def-x8664-opcode xchgl ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2958 | #x86 #o000 #x00)
|
|---|
| 2959 | (def-x8664-opcode xchgl ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 2960 | #x88 #o000 #x00)
|
|---|
| 2961 |
|
|---|
| 2962 | ;; xlat
|
|---|
| 2963 |
|
|---|
| 2964 | (def-x8664-opcode xlatb ()
|
|---|
| 2965 | #xd7 nil nil)
|
|---|
| 2966 |
|
|---|
| 2967 | ;; xor
|
|---|
| 2968 | (def-x8664-opcode xorq ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm))
|
|---|
| 2969 | #x31 #o300 #x48)
|
|---|
| 2970 | (def-x8664-opcode xorq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 2971 | #x33 #o000 #x48)
|
|---|
| 2972 | (def-x8664-opcode xorq ((:reg64 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2973 | #x31 #x00 #x48)
|
|---|
| 2974 | (def-x8664-opcode xorq ((:imm8s :insert-imm8s) (:reg64 :insert-modrm-rm))
|
|---|
| 2975 | #x83 #o360 #x48)
|
|---|
| 2976 | (def-x8664-opcode xorq ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2977 | #x35 nil #x48)
|
|---|
| 2978 | (def-x8664-opcode xorq ((:imm32s :insert-imm32s) (:reg64 :insert-modrm-rm))
|
|---|
| 2979 | #x81 #o360 #x48)
|
|---|
| 2980 | (def-x8664-opcode xorq ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2981 | #x83 #o060 #x48)
|
|---|
| 2982 | (def-x8664-opcode xorq ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 2983 | #x81 #o060 #x48)
|
|---|
| 2984 |
|
|---|
| 2985 | (def-x8664-opcode xorl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm))
|
|---|
| 2986 | #x31 #o300 #x00)
|
|---|
| 2987 | (def-x8664-opcode xorl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 2988 | #x33 #o000 #x00)
|
|---|
| 2989 | (def-x8664-opcode xorl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 2990 | #x31 #x00 #x00)
|
|---|
| 2991 | (def-x8664-opcode xorl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm))
|
|---|
| 2992 | #x83 #o360 #x00)
|
|---|
| 2993 | (def-x8664-opcode xorl ((:imm32s :insert-imm32s) (:acc :insert-nothing))
|
|---|
| 2994 | #x35 nil nil)
|
|---|
| 2995 | (def-x8664-opcode xorl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm))
|
|---|
| 2996 | #x81 #o360 #x00)
|
|---|
| 2997 | (def-x8664-opcode xorl ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 2998 | #x83 #o060 #x00)
|
|---|
| 2999 | (def-x8664-opcode xorl ((:imm32s :insert-imm32s) (:anymem :insert-memory))
|
|---|
| 3000 | #x81 #o060 #x00)
|
|---|
| 3001 |
|
|---|
| 3002 | (def-x8664-opcode xorw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm))
|
|---|
| 3003 | #x31 #o300 #x00 #x66)
|
|---|
| 3004 | (def-x8664-opcode xorw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg))
|
|---|
| 3005 | #x33 #o000 #x00 #x66)
|
|---|
| 3006 | (def-x8664-opcode xorw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 3007 | #x31 #x00 #x00 #x66)
|
|---|
| 3008 | (def-x8664-opcode xorw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm))
|
|---|
| 3009 | #x83 #o360 #x00 #x66)
|
|---|
| 3010 | (def-x8664-opcode xorw ((:imm16 :insert-imm16) (:acc :insert-nothing))
|
|---|
| 3011 | #x35 nil nil #x66)
|
|---|
| 3012 | (def-x8664-opcode xorw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm))
|
|---|
| 3013 | #x81 #o360 #x00 #x66)
|
|---|
| 3014 | (def-x8664-opcode xorw ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 3015 | #x83 #o060 #x00 #x66)
|
|---|
| 3016 | (def-x8664-opcode xorw ((:imm16 :insert-imm16) (:anymem :insert-memory))
|
|---|
| 3017 | #x81 #o060 #x00 #x66)
|
|---|
| 3018 |
|
|---|
| 3019 | (def-x8664-opcode xorb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm))
|
|---|
| 3020 | #x30 #o300 #x00)
|
|---|
| 3021 | (def-x8664-opcode xorb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg))
|
|---|
| 3022 | #x32 #o000 #x00)
|
|---|
| 3023 | (def-x8664-opcode xorb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory))
|
|---|
| 3024 | #x30 #x00 #x00)
|
|---|
| 3025 | (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:acc :insert-nothing))
|
|---|
| 3026 | #x34 nil nil)
|
|---|
| 3027 | (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 3028 | #x80 #o360 #x00)
|
|---|
| 3029 | (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm))
|
|---|
| 3030 | #x80 #o360 #x00)
|
|---|
| 3031 | (def-x8664-opcode xorb ((:imm8s :insert-imm8s) (:anymem :insert-memory))
|
|---|
| 3032 | #x80 #o060 #x00)
|
|---|
| 3033 |
|
|---|
| 3034 | ;; fxsave
|
|---|
| 3035 | (def-x8664-opcode fxsaveq ((:anymem :insert-memory))
|
|---|
| 3036 | #x0fae #o000 0)
|
|---|
| 3037 |
|
|---|
| 3038 | ;; fxrstor
|
|---|
| 3039 | (def-x8664-opcode fxrstor ((:anymem :insert-memory))
|
|---|
| 3040 | #x0fae #o010 0)
|
|---|
| 3041 |
|
|---|
| 3042 | ;; clflush
|
|---|
| 3043 | (def-x8664-opcode clflush ((:anymem :insert-memory))
|
|---|
| 3044 | #x0fae #o070 0)
|
|---|
| 3045 |
|
|---|
| 3046 | ;; lfence
|
|---|
| 3047 | (def-x8664-opcode lfence ()
|
|---|
| 3048 | #x0fae #xe8 nil)
|
|---|
| 3049 |
|
|---|
| 3050 | ;; mfence
|
|---|
| 3051 | (def-x8664-opcode mfence ()
|
|---|
| 3052 | #x0fae #xf0 nil)
|
|---|
| 3053 |
|
|---|
| 3054 | ;; pause
|
|---|
| 3055 | (def-x8664-opcode pause ()
|
|---|
| 3056 | #xf390 nil nil)
|
|---|
| 3057 |
|
|---|
| 3058 | ;; I don't want to have to define all mmx/sse/sse2 instructions at the
|
|---|
| 3059 | ;; moment, but it wouldn't hurt to define those that the lisp is
|
|---|
| 3060 | ;; likely to use.
|
|---|
| 3061 |
|
|---|
| 3062 | ;; Useful mmx/sse2 instructions, other than movd/movq:
|
|---|
| 3063 |
|
|---|
| 3064 | ;; emms
|
|---|
| 3065 | (def-x8664-opcode emms ()
|
|---|
| 3066 | #x0f77 nil nil)
|
|---|
| 3067 |
|
|---|
| 3068 | ;; addsd
|
|---|
| 3069 | (def-x8664-opcode addsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3070 | #x0f58 #o000 #x0 #xf2)
|
|---|
| 3071 | (def-x8664-opcode addsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3072 | #x0f58 #o300 #x0 #xf2)
|
|---|
| 3073 |
|
|---|
| 3074 | ;; addss
|
|---|
| 3075 | (def-x8664-opcode addss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3076 | #x0f58 #o000 #x0 #xf3)
|
|---|
| 3077 | (def-x8664-opcode addss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3078 | #x0f58 #o300 #x0 #xf3)
|
|---|
| 3079 |
|
|---|
| 3080 | ;; subsd
|
|---|
| 3081 | (def-x8664-opcode subsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3082 | #x0f5c #o000 #x0 #xf2)
|
|---|
| 3083 | (def-x8664-opcode subsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3084 | #x0f5c #o300 #x0 #xf2)
|
|---|
| 3085 |
|
|---|
| 3086 | ;; subss
|
|---|
| 3087 | (def-x8664-opcode subss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3088 | #x0f5c #o000 #x0 #xf3)
|
|---|
| 3089 | (def-x8664-opcode subss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3090 | #x0f5c #o300 #x0 #xf3)
|
|---|
| 3091 |
|
|---|
| 3092 | ;; movapd
|
|---|
| 3093 | (def-x8664-opcode movapd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3094 | #x0f28 #o300 #x0 #x66)
|
|---|
| 3095 | (def-x8664-opcode movapd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3096 | #x0f28 #o000 #x0 #x66)
|
|---|
| 3097 | (def-x8664-opcode movapd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
|
|---|
| 3098 | #x0f29 #o000 #x0 #x66)
|
|---|
| 3099 |
|
|---|
| 3100 | ;; mulsd
|
|---|
| 3101 | (def-x8664-opcode mulsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3102 | #x0f59 #o000 #x0 #xf2)
|
|---|
| 3103 | (def-x8664-opcode mulsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3104 | #x0f59 #o300 #x0 #xf2)
|
|---|
| 3105 |
|
|---|
| 3106 | ;; mulss
|
|---|
| 3107 | (def-x8664-opcode mulss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3108 | #x0f59 #o000 #x0 #xf3)
|
|---|
| 3109 | (def-x8664-opcode mulss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3110 | #x0f59 #o300 #x0 #xf3)
|
|---|
| 3111 |
|
|---|
| 3112 | ;; divsd
|
|---|
| 3113 | (def-x8664-opcode divsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3114 | #x0f5e #o000 #x0 #xf2)
|
|---|
| 3115 | (def-x8664-opcode divsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3116 | #x0f5e #o300 #x0 #xf2)
|
|---|
| 3117 |
|
|---|
| 3118 | ;; divss
|
|---|
| 3119 | (def-x8664-opcode divss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3120 | #x0f5e #o000 #x0 #xf3)
|
|---|
| 3121 | (def-x8664-opcode divss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3122 | #x0f5e #o300 #x0 #xf3)
|
|---|
| 3123 |
|
|---|
| 3124 |
|
|---|
| 3125 | ;; sqrtsd
|
|---|
| 3126 | (def-x8664-opcode sqrtsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3127 | #x0f51 #o000 #x0 #xf2)
|
|---|
| 3128 | (def-x8664-opcode sqrtsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3129 | #x0f51 #o300 #x0 #xf2)
|
|---|
| 3130 |
|
|---|
| 3131 | ;; sqrtss
|
|---|
| 3132 | (def-x8664-opcode sqrtss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3133 | #x0f51 #o000 #x0 #xf3)
|
|---|
| 3134 | (def-x8664-opcode sqrtss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3135 | #x0f51 #o300 #x0 #xf3)
|
|---|
| 3136 |
|
|---|
| 3137 | ;; comisd
|
|---|
| 3138 | (def-x8664-opcode comisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3139 | #x0f2f #o000 #x0 #x66)
|
|---|
| 3140 | (def-x8664-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3141 | #x0f2f #o300 #x0 #x66)
|
|---|
| 3142 |
|
|---|
| 3143 | ;; ucomisd
|
|---|
| 3144 | (def-x8664-opcode ucomisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3145 | #x0f2e #o000 #x0 #x66)
|
|---|
| 3146 | (def-x8664-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3147 | #x0f2e #o300 #x0 u#x66)
|
|---|
| 3148 |
|
|---|
| 3149 |
|
|---|
| 3150 | ;; comiss
|
|---|
| 3151 | (def-x8664-opcode comiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3152 | #x0f2f #o000 #x0)
|
|---|
| 3153 | (def-x8664-opcode comiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3154 | #x0f2f #o300 #x0)
|
|---|
| 3155 |
|
|---|
| 3156 | ;; ucomiss
|
|---|
| 3157 | (def-x8664-opcode ucomiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3158 | #x0f2e #o000 #x0)
|
|---|
| 3159 | (def-x8664-opcode ucomiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3160 | #x0f2e #o300 #x0)
|
|---|
| 3161 |
|
|---|
| 3162 | ;; movsd
|
|---|
| 3163 | (def-x8664-opcode movsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3164 | #x0f10 #o300 #x0 #xf2)
|
|---|
| 3165 | (def-x8664-opcode movsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3166 | #x0f10 #o300 #x0 #xf2)
|
|---|
| 3167 | (def-x8664-opcode movsd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
|
|---|
| 3168 | #x0f11 #o000 #x0 #xf2)
|
|---|
| 3169 |
|
|---|
| 3170 |
|
|---|
| 3171 |
|
|---|
| 3172 | ;; movss
|
|---|
| 3173 | (def-x8664-opcode movss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3174 | #x0f10 #o300 #x0 #xf3)
|
|---|
| 3175 | (def-x8664-opcode movss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3176 | #x0f10 #o300 #x0 #xf3)
|
|---|
| 3177 | (def-x8664-opcode movss ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
|
|---|
| 3178 | #x0f11 #o000 #x0 #xf3)
|
|---|
| 3179 |
|
|---|
| 3180 |
|
|---|
| 3181 | ;;; cvtsd2si. This does rounding (as opposed to truncation).
|
|---|
| 3182 | (def-x8664-opcode cvtsd2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 3183 | #x0f2d #o300 #x48 #xf2)
|
|---|
| 3184 | (def-x8664-opcode cvtsd2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 3185 | #x0f2d #o000 #x48 #xf2)
|
|---|
| 3186 | (def-x8664-opcode cvtsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 3187 | #x0f2d #o300 #x00 #xf2)
|
|---|
| 3188 | (def-x8664-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 3189 | #x0f2d #o000 #x00 #xf2)
|
|---|
| 3190 |
|
|---|
| 3191 | ;;; cvtss2si. This does rounding (as opposed to truncation).
|
|---|
| 3192 | (def-x8664-opcode cvtss2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 3193 | #x0f2d #o300 #x48 #xf3)
|
|---|
| 3194 | (def-x8664-opcode cvtss2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 3195 | #x0f2d #o000 #x48 #xf3)
|
|---|
| 3196 | (def-x8664-opcode cvtss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 3197 | #x0f2d #o300 #x00 #xf3)
|
|---|
| 3198 | (def-x8664-opcode cvtss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 3199 | #x0f2d #o000 #x00 #xf3)
|
|---|
| 3200 |
|
|---|
| 3201 | ;;; cvttsd2si. This does truncation (as opposed to rounding).
|
|---|
| 3202 | (def-x8664-opcode cvttsd2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 3203 | #x0f2c #o300 #x48 #xf2)
|
|---|
| 3204 | (def-x8664-opcode cvttsd2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 3205 | #x0f2c #o000 #x48 #xf2)
|
|---|
| 3206 | (def-x8664-opcode cvttsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 3207 | #x0f2c #o300 #x00 #xf2)
|
|---|
| 3208 | (def-x8664-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 3209 | #x0f2c #o000 #x00 #xf2)
|
|---|
| 3210 |
|
|---|
| 3211 | ;;; cvtss2si. This does rounding (as opposed to truncation).
|
|---|
| 3212 | (def-x8664-opcode cvttss2siq ((:regxmm :insert-xmm-rm) (:reg64 :insert-modrm-reg))
|
|---|
| 3213 | #x0f2c #o300 #x48 #xf3)
|
|---|
| 3214 | (def-x8664-opcode cvttss2siq ((:anymem :insert-memory) (:reg64 :insert-modrm-reg))
|
|---|
| 3215 | #x0f2c #o000 #x48 #xf3)
|
|---|
| 3216 | (def-x8664-opcode cvttss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg))
|
|---|
| 3217 | #x0f2d #o300 #x00 #xf3)
|
|---|
| 3218 | (def-x8664-opcode cvttss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg))
|
|---|
| 3219 | #x0f2c #o000 #x00 #xf3)
|
|---|
| 3220 |
|
|---|
| 3221 | ;; cvtsi2sd
|
|---|
| 3222 | (def-x8664-opcode cvtsi2sdq ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3223 | #x0f2a #o300 #x48 #xf2)
|
|---|
| 3224 | (def-x8664-opcode cvtsi2sdq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3225 | #x0f2a #o000 #x48 #xf2)
|
|---|
| 3226 | (def-x8664-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3227 | #x0f2a #o300 #x00 #xf2)
|
|---|
| 3228 | (def-x8664-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3229 | #x0f2a #o000 #x00 #xf2)
|
|---|
| 3230 |
|
|---|
| 3231 | ;; cvtsd2ss
|
|---|
| 3232 | (def-x8664-opcode cvtsd2ss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3233 | #x0f5a #o300 #x0 #xf2)
|
|---|
| 3234 | (def-x8664-opcode cvtsd2ss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3235 | #x0f5a #o000 #x0 #xf2)
|
|---|
| 3236 |
|
|---|
| 3237 | ;; cvtsi2sd
|
|---|
| 3238 | (def-x8664-opcode cvtsi2sdq ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3239 | #x0f2a #o300 #x48 #xf2)
|
|---|
| 3240 | (def-x8664-opcode cvtsi2sdq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3241 | #x0f2a #o000 #x48 #xf2)
|
|---|
| 3242 | (def-x8664-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3243 | #x0f2a #o300 #x00 #xf2)
|
|---|
| 3244 | (def-x8664-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3245 | #x0f2a #o000 #x00 #xf2)
|
|---|
| 3246 |
|
|---|
| 3247 | ;; cvtsi2ss
|
|---|
| 3248 | (def-x8664-opcode cvtsi2ssq ((:reg64 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3249 | #x0f2a #o300 #x48 #xf3)
|
|---|
| 3250 | (def-x8664-opcode cvtsi2ssq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3251 | #x0f2a #o000 #x48 #xf3)
|
|---|
| 3252 | (def-x8664-opcode cvtsi2ssl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3253 | #x0f2a #o300 #x00 #xf3)
|
|---|
| 3254 | (def-x8664-opcode cvtsi2ssl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3255 | #x0f2a #o000 #x00 #xf3)
|
|---|
| 3256 |
|
|---|
| 3257 | ;;; cvtss2sd
|
|---|
| 3258 | (def-x8664-opcode cvtss2sd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg))
|
|---|
| 3259 | #x0f5a #o300 #x0 #xf3)
|
|---|
| 3260 | (def-x8664-opcode cvtss2sd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
|
|---|
| 3261 | #x0f5a #o000 #x0 #xf3)
|
|---|
| 3262 |
|
|---|
| 3263 | ;; pand
|
|---|
| 3264 | (def-x8664-opcode pand ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 3265 | #x0fdb #o300 #x0)
|
|---|
| 3266 | (def-x8664-opcode pand ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 3267 | #x0fdb #o000 #x0)
|
|---|
| 3268 | (def-x8664-opcode pand ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
|
|---|
| 3269 | #x0fef #o300 #x0 #x66)
|
|---|
| 3270 | (def-x8664-opcode pand ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
|
|---|
| 3271 | #x0fdb #o000 #x0 #x66)
|
|---|
| 3272 |
|
|---|
| 3273 | ;; pandn
|
|---|
| 3274 | (def-x8664-opcode pandn ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 3275 | #x0fdf #o300 #x0)
|
|---|
| 3276 | (def-x8664-opcode pandn ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 3277 | #x0fdf #o000 #x0)
|
|---|
| 3278 | (def-x8664-opcode pandn ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
|
|---|
| 3279 | #x0fdf #o300 #x0 #x66)
|
|---|
| 3280 | (def-x8664-opcode pandn ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
|
|---|
| 3281 | #x0fdf #o000 #x0 #x66)
|
|---|
| 3282 |
|
|---|
| 3283 | ;; por
|
|---|
| 3284 | (def-x8664-opcode por ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 3285 | #x0feb #o300 #x0)
|
|---|
| 3286 | (def-x8664-opcode por ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 3287 | #x0feb #o000 #x0)
|
|---|
| 3288 | (def-x8664-opcode por ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
|
|---|
| 3289 | #x0feb #o300 #x0 #x66)
|
|---|
| 3290 | (def-x8664-opcode por ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
|
|---|
| 3291 | #x0feb #o000 #x0 #x66)
|
|---|
| 3292 |
|
|---|
| 3293 | ;; pxor
|
|---|
| 3294 | (def-x8664-opcode pxor ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 3295 | #x0fef #o300 #x0)
|
|---|
| 3296 | (def-x8664-opcode pxor ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 3297 | #x0fef #o000 #x0)
|
|---|
| 3298 | (def-x8664-opcode pxor ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
|
|---|
| 3299 | #x0fef #o300 #x0 #x66)
|
|---|
| 3300 | (def-x8664-opcode pxor ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
|
|---|
| 3301 | #x0fef #o000 #x0 #x66)
|
|---|
| 3302 |
|
|---|
| 3303 | ;; psllq
|
|---|
| 3304 | (def-x8664-opcode psllq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 3305 | #x0ff3 #o300 #x0)
|
|---|
| 3306 | (def-x8664-opcode psllq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 3307 | #x0ff3 #o000 #x0)
|
|---|
| 3308 | (def-x8664-opcode psllq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
|
|---|
| 3309 | #x0ff3 #o300 #x0 #x66)
|
|---|
| 3310 | (def-x8664-opcode psllq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
|
|---|
| 3311 | #x0ff3 #o000 #x0 #x66)
|
|---|
| 3312 | (def-x8664-opcode psllq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
|
|---|
| 3313 | #x0f73 #o360 #o0 #x66)
|
|---|
| 3314 |
|
|---|
| 3315 | ;; psllw
|
|---|
| 3316 |
|
|---|
| 3317 | ;; pslld
|
|---|
| 3318 |
|
|---|
| 3319 | ;; pslldq
|
|---|
| 3320 | (def-x8664-opcode pslldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
|
|---|
| 3321 | #x0f73 #o370 #x0 #x66)
|
|---|
| 3322 |
|
|---|
| 3323 | ;; psrlq
|
|---|
| 3324 | (def-x8664-opcode psrlq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg))
|
|---|
| 3325 | #x0fd3 #o300 #x0)
|
|---|
| 3326 | (def-x8664-opcode psrlq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg))
|
|---|
| 3327 | #x0fd3 #o000 #x0)
|
|---|
| 3328 | (def-x8664-opcode psrlq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg))
|
|---|
| 3329 | #x0fd3 #o300 #x0 #x66)
|
|---|
| 3330 | (def-x8664-opcode psrlq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg))
|
|---|
| 3331 | #x0fd3 #o000 #x0 #x66)
|
|---|
| 3332 | (def-x8664-opcode psrlq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
|
|---|
| 3333 | #x0f73 #o320 #o0 #x66)
|
|---|
| 3334 |
|
|---|
| 3335 | ;; psrld
|
|---|
| 3336 |
|
|---|
| 3337 | ;; psrldq
|
|---|
| 3338 | (def-x8664-opcode psrldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm))
|
|---|
| 3339 | #x0f73 #o330 #x0 #x66)
|
|---|
| 3340 |
|
|---|
| 3341 | ;; psrlw
|
|---|
| 3342 |
|
|---|
| 3343 | ;;; End of list of useful mmx instructions
|
|---|
| 3344 | (def-x8664-opcode ldmxcsr ((:anymem :insert-memory))
|
|---|
| 3345 | #x0fae #o020 nil)
|
|---|
| 3346 |
|
|---|
| 3347 | (def-x8664-opcode stmxcsr ((:anymem :insert-memory))
|
|---|
| 3348 | #x0fae #o030 nil)
|
|---|
| 3349 |
|
|---|
| 3350 | ;; UUOs. Expect lots more, some of which may take pseudo-operands.
|
|---|
| 3351 | (def-x8664-opcode uuo-error-slot-unbound ((:reg64 :insert-opcode-reg4)
|
|---|
| 3352 | (:reg64 :insert-reg4-pseudo-rm-high)
|
|---|
| 3353 | (:reg64 :insert-reg4-pseudo-rm-low))
|
|---|
| 3354 | #xcd70 0 nil)
|
|---|
| 3355 |
|
|---|
| 3356 | ;;; DON'T use #xcd8x: doing so will make Mach angry and confused.
|
|---|
| 3357 |
|
|---|
| 3358 | (def-x8664-opcode uuo-error-unbound ((:reg64 :insert-opcode-reg4))
|
|---|
| 3359 | #xcd90 nil 0)
|
|---|
| 3360 |
|
|---|
| 3361 | (def-x8664-opcode uuo-error-udf ((:reg64 :insert-opcode-reg4))
|
|---|
| 3362 | #xcda0 nil 0)
|
|---|
| 3363 |
|
|---|
| 3364 | (def-x8664-opcode uuo-error-reg-not-type ((:reg64 :insert-opcode-reg4) (:imm8 :insert-imm8))
|
|---|
| 3365 | #xcdb0 nil 0)
|
|---|
| 3366 |
|
|---|
| 3367 | (def-x8664-opcode uuo-error-too-few-args ()
|
|---|
| 3368 | #xcdc0 nil nil)
|
|---|
| 3369 | (def-x8664-opcode uuo-error-too-many-args ()
|
|---|
| 3370 | #xcdc1 nil nil)
|
|---|
| 3371 | (def-x8664-opcode uuo-error-wrong-number-of-args ()
|
|---|
| 3372 | #xcdc2 nil nil)
|
|---|
| 3373 | (def-x8664-opcode uuo-error-array-rank ((:reg64 :insert-reg4-pseudo-rm-high)
|
|---|
| 3374 | (:reg64 :insert-reg4-pseudo-rm-low))
|
|---|
| 3375 | #xcdc3 0 nil)
|
|---|
| 3376 |
|
|---|
| 3377 | (def-x8664-opcode uuo-gc-trap ()
|
|---|
| 3378 | #xcdc4 nil nil)
|
|---|
| 3379 | (def-x8664-opcode uuo-alloc ()
|
|---|
| 3380 | #xcdc5 nil nil)
|
|---|
| 3381 | (def-x8664-opcode uuo-error-not-callable ()
|
|---|
| 3382 | #xcdc6 nil nil)
|
|---|
| 3383 | (def-x8664-opcode uuo-error-udf-call ()
|
|---|
| 3384 | #xcdc7 nil nil)
|
|---|
| 3385 |
|
|---|
| 3386 | (def-x8664-opcode uuo-error-vector-bounds ((:reg64 :insert-reg4-pseudo-rm-high) (:reg64 :insert-reg4-pseudo-rm-low))
|
|---|
| 3387 | #xcdc8 0 nil)
|
|---|
| 3388 |
|
|---|
| 3389 | (def-x8664-opcode uuo-error-call-macro-or-special-operator ()
|
|---|
| 3390 | #xcdc9 nil nil)
|
|---|
| 3391 |
|
|---|
| 3392 | (def-x8664-opcode uuo-error-debug-trap ()
|
|---|
| 3393 | #xcdca nil nil)
|
|---|
| 3394 |
|
|---|
| 3395 | (def-x8664-opcode uuo-error-array-bounds ((:reg64 :insert-reg4-pseudo-rm-high) (:reg64 :insert-reg4-pseudo-rm-low))
|
|---|
| 3396 | #xcdcb 0 nil)
|
|---|
| 3397 |
|
|---|
| 3398 | (def-x8664-opcode uuo-error-eep-unresolved ((:reg64 :insert-reg4-pseudo-rm-high)
|
|---|
| 3399 | (:reg64 :insert-reg4-pseudo-rm-low))
|
|---|
| 3400 | #xcdcc 0 nil)
|
|---|
| 3401 |
|
|---|
| 3402 | (def-x8664-opcode uuo-error-debug-trap-with-string ()
|
|---|
| 3403 | #xcdcd nil nil)
|
|---|
| 3404 |
|
|---|
| 3405 | (def-x8664-opcode uuo-error-reg-not-tag ((:reg64 :insert-opcode-reg4) (:imm8 :insert-imm8))
|
|---|
| 3406 | #xcdd0 nil 0)
|
|---|
| 3407 | (def-x8664-opcode uuo-error-reg-not-list ((:reg64 :insert-opcode-reg4))
|
|---|
| 3408 | #xcde0 nil 0)
|
|---|
| 3409 | (def-x8664-opcode uuo-error-reg-not-fixnum ((:reg64 :insert-opcode-reg4))
|
|---|
| 3410 | #xcdf0 nil 0)
|
|---|
| 3411 |
|
|---|
| 3412 | ))
|
|---|
| 3413 |
|
|---|
| 3414 | (dotimes (i (length *x8664-opcode-templates*))
|
|---|
| 3415 | (setf (x86-opcode-template-ordinal (svref *x8664-opcode-templates* i)) i))
|
|---|
| 3416 |
|
|---|
| 3417 |
|
|---|
| 3418 |
|
|---|
| 3419 | (defparameter *x86-32-opcode-template-lists*
|
|---|
| 3420 | (make-hash-table :test #'equalp))
|
|---|
| 3421 |
|
|---|
| 3422 |
|
|---|
| 3423 | (defparameter *x86-64-opcode-template-lists*
|
|---|
| 3424 | (make-hash-table :test #'equalp))
|
|---|
| 3425 |
|
|---|
| 3426 |
|
|---|
| 3427 | (defun initialize-x86-opcode-templates ()
|
|---|
| 3428 | (flet ((setup-templates-hash (hash templates)
|
|---|
| 3429 | (clrhash hash)
|
|---|
| 3430 | (do* ((i (1- (length templates)) (1- i)))
|
|---|
| 3431 | ((< i 0) hash)
|
|---|
| 3432 | (declare (fixnum i))
|
|---|
| 3433 | (let* ((template (svref templates i))
|
|---|
| 3434 | (name (x86-opcode-template-mnemonic template)))
|
|---|
| 3435 | (push template (gethash name hash))))))
|
|---|
| 3436 | #+notyet
|
|---|
| 3437 | (setup-templates-hash
|
|---|
| 3438 | *x86-32-opcode-template-lists*
|
|---|
| 3439 | *x8632-opcode-templates*)
|
|---|
| 3440 | (setup-templates-hash
|
|---|
| 3441 | *x86-64-opcode-template-lists*
|
|---|
| 3442 | *x8664-opcode-templates*)
|
|---|
| 3443 | #+x8664-target
|
|---|
| 3444 | (when (fboundp 'ccl::fixup-x86-vinsn-templates)
|
|---|
| 3445 | (ccl::fixup-x86-vinsn-templates
|
|---|
| 3446 | (ccl::backend-p2-vinsn-templates ccl::*target-backend*)
|
|---|
| 3447 | *x86-64-opcode-template-lists*))
|
|---|
| 3448 | t))
|
|---|
| 3449 |
|
|---|
| 3450 | (defparameter *x86-opcode-template-lists* ())
|
|---|
| 3451 |
|
|---|
| 3452 | (defvar *x8632-registers* (make-hash-table :test #'equalp))
|
|---|
| 3453 | (defvar *x8664-registers* (make-hash-table :test #'equalp))
|
|---|
| 3454 | (defvar *x86-registers* nil)
|
|---|
| 3455 |
|
|---|
| 3456 | (defparameter *x86-32-operand-insert-functions*
|
|---|
| 3457 | #(tbd))
|
|---|
| 3458 |
|
|---|
| 3459 | (defparameter *x86-64-operand-insert-functions*
|
|---|
| 3460 | #(insert-nothing
|
|---|
| 3461 | insert-modrm-reg
|
|---|
| 3462 | insert-modrm-rm
|
|---|
| 3463 | insert-memory
|
|---|
| 3464 | insert-opcode-reg
|
|---|
| 3465 | insert-opcode-reg4
|
|---|
| 3466 | insert-cc
|
|---|
| 3467 | insert-label
|
|---|
| 3468 | insert-imm8-for-int
|
|---|
| 3469 | insert-extra
|
|---|
| 3470 | insert-imm8
|
|---|
| 3471 | insert-imm8s
|
|---|
| 3472 | insert-imm16
|
|---|
| 3473 | insert-imm32s
|
|---|
| 3474 | insert-imm32
|
|---|
| 3475 | insert-imm64
|
|---|
| 3476 | insert-mmx-reg
|
|---|
| 3477 | insert-mmx-rm
|
|---|
| 3478 | insert-xmm-reg
|
|---|
| 3479 | insert-xmm-rm
|
|---|
| 3480 | insert-reg4-pseudo-rm-high
|
|---|
| 3481 | insert-reg4-pseudo-rm-low))
|
|---|
| 3482 |
|
|---|
| 3483 | (defvar *x86-operand-insert-functions* ())
|
|---|
| 3484 |
|
|---|
| 3485 | (defun setup-x86-assembler (&optional (cpu :x86-64))
|
|---|
| 3486 | (initialize-x86-opcode-templates)
|
|---|
| 3487 | (ecase cpu
|
|---|
| 3488 | (:x86-32 (setq *x86-opcode-template-lists*
|
|---|
| 3489 | *x86-32-opcode-template-lists*
|
|---|
| 3490 | *x86-registers* *x8632-registers*
|
|---|
| 3491 | *x86-operand-insert-functions*
|
|---|
| 3492 | *x86-32-operand-insert-functions*
|
|---|
| 3493 | ))
|
|---|
| 3494 | (:x86-64 (setq *x86-opcode-template-lists*
|
|---|
| 3495 | *x86-64-opcode-template-lists*
|
|---|
| 3496 | *x86-registers* *x8664-registers*
|
|---|
| 3497 | *x86-operand-insert-functions*
|
|---|
| 3498 | *x86-64-operand-insert-functions*)))
|
|---|
| 3499 | t)
|
|---|
| 3500 |
|
|---|
| 3501 | (setup-x86-assembler :x86-64)
|
|---|
| 3502 |
|
|---|
| 3503 |
|
|---|
| 3504 |
|
|---|
| 3505 | ;;; 386 register table.
|
|---|
| 3506 |
|
|---|
| 3507 | (eval-when (:compile-toplevel :load-toplevel :execute)
|
|---|
| 3508 |
|
|---|
| 3509 | (defconstant +REGNAM-AL+ 1) ; Entry in i386-regtab.
|
|---|
| 3510 | (defconstant +REGNAM-AX+ 25)
|
|---|
| 3511 | (defconstant +REGNAM-EAX+ 41)
|
|---|
| 3512 |
|
|---|
| 3513 | (defvar *x86-regtab*
|
|---|
| 3514 | (vector
|
|---|
| 3515 | ;; Make %st first as we test for it.
|
|---|
| 3516 | (make-reg-entry :reg-name "st"
|
|---|
| 3517 | :reg-type (encode-operand-type :FloatReg :floatacc)
|
|---|
| 3518 | :reg-flags 0
|
|---|
| 3519 | :reg-num 0 )
|
|---|
| 3520 | ;; 8 bit regs
|
|---|
| 3521 | (make-reg-entry :reg-name "al"
|
|---|
| 3522 | :reg-type (encode-operand-type :Reg8 :Acc)
|
|---|
| 3523 | :reg-flags 0
|
|---|
| 3524 | :reg-num 0 )
|
|---|
| 3525 | (make-reg-entry :reg-name "cl"
|
|---|
| 3526 | :reg-type (encode-operand-type :Reg8 :ShiftCount)
|
|---|
| 3527 | :reg-flags 0
|
|---|
| 3528 | :reg-num 1)
|
|---|
| 3529 | (make-reg-entry :reg-name "dl"
|
|---|
| 3530 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3531 | :reg-flags 0
|
|---|
| 3532 | :reg-num 2)
|
|---|
| 3533 | (make-reg-entry :reg-name "bl"
|
|---|
| 3534 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3535 | :reg-flags 0
|
|---|
| 3536 | :reg-num 3)
|
|---|
| 3537 | (make-reg-entry :reg-name "ah"
|
|---|
| 3538 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3539 | :reg-flags 0
|
|---|
| 3540 | :reg-num 4)
|
|---|
| 3541 | (make-reg-entry :reg-name "ch"
|
|---|
| 3542 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3543 | :reg-flags 0
|
|---|
| 3544 | :reg-num 5)
|
|---|
| 3545 | (make-reg-entry :reg-name "dh"
|
|---|
| 3546 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3547 | :reg-flags 0
|
|---|
| 3548 | :reg-num 6)
|
|---|
| 3549 | (make-reg-entry :reg-name "bh"
|
|---|
| 3550 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3551 | :reg-flags 0
|
|---|
| 3552 | :reg-num 7)
|
|---|
| 3553 | (make-reg-entry :reg-name "axl"
|
|---|
| 3554 | :reg-type (encode-operand-type :Reg8 :Acc)
|
|---|
| 3555 | :reg-flags +RegRex64+
|
|---|
| 3556 | :reg-num 0 ) ; Must be in the "al + 8" slot.
|
|---|
| 3557 | (make-reg-entry :reg-name "cxl"
|
|---|
| 3558 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3559 | :reg-flags +RegRex64+
|
|---|
| 3560 | :reg-num 1)
|
|---|
| 3561 | (make-reg-entry :reg-name "dxl"
|
|---|
| 3562 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3563 | :reg-flags +RegRex64+
|
|---|
| 3564 | :reg-num 2)
|
|---|
| 3565 | (make-reg-entry :reg-name "bxl"
|
|---|
| 3566 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3567 | :reg-flags +RegRex64+
|
|---|
| 3568 | :reg-num 3)
|
|---|
| 3569 | (make-reg-entry :reg-name "spl"
|
|---|
| 3570 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3571 | :reg-flags +RegRex64+
|
|---|
| 3572 | :reg-num 4)
|
|---|
| 3573 | (make-reg-entry :reg-name "bpl"
|
|---|
| 3574 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3575 | :reg-flags +RegRex64+
|
|---|
| 3576 | :reg-num 5)
|
|---|
| 3577 | (make-reg-entry :reg-name "sil"
|
|---|
| 3578 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3579 | :reg-flags +RegRex64+
|
|---|
| 3580 | :reg-num 6)
|
|---|
| 3581 | (make-reg-entry :reg-name "dil"
|
|---|
| 3582 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3583 | :reg-flags +RegRex64+
|
|---|
| 3584 | :reg-num 7)
|
|---|
| 3585 | (make-reg-entry :reg-name "r8b"
|
|---|
| 3586 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3587 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3588 | :reg-num 0 )
|
|---|
| 3589 | (make-reg-entry :reg-name "r9b"
|
|---|
| 3590 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3591 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3592 | :reg-num 1)
|
|---|
| 3593 | (make-reg-entry :reg-name "r10b"
|
|---|
| 3594 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3595 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3596 | :reg-num 2)
|
|---|
| 3597 | (make-reg-entry :reg-name "r11b"
|
|---|
| 3598 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3599 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3600 | :reg-num 3)
|
|---|
| 3601 | (make-reg-entry :reg-name "r12b"
|
|---|
| 3602 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3603 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3604 | :reg-num 4)
|
|---|
| 3605 | (make-reg-entry :reg-name "r13b"
|
|---|
| 3606 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3607 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3608 | :reg-num 5)
|
|---|
| 3609 | (make-reg-entry :reg-name "r14b"
|
|---|
| 3610 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3611 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3612 | :reg-num 6)
|
|---|
| 3613 | (make-reg-entry :reg-name "r15b"
|
|---|
| 3614 | :reg-type (encode-operand-type :Reg8)
|
|---|
| 3615 | :reg-flags (logior +RegRex64+ +RegRex+)
|
|---|
| 3616 | :reg-num 7)
|
|---|
| 3617 | ;; 16 bit regs
|
|---|
| 3618 | (make-reg-entry :reg-name "ax"
|
|---|
| 3619 | :reg-type (encode-operand-type :Reg16 :Acc)
|
|---|
| 3620 | :reg-flags 0
|
|---|
| 3621 | :reg-num 0 )
|
|---|
| 3622 | (make-reg-entry :reg-name "cx"
|
|---|
| 3623 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3624 | :reg-flags 0
|
|---|
| 3625 | :reg-num 1)
|
|---|
| 3626 | (make-reg-entry :reg-name "dx"
|
|---|
| 3627 | :reg-type (encode-operand-type :Reg16 :InOutPortReg)
|
|---|
| 3628 | :reg-flags 0
|
|---|
| 3629 | :reg-num 2)
|
|---|
| 3630 | (make-reg-entry :reg-name "bx"
|
|---|
| 3631 | :reg-type (encode-operand-type :Reg16 :BaseIndex)
|
|---|
| 3632 | :reg-flags 0
|
|---|
| 3633 | :reg-num 3)
|
|---|
| 3634 | (make-reg-entry :reg-name "sp"
|
|---|
| 3635 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3636 | :reg-flags 0
|
|---|
| 3637 | :reg-num 4)
|
|---|
| 3638 | (make-reg-entry :reg-name "bp"
|
|---|
| 3639 | :reg-type (encode-operand-type :Reg16 :BaseIndex)
|
|---|
| 3640 | :reg-flags 0
|
|---|
| 3641 | :reg-num 5)
|
|---|
| 3642 | (make-reg-entry :reg-name "si"
|
|---|
| 3643 | :reg-type (encode-operand-type :Reg16 :BaseIndex)
|
|---|
| 3644 | :reg-flags 0
|
|---|
| 3645 | :reg-num 6)
|
|---|
| 3646 | (make-reg-entry :reg-name "di"
|
|---|
| 3647 | :reg-type (encode-operand-type :Reg16 :BaseIndex)
|
|---|
| 3648 | :reg-flags 0
|
|---|
| 3649 | :reg-num 7)
|
|---|
| 3650 | (make-reg-entry :reg-name "r8w"
|
|---|
| 3651 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3652 | :reg-flags +RegRex+
|
|---|
| 3653 | :reg-num 0 )
|
|---|
| 3654 | (make-reg-entry :reg-name "r9w"
|
|---|
| 3655 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3656 | :reg-flags +RegRex+
|
|---|
| 3657 | :reg-num 1)
|
|---|
| 3658 | (make-reg-entry :reg-name "r10w"
|
|---|
| 3659 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3660 | :reg-flags +RegRex+
|
|---|
| 3661 | :reg-num 2)
|
|---|
| 3662 | (make-reg-entry :reg-name "r11w"
|
|---|
| 3663 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3664 | :reg-flags +RegRex+
|
|---|
| 3665 | :reg-num 3)
|
|---|
| 3666 | (make-reg-entry :reg-name "r12w"
|
|---|
| 3667 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3668 | :reg-flags +RegRex+
|
|---|
| 3669 | :reg-num 4)
|
|---|
| 3670 | (make-reg-entry :reg-name "r13w"
|
|---|
| 3671 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3672 | :reg-flags +RegRex+
|
|---|
| 3673 | :reg-num 5)
|
|---|
| 3674 | (make-reg-entry :reg-name "r14w"
|
|---|
| 3675 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3676 | :reg-flags +RegRex+
|
|---|
| 3677 | :reg-num 6)
|
|---|
| 3678 | (make-reg-entry :reg-name "r15w"
|
|---|
| 3679 | :reg-type (encode-operand-type :Reg16)
|
|---|
| 3680 | :reg-flags +RegRex+
|
|---|
| 3681 | :reg-num 7)
|
|---|
| 3682 | ; 32 bit regs
|
|---|
| 3683 | (make-reg-entry :reg-name "eax"
|
|---|
| 3684 | :reg-type (encode-operand-type :Reg32 :BaseIndex :Acc)
|
|---|
| 3685 | :reg-flags 0
|
|---|
| 3686 | :reg-num 0 ) ; Must be in ax + 16 slot.
|
|---|
| 3687 | (make-reg-entry :reg-name "ecx"
|
|---|
| 3688 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3689 | :reg-flags 0
|
|---|
| 3690 | :reg-num 1)
|
|---|
| 3691 | (make-reg-entry :reg-name "edx"
|
|---|
| 3692 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3693 | :reg-flags 0
|
|---|
| 3694 | :reg-num 2)
|
|---|
| 3695 | (make-reg-entry :reg-name "ebx"
|
|---|
| 3696 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3697 | :reg-flags 0
|
|---|
| 3698 | :reg-num 3)
|
|---|
| 3699 | (make-reg-entry :reg-name "esp"
|
|---|
| 3700 | :reg-type (encode-operand-type :Reg32)
|
|---|
| 3701 | :reg-flags 0
|
|---|
| 3702 | :reg-num 4)
|
|---|
| 3703 | (make-reg-entry :reg-name "ebp"
|
|---|
| 3704 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3705 | :reg-flags 0
|
|---|
| 3706 | :reg-num 5)
|
|---|
| 3707 | (make-reg-entry :reg-name "esi"
|
|---|
| 3708 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3709 | :reg-flags 0
|
|---|
| 3710 | :reg-num 6)
|
|---|
| 3711 | (make-reg-entry :reg-name "edi"
|
|---|
| 3712 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3713 | :reg-flags 0
|
|---|
| 3714 | :reg-num 7)
|
|---|
| 3715 | (make-reg-entry :reg-name "r8d"
|
|---|
| 3716 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3717 | :reg-flags +RegRex+
|
|---|
| 3718 | :reg-num 0 )
|
|---|
| 3719 | (make-reg-entry :reg-name "r9d"
|
|---|
| 3720 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3721 | :reg-flags +RegRex+
|
|---|
| 3722 | :reg-num 1)
|
|---|
| 3723 | (make-reg-entry :reg-name "r10d"
|
|---|
| 3724 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3725 | :reg-flags +RegRex+
|
|---|
| 3726 | :reg-num 2)
|
|---|
| 3727 | (make-reg-entry :reg-name "r11d"
|
|---|
| 3728 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3729 | :reg-flags +RegRex+
|
|---|
| 3730 | :reg-num 3)
|
|---|
| 3731 | (make-reg-entry :reg-name "r12d"
|
|---|
| 3732 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3733 | :reg-flags +RegRex+
|
|---|
| 3734 | :reg-num 4)
|
|---|
| 3735 | (make-reg-entry :reg-name "r13d"
|
|---|
| 3736 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3737 | :reg-flags +RegRex+
|
|---|
| 3738 | :reg-num 5)
|
|---|
| 3739 | (make-reg-entry :reg-name "r14d"
|
|---|
| 3740 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3741 | :reg-flags +RegRex+
|
|---|
| 3742 | :reg-num 6)
|
|---|
| 3743 | (make-reg-entry :reg-name "r15d"
|
|---|
| 3744 | :reg-type (encode-operand-type :Reg32 :BaseIndex)
|
|---|
| 3745 | :reg-flags +RegRex+
|
|---|
| 3746 | :reg-num 7)
|
|---|
| 3747 | (make-reg-entry :reg-name "rax"
|
|---|
| 3748 | :reg-type (encode-operand-type :Reg64 :BaseIndex :Acc)
|
|---|
| 3749 | :reg-flags 0
|
|---|
| 3750 | :reg-num 0 )
|
|---|
| 3751 | (make-reg-entry :reg-name "rcx"
|
|---|
| 3752 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3753 | :reg-flags 0
|
|---|
| 3754 | :reg-num 1)
|
|---|
| 3755 | (make-reg-entry :reg-name "rdx"
|
|---|
| 3756 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3757 | :reg-flags 0
|
|---|
| 3758 | :reg-num 2)
|
|---|
| 3759 | (make-reg-entry :reg-name "rbx"
|
|---|
| 3760 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3761 | :reg-flags 0
|
|---|
| 3762 | :reg-num 3)
|
|---|
| 3763 | (make-reg-entry :reg-name "rsp"
|
|---|
| 3764 | :reg-type (encode-operand-type :Reg64)
|
|---|
| 3765 | :reg-flags 0
|
|---|
| 3766 | :reg-num 4)
|
|---|
| 3767 | (make-reg-entry :reg-name "rbp"
|
|---|
| 3768 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3769 | :reg-flags 0
|
|---|
| 3770 | :reg-num 5)
|
|---|
| 3771 | (make-reg-entry :reg-name "rsi"
|
|---|
| 3772 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3773 | :reg-flags 0
|
|---|
| 3774 | :reg-num 6)
|
|---|
| 3775 | (make-reg-entry :reg-name "rdi"
|
|---|
| 3776 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3777 | :reg-flags 0
|
|---|
| 3778 | :reg-num 7)
|
|---|
| 3779 | (make-reg-entry :reg-name "r8"
|
|---|
| 3780 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3781 | :reg-flags +RegRex+
|
|---|
| 3782 | :reg-num 0 )
|
|---|
| 3783 | (make-reg-entry :reg-name "r9"
|
|---|
| 3784 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3785 | :reg-flags +RegRex+
|
|---|
| 3786 | :reg-num 1)
|
|---|
| 3787 | (make-reg-entry :reg-name "r10"
|
|---|
| 3788 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3789 | :reg-flags +RegRex+
|
|---|
| 3790 | :reg-num 2)
|
|---|
| 3791 | (make-reg-entry :reg-name "r11"
|
|---|
| 3792 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3793 | :reg-flags +RegRex+
|
|---|
| 3794 | :reg-num 3)
|
|---|
| 3795 | (make-reg-entry :reg-name "r12"
|
|---|
| 3796 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3797 | :reg-flags +RegRex+
|
|---|
| 3798 | :reg-num 4)
|
|---|
| 3799 | (make-reg-entry :reg-name "r13"
|
|---|
| 3800 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3801 | :reg-flags +RegRex+
|
|---|
| 3802 | :reg-num 5)
|
|---|
| 3803 | (make-reg-entry :reg-name "r14"
|
|---|
| 3804 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3805 | :reg-flags +RegRex+
|
|---|
| 3806 | :reg-num 6)
|
|---|
| 3807 | (make-reg-entry :reg-name "r15"
|
|---|
| 3808 | :reg-type (encode-operand-type :Reg64 :BaseIndex)
|
|---|
| 3809 | :reg-flags +RegRex+
|
|---|
| 3810 | :reg-num 7)
|
|---|
| 3811 | ; Segment registers.
|
|---|
| 3812 | (make-reg-entry :reg-name "es"
|
|---|
| 3813 | :reg-type (encode-operand-type :SReg2)
|
|---|
| 3814 | :reg-flags 0
|
|---|
| 3815 | :reg-num 0 )
|
|---|
| 3816 | (make-reg-entry :reg-name "cs"
|
|---|
| 3817 | :reg-type (encode-operand-type :SReg2)
|
|---|
| 3818 | :reg-flags 0
|
|---|
| 3819 | :reg-num 1)
|
|---|
| 3820 | (make-reg-entry :reg-name "ss"
|
|---|
| 3821 | :reg-type (encode-operand-type :SReg2)
|
|---|
| 3822 | :reg-flags 0
|
|---|
| 3823 | :reg-num 2)
|
|---|
| 3824 | (make-reg-entry :reg-name "ds"
|
|---|
| 3825 | :reg-type (encode-operand-type :SReg2)
|
|---|
| 3826 | :reg-flags 0
|
|---|
| 3827 | :reg-num 3)
|
|---|
| 3828 | (make-reg-entry :reg-name "fs"
|
|---|
| 3829 | :reg-type (encode-operand-type :SReg3)
|
|---|
| 3830 | :reg-flags 0
|
|---|
| 3831 | :reg-num 4)
|
|---|
| 3832 | (make-reg-entry :reg-name "gs"
|
|---|
| 3833 | :reg-type (encode-operand-type :SReg3)
|
|---|
| 3834 | :reg-flags 0
|
|---|
| 3835 | :reg-num 5)
|
|---|
| 3836 | ;; Control registers.
|
|---|
| 3837 | (make-reg-entry :reg-name "cr0"
|
|---|
| 3838 | :reg-type (encode-operand-type :Control)
|
|---|
| 3839 | :reg-flags 0
|
|---|
| 3840 | :reg-num 0 )
|
|---|
| 3841 | (make-reg-entry :reg-name "cr1"
|
|---|
| 3842 | :reg-type (encode-operand-type :Control)
|
|---|
| 3843 | :reg-flags 0
|
|---|
| 3844 | :reg-num 1)
|
|---|
| 3845 | (make-reg-entry :reg-name "cr2"
|
|---|
| 3846 | :reg-type (encode-operand-type :Control)
|
|---|
| 3847 | :reg-flags 0
|
|---|
| 3848 | :reg-num 2)
|
|---|
| 3849 | (make-reg-entry :reg-name "cr3"
|
|---|
| 3850 | :reg-type (encode-operand-type :Control)
|
|---|
| 3851 | :reg-flags 0
|
|---|
| 3852 | :reg-num 3)
|
|---|
| 3853 | (make-reg-entry :reg-name "cr4"
|
|---|
| 3854 | :reg-type (encode-operand-type :Control)
|
|---|
| 3855 | :reg-flags 0
|
|---|
| 3856 | :reg-num 4)
|
|---|
| 3857 | (make-reg-entry :reg-name "cr5"
|
|---|
| 3858 | :reg-type (encode-operand-type :Control)
|
|---|
| 3859 | :reg-flags 0
|
|---|
| 3860 | :reg-num 5)
|
|---|
| 3861 | (make-reg-entry :reg-name "cr6"
|
|---|
| 3862 | :reg-type (encode-operand-type :Control)
|
|---|
| 3863 | :reg-flags 0
|
|---|
| 3864 | :reg-num 6)
|
|---|
| 3865 | (make-reg-entry :reg-name "cr7"
|
|---|
| 3866 | :reg-type (encode-operand-type :Control)
|
|---|
| 3867 | :reg-flags 0
|
|---|
| 3868 | :reg-num 7)
|
|---|
| 3869 | (make-reg-entry :reg-name "cr8"
|
|---|
| 3870 | :reg-type (encode-operand-type :Control)
|
|---|
| 3871 | :reg-flags +RegRex+
|
|---|
| 3872 | :reg-num 0 )
|
|---|
| 3873 | (make-reg-entry :reg-name "cr9"
|
|---|
| 3874 | :reg-type (encode-operand-type :Control)
|
|---|
| 3875 | :reg-flags +RegRex+
|
|---|
| 3876 | :reg-num 1)
|
|---|
| 3877 | (make-reg-entry :reg-name "cr10"
|
|---|
| 3878 | :reg-type (encode-operand-type :Control)
|
|---|
| 3879 | :reg-flags +RegRex+
|
|---|
| 3880 | :reg-num 2)
|
|---|
| 3881 | (make-reg-entry :reg-name "cr11"
|
|---|
| 3882 | :reg-type (encode-operand-type :Control)
|
|---|
| 3883 | :reg-flags +RegRex+
|
|---|
| 3884 | :reg-num 3)
|
|---|
| 3885 | (make-reg-entry :reg-name "cr12"
|
|---|
| 3886 | :reg-type (encode-operand-type :Control)
|
|---|
| 3887 | :reg-flags +RegRex+
|
|---|
| 3888 | :reg-num 4)
|
|---|
| 3889 | (make-reg-entry :reg-name "cr13"
|
|---|
| 3890 | :reg-type (encode-operand-type :Control)
|
|---|
| 3891 | :reg-flags +RegRex+
|
|---|
| 3892 | :reg-num 5)
|
|---|
| 3893 | (make-reg-entry :reg-name "cr14"
|
|---|
| 3894 | :reg-type (encode-operand-type :Control)
|
|---|
| 3895 | :reg-flags +RegRex+
|
|---|
| 3896 | :reg-num 6)
|
|---|
| 3897 | (make-reg-entry :reg-name "cr15"
|
|---|
| 3898 | :reg-type (encode-operand-type :Control)
|
|---|
| 3899 | :reg-flags +RegRex+
|
|---|
| 3900 | :reg-num 7)
|
|---|
| 3901 | ;; Debug registers.
|
|---|
| 3902 | (make-reg-entry :reg-name "db0"
|
|---|
| 3903 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3904 | :reg-flags 0
|
|---|
| 3905 | :reg-num 0 )
|
|---|
| 3906 | (make-reg-entry :reg-name "db1"
|
|---|
| 3907 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3908 | :reg-flags 0
|
|---|
| 3909 | :reg-num 1)
|
|---|
| 3910 | (make-reg-entry :reg-name "db2"
|
|---|
| 3911 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3912 | :reg-flags 0
|
|---|
| 3913 | :reg-num 2)
|
|---|
| 3914 | (make-reg-entry :reg-name "db3"
|
|---|
| 3915 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3916 | :reg-flags 0
|
|---|
| 3917 | :reg-num 3)
|
|---|
| 3918 | (make-reg-entry :reg-name "db4"
|
|---|
| 3919 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3920 | :reg-flags 0
|
|---|
| 3921 | :reg-num 4)
|
|---|
| 3922 | (make-reg-entry :reg-name "db5"
|
|---|
| 3923 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3924 | :reg-flags 0
|
|---|
| 3925 | :reg-num 5)
|
|---|
| 3926 | (make-reg-entry :reg-name "db6"
|
|---|
| 3927 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3928 | :reg-flags 0
|
|---|
| 3929 | :reg-num 6)
|
|---|
| 3930 | (make-reg-entry :reg-name "db7"
|
|---|
| 3931 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3932 | :reg-flags 0
|
|---|
| 3933 | :reg-num 7)
|
|---|
| 3934 | (make-reg-entry :reg-name "db8"
|
|---|
| 3935 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3936 | :reg-flags +RegRex+
|
|---|
| 3937 | :reg-num 0 )
|
|---|
| 3938 | (make-reg-entry :reg-name "db9"
|
|---|
| 3939 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3940 | :reg-flags +RegRex+
|
|---|
| 3941 | :reg-num 1)
|
|---|
| 3942 | (make-reg-entry :reg-name "db10"
|
|---|
| 3943 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3944 | :reg-flags +RegRex+
|
|---|
| 3945 | :reg-num 2)
|
|---|
| 3946 | (make-reg-entry :reg-name "db11"
|
|---|
| 3947 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3948 | :reg-flags +RegRex+
|
|---|
| 3949 | :reg-num 3)
|
|---|
| 3950 | (make-reg-entry :reg-name "db12"
|
|---|
| 3951 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3952 | :reg-flags +RegRex+
|
|---|
| 3953 | :reg-num 4)
|
|---|
| 3954 | (make-reg-entry :reg-name "db13"
|
|---|
| 3955 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3956 | :reg-flags +RegRex+
|
|---|
| 3957 | :reg-num 5)
|
|---|
| 3958 | (make-reg-entry :reg-name "db14"
|
|---|
| 3959 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3960 | :reg-flags +RegRex+
|
|---|
| 3961 | :reg-num 6)
|
|---|
| 3962 | (make-reg-entry :reg-name "db15"
|
|---|
| 3963 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3964 | :reg-flags +RegRex+
|
|---|
| 3965 | :reg-num 7)
|
|---|
| 3966 | (make-reg-entry :reg-name "dr0"
|
|---|
| 3967 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3968 | :reg-flags 0
|
|---|
| 3969 | :reg-num 0 )
|
|---|
| 3970 | (make-reg-entry :reg-name "dr1"
|
|---|
| 3971 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3972 | :reg-flags 0
|
|---|
| 3973 | :reg-num 1)
|
|---|
| 3974 | (make-reg-entry :reg-name "dr2"
|
|---|
| 3975 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3976 | :reg-flags 0
|
|---|
| 3977 | :reg-num 2)
|
|---|
| 3978 | (make-reg-entry :reg-name "dr3"
|
|---|
| 3979 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3980 | :reg-flags 0
|
|---|
| 3981 | :reg-num 3)
|
|---|
| 3982 | (make-reg-entry :reg-name "dr4"
|
|---|
| 3983 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3984 | :reg-flags 0
|
|---|
| 3985 | :reg-num 4)
|
|---|
| 3986 | (make-reg-entry :reg-name "dr5"
|
|---|
| 3987 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3988 | :reg-flags 0
|
|---|
| 3989 | :reg-num 5)
|
|---|
| 3990 | (make-reg-entry :reg-name "dr6"
|
|---|
| 3991 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3992 | :reg-flags 0
|
|---|
| 3993 | :reg-num 6)
|
|---|
| 3994 | (make-reg-entry :reg-name "dr7"
|
|---|
| 3995 | :reg-type (encode-operand-type :Debug)
|
|---|
| 3996 | :reg-flags 0
|
|---|
| 3997 | :reg-num 7)
|
|---|
| 3998 | (make-reg-entry :reg-name "dr8"
|
|---|
| 3999 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4000 | :reg-flags +RegRex+
|
|---|
| 4001 | :reg-num 0 )
|
|---|
| 4002 | (make-reg-entry :reg-name "dr9"
|
|---|
| 4003 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4004 | :reg-flags +RegRex+
|
|---|
| 4005 | :reg-num 1)
|
|---|
| 4006 | (make-reg-entry :reg-name "dr10"
|
|---|
| 4007 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4008 | :reg-flags +RegRex+
|
|---|
| 4009 | :reg-num 2)
|
|---|
| 4010 | (make-reg-entry :reg-name "dr11"
|
|---|
| 4011 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4012 | :reg-flags +RegRex+
|
|---|
| 4013 | :reg-num 3)
|
|---|
| 4014 | (make-reg-entry :reg-name "dr12"
|
|---|
| 4015 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4016 | :reg-flags +RegRex+
|
|---|
| 4017 | :reg-num 4)
|
|---|
| 4018 | (make-reg-entry :reg-name "dr13"
|
|---|
| 4019 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4020 | :reg-flags +RegRex+
|
|---|
| 4021 | :reg-num 5)
|
|---|
| 4022 | (make-reg-entry :reg-name "dr14"
|
|---|
| 4023 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4024 | :reg-flags +RegRex+
|
|---|
| 4025 | :reg-num 6)
|
|---|
| 4026 | (make-reg-entry :reg-name "dr15"
|
|---|
| 4027 | :reg-type (encode-operand-type :Debug)
|
|---|
| 4028 | :reg-flags +RegRex+
|
|---|
| 4029 | :reg-num 7)
|
|---|
| 4030 | ;; Test registers.
|
|---|
| 4031 | (make-reg-entry :reg-name "tr0"
|
|---|
| 4032 | :reg-type (encode-operand-type :Test)
|
|---|
| 4033 | :reg-flags 0
|
|---|
| 4034 | :reg-num 0 )
|
|---|
| 4035 | (make-reg-entry :reg-name "tr1"
|
|---|
| 4036 | :reg-type (encode-operand-type :Test)
|
|---|
| 4037 | :reg-flags 0
|
|---|
| 4038 | :reg-num 1)
|
|---|
| 4039 | (make-reg-entry :reg-name "tr2"
|
|---|
| 4040 | :reg-type (encode-operand-type :Test)
|
|---|
| 4041 | :reg-flags 0
|
|---|
| 4042 | :reg-num 2)
|
|---|
| 4043 | (make-reg-entry :reg-name "tr3"
|
|---|
| 4044 | :reg-type (encode-operand-type :Test)
|
|---|
| 4045 | :reg-flags 0
|
|---|
| 4046 | :reg-num 3)
|
|---|
| 4047 | (make-reg-entry :reg-name "tr4"
|
|---|
| 4048 | :reg-type (encode-operand-type :Test)
|
|---|
| 4049 | :reg-flags 0
|
|---|
| 4050 | :reg-num 4)
|
|---|
| 4051 | (make-reg-entry :reg-name "tr5"
|
|---|
| 4052 | :reg-type (encode-operand-type :Test)
|
|---|
| 4053 | :reg-flags 0
|
|---|
| 4054 | :reg-num 5)
|
|---|
| 4055 | (make-reg-entry :reg-name "tr6"
|
|---|
| 4056 | :reg-type (encode-operand-type :Test)
|
|---|
| 4057 | :reg-flags 0
|
|---|
| 4058 | :reg-num 6)
|
|---|
| 4059 | (make-reg-entry :reg-name "tr7"
|
|---|
| 4060 | :reg-type (encode-operand-type :Test)
|
|---|
| 4061 | :reg-flags 0
|
|---|
| 4062 | :reg-num 7)
|
|---|
| 4063 | ;; MMX and simd registers.
|
|---|
| 4064 | (make-reg-entry :reg-name "mm0"
|
|---|
| 4065 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4066 | :reg-flags 0
|
|---|
| 4067 | :reg-num 0 )
|
|---|
| 4068 | (make-reg-entry :reg-name "mm1"
|
|---|
| 4069 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4070 | :reg-flags 0
|
|---|
| 4071 | :reg-num 1)
|
|---|
| 4072 | (make-reg-entry :reg-name "mm2"
|
|---|
| 4073 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4074 | :reg-flags 0
|
|---|
| 4075 | :reg-num 2)
|
|---|
| 4076 | (make-reg-entry :reg-name "mm3"
|
|---|
| 4077 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4078 | :reg-flags 0
|
|---|
| 4079 | :reg-num 3)
|
|---|
| 4080 | (make-reg-entry :reg-name "mm4"
|
|---|
| 4081 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4082 | :reg-flags 0
|
|---|
| 4083 | :reg-num 4)
|
|---|
| 4084 | (make-reg-entry :reg-name "mm5"
|
|---|
| 4085 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4086 | :reg-flags 0
|
|---|
| 4087 | :reg-num 5)
|
|---|
| 4088 | (make-reg-entry :reg-name "mm6"
|
|---|
| 4089 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4090 | :reg-flags 0
|
|---|
| 4091 | :reg-num 6)
|
|---|
| 4092 | (make-reg-entry :reg-name "mm7"
|
|---|
| 4093 | :reg-type (encode-operand-type :RegMMX)
|
|---|
| 4094 | :reg-flags 0
|
|---|
| 4095 | :reg-num 7)
|
|---|
| 4096 | (make-reg-entry :reg-name "xmm0"
|
|---|
| 4097 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4098 | :reg-flags 0
|
|---|
| 4099 | :reg-num 0 )
|
|---|
| 4100 | (make-reg-entry :reg-name "xmm1"
|
|---|
| 4101 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4102 | :reg-flags 0
|
|---|
| 4103 | :reg-num 1)
|
|---|
| 4104 | (make-reg-entry :reg-name "xmm2"
|
|---|
| 4105 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4106 | :reg-flags 0
|
|---|
| 4107 | :reg-num 2)
|
|---|
| 4108 | (make-reg-entry :reg-name "xmm3"
|
|---|
| 4109 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4110 | :reg-flags 0
|
|---|
| 4111 | :reg-num 3)
|
|---|
| 4112 | (make-reg-entry :reg-name "xmm4"
|
|---|
| 4113 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4114 | :reg-flags 0
|
|---|
| 4115 | :reg-num 4)
|
|---|
| 4116 | (make-reg-entry :reg-name "xmm5"
|
|---|
| 4117 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4118 | :reg-flags 0
|
|---|
| 4119 | :reg-num 5)
|
|---|
| 4120 | (make-reg-entry :reg-name "xmm6"
|
|---|
| 4121 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4122 | :reg-flags 0
|
|---|
| 4123 | :reg-num 6)
|
|---|
| 4124 | (make-reg-entry :reg-name "xmm7"
|
|---|
| 4125 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4126 | :reg-flags 0
|
|---|
| 4127 | :reg-num 7)
|
|---|
| 4128 | (make-reg-entry :reg-name "xmm8"
|
|---|
| 4129 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4130 | :reg-flags +RegRex+
|
|---|
| 4131 | :reg-num 0 )
|
|---|
| 4132 | (make-reg-entry :reg-name "xmm9"
|
|---|
| 4133 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4134 | :reg-flags +RegRex+
|
|---|
| 4135 | :reg-num 1)
|
|---|
| 4136 | (make-reg-entry :reg-name "xmm10"
|
|---|
| 4137 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4138 | :reg-flags +RegRex+
|
|---|
| 4139 | :reg-num 2)
|
|---|
| 4140 | (make-reg-entry :reg-name "xmm11"
|
|---|
| 4141 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4142 | :reg-flags +RegRex+
|
|---|
| 4143 | :reg-num 3)
|
|---|
| 4144 | (make-reg-entry :reg-name "xmm12"
|
|---|
| 4145 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4146 | :reg-flags +RegRex+
|
|---|
| 4147 | :reg-num 4)
|
|---|
| 4148 | (make-reg-entry :reg-name "xmm13"
|
|---|
| 4149 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4150 | :reg-flags +RegRex+
|
|---|
| 4151 | :reg-num 5)
|
|---|
| 4152 | (make-reg-entry :reg-name "xmm14"
|
|---|
| 4153 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4154 | :reg-flags +RegRex+
|
|---|
| 4155 | :reg-num 6)
|
|---|
| 4156 | (make-reg-entry :reg-name "xmm15"
|
|---|
| 4157 | :reg-type (encode-operand-type :RegXMM)
|
|---|
| 4158 | :reg-flags +RegRex+
|
|---|
| 4159 | :reg-num 7)
|
|---|
| 4160 | ;; No type will make this register rejected for all purposes except
|
|---|
| 4161 | ;; for addressing. This saves creating one extra type for RIP.
|
|---|
| 4162 | (make-reg-entry :reg-name "rip"
|
|---|
| 4163 | :reg-type (encode-operand-type :BaseIndex)
|
|---|
| 4164 | :reg-flags 0
|
|---|
| 4165 | :reg-num 0 )
|
|---|
| 4166 | ))
|
|---|
| 4167 |
|
|---|
| 4168 | (defvar *x86-float-regs*
|
|---|
| 4169 | (vector
|
|---|
| 4170 | (make-reg-entry :reg-name "st[0]"
|
|---|
| 4171 | :reg-type (encode-operand-type :FloatReg :FloatAcc)
|
|---|
| 4172 | :reg-flags 0
|
|---|
| 4173 | :reg-num 0)
|
|---|
| 4174 | (make-reg-entry :reg-name "st[1]"
|
|---|
| 4175 | :reg-type (encode-operand-type :FloatReg)
|
|---|
| 4176 | :reg-flags 0
|
|---|
| 4177 | :reg-num 1)
|
|---|
| 4178 | (make-reg-entry :reg-name "st[2]"
|
|---|
| 4179 | :reg-type (encode-operand-type :FloatReg)
|
|---|
| 4180 | :reg-flags 0
|
|---|
| 4181 | :reg-num 2)
|
|---|
| 4182 | (make-reg-entry :reg-name "st[3]"
|
|---|
| 4183 | :reg-type (encode-operand-type :FloatReg)
|
|---|
| 4184 | :reg-flags 0
|
|---|
| 4185 | :reg-num 3)
|
|---|
| 4186 | (make-reg-entry :reg-name "st[4]"
|
|---|
| 4187 | :reg-type (encode-operand-type :FloatReg)
|
|---|
| 4188 | :reg-flags 0
|
|---|
| 4189 | :reg-num 4)
|
|---|
| 4190 | (make-reg-entry :reg-name "st[5]"
|
|---|
| 4191 | :reg-type (encode-operand-type :FloatReg)
|
|---|
| 4192 | :reg-flags 0
|
|---|
| 4193 | :reg-num 5)
|
|---|
| 4194 | (make-reg-entry :reg-name "st[6]"
|
|---|
| 4195 | :reg-type (encode-operand-type :FloatReg)
|
|---|
| 4196 | :reg-flags 0
|
|---|
| 4197 | :reg-num 6)
|
|---|
| 4198 | (make-reg-entry :reg-name "st[7]"
|
|---|
| 4199 | :reg-type (encode-operand-type :FloatReg)
|
|---|
| 4200 | :reg-flags 0
|
|---|
| 4201 | :reg-num 7)))
|
|---|
| 4202 |
|
|---|
| 4203 |
|
|---|
| 4204 | ;;; Segment stuff.
|
|---|
| 4205 | (defvar *cs-segment-register* (make-seg-entry :seg-name "cs" :seg-prefix #x23))
|
|---|
| 4206 | (defvar *ds-segment-register* (make-seg-entry :seg-name "ds" :seg-prefix #x3e))
|
|---|
| 4207 | (defvar *ss-segment-register* (make-seg-entry :seg-name "ss" :seg-prefix #x36))
|
|---|
| 4208 | (defvar *es-segment-register* (make-seg-entry :seg-name "es" :seg-prefix #x26))
|
|---|
| 4209 | (defvar *fs-segment-register* (make-seg-entry :seg-name "fs" :seg-prefix #x64))
|
|---|
| 4210 | (defvar *gs-segment-register* (make-seg-entry :seg-name "gs" :seg-prefix #x65))
|
|---|
| 4211 |
|
|---|
| 4212 | (defvar *x86-seg-entries*
|
|---|
| 4213 | (vector *es-segment-register*
|
|---|
| 4214 | *cs-segment-register*
|
|---|
| 4215 | *ss-segment-register*
|
|---|
| 4216 | *ds-segment-register*
|
|---|
| 4217 | *fs-segment-register*
|
|---|
| 4218 | *gs-segment-register*))
|
|---|
| 4219 |
|
|---|
| 4220 |
|
|---|
| 4221 |
|
|---|
| 4222 |
|
|---|
| 4223 |
|
|---|
| 4224 | (defun init-x86-registers ()
|
|---|
| 4225 | (flet ((hash-registers (vector hash 64p)
|
|---|
| 4226 | (dotimes (i (length vector))
|
|---|
| 4227 | (let* ((entry (svref vector i)))
|
|---|
| 4228 | (if (or 64p (not (logtest (reg-entry-reg-flags entry) +regrex+)))
|
|---|
| 4229 | (setf (gethash (reg-entry-reg-name entry) hash)
|
|---|
| 4230 | entry))))))
|
|---|
| 4231 | (hash-registers *x86-regtab* *x8632-registers* nil)
|
|---|
| 4232 | (hash-registers *x86-float-regs* *x8632-registers* nil)
|
|---|
| 4233 | (hash-registers *x86-regtab* *x8664-registers* t)
|
|---|
| 4234 | (hash-registers *x86-float-regs* *x8664-registers* t)))
|
|---|
| 4235 |
|
|---|
| 4236 | )
|
|---|
| 4237 |
|
|---|
| 4238 | (init-x86-registers)
|
|---|
| 4239 |
|
|---|
| 4240 |
|
|---|
| 4241 |
|
|---|
| 4242 | (defstruct x86-operand
|
|---|
| 4243 | (type ))
|
|---|
| 4244 |
|
|---|
| 4245 | (defstruct (x86-immediate-operand (:include x86-operand))
|
|---|
| 4246 | ;; The "value" of an immediate operand may be an expression (that we
|
|---|
| 4247 | ;; have to do some sort of delayed evaluation on.) It could just be
|
|---|
| 4248 | ;; a lisp form (that we call EVAL on), but there might be scoping or
|
|---|
| 4249 | ;; similar issues in that case.
|
|---|
| 4250 | value)
|
|---|
| 4251 |
|
|---|
| 4252 | (defstruct (x86-register-operand (:include x86-operand))
|
|---|
| 4253 | entry ;the reg-entry
|
|---|
| 4254 | )
|
|---|
| 4255 |
|
|---|
| 4256 | (defstruct (x86-label-operand (:include x86-operand))
|
|---|
| 4257 | label)
|
|---|
| 4258 |
|
|---|
| 4259 |
|
|---|
| 4260 | (defstruct (x86-memory-operand (:include x86-operand))
|
|---|
| 4261 | ;; Any of these fields can be null. Some combinations of fields -
|
|---|
| 4262 | ;; like a segment register or scale factor by itself - make no
|
|---|
| 4263 | ;; sense.
|
|---|
| 4264 | seg ; a segment register
|
|---|
| 4265 | disp ; a signed displacement added to base
|
|---|
| 4266 | base ; a GPR
|
|---|
| 4267 | index ; another GPR
|
|---|
| 4268 | scale ; scale factor, multiplied with index
|
|---|
| 4269 | )
|
|---|
| 4270 |
|
|---|
| 4271 |
|
|---|
| 4272 | (defun insert-nothing (instruction operand)
|
|---|
| 4273 | (declare (ignore instruction operand)))
|
|---|
| 4274 |
|
|---|
| 4275 | ;;; Insert a 3-bit register value derived from OPERAND in INSN's modrm.reg
|
|---|
| 4276 | ;;; field. If the register requires REX addressing, set the REX.R bit
|
|---|
| 4277 | ;;; in the instruction's rex-prefix. If either the modrm or rex-prefix
|
|---|
| 4278 | ;;; fields of the instruction are NIL, we're very confused; check for
|
|---|
| 4279 | ;;; that explicitly until this code matures a bit.
|
|---|
| 4280 |
|
|---|
| 4281 | (defun insert-modrm-reg-entry (instruction entry)
|
|---|
| 4282 | (let* ((reg-num (reg-entry-reg-num entry))
|
|---|
| 4283 | (flags (reg-entry-reg-flags entry))
|
|---|
| 4284 | (need-rex.r (logtest +regrex+ flags)))
|
|---|
| 4285 | (setf (x86-instruction-modrm-byte instruction)
|
|---|
| 4286 | (dpb reg-num (byte 3 3)
|
|---|
| 4287 | (need-modrm-byte instruction)))
|
|---|
| 4288 | (when need-rex.r
|
|---|
| 4289 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 4290 | (logior +rex-extx+ (need-rex-prefix instruction))))
|
|---|
| 4291 | (when (logtest +regrex64+ flags)
|
|---|
| 4292 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 4293 | (logior #x80 (need-rex-prefix instruction))))))
|
|---|
| 4294 |
|
|---|
| 4295 |
|
|---|
| 4296 |
|
|---|
| 4297 | (defun insert-modrm-reg (instruction operand)
|
|---|
| 4298 | (insert-modrm-reg-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4299 |
|
|---|
| 4300 | (defun insert-mmx-reg-entry (instruction entry)
|
|---|
| 4301 | (let* ((reg-num (reg-entry-reg-num entry)))
|
|---|
| 4302 | (setf (x86-instruction-modrm-byte instruction)
|
|---|
| 4303 | (dpb reg-num (byte 3 3)
|
|---|
| 4304 | (need-modrm-byte instruction)))))
|
|---|
| 4305 |
|
|---|
| 4306 | (defun insert-mmx-reg (instruction operand)
|
|---|
| 4307 | (insert-mmx-reg-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4308 |
|
|---|
| 4309 | (defun insert-xmm-reg (instruction operand)
|
|---|
| 4310 | (insert-modrm-reg instruction operand))
|
|---|
| 4311 |
|
|---|
| 4312 | (defun insert-xmm-rm (instruction operand)
|
|---|
| 4313 | (insert-modrm-rm instruction operand))
|
|---|
| 4314 |
|
|---|
| 4315 | (defun insert-opcode-reg-entry (instruction entry)
|
|---|
| 4316 | (let* ((reg-num (reg-entry-reg-num entry))
|
|---|
| 4317 | (flags (reg-entry-reg-flags entry))
|
|---|
| 4318 | (need-rex.b (logtest +regrex+ flags)))
|
|---|
| 4319 | (setf (x86-instruction-base-opcode instruction)
|
|---|
| 4320 | (dpb reg-num (byte 3 0)
|
|---|
| 4321 | (x86-instruction-base-opcode instruction)))
|
|---|
| 4322 | (when need-rex.b
|
|---|
| 4323 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 4324 | (logior +rex-extz+ (need-rex-prefix instruction))))
|
|---|
| 4325 | (when (logtest +regrex64+ flags)
|
|---|
| 4326 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 4327 | (logior #x80 (need-rex-prefix instruction))))))
|
|---|
| 4328 |
|
|---|
| 4329 | (defun insert-opcode-reg (instruction operand)
|
|---|
| 4330 | (insert-opcode-reg-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4331 |
|
|---|
| 4332 | ;;; Insert a 4-bit register number in the low 4 bits of the opcode.
|
|---|
| 4333 | ;;; (This is only used in synthetic instructions, like some UUOs.)
|
|---|
| 4334 |
|
|---|
| 4335 | (defun insert-opcode-reg4-entry (instruction entry)
|
|---|
| 4336 | (let* ((reg-num (reg-entry-reg-num entry))
|
|---|
| 4337 | (xreg-num (logior reg-num
|
|---|
| 4338 | (if (logtest +regrex+ (reg-entry-reg-flags entry))
|
|---|
| 4339 | #x08
|
|---|
| 4340 | #x00))))
|
|---|
| 4341 | (setf (x86-instruction-base-opcode instruction)
|
|---|
| 4342 | (dpb xreg-num (byte 4 0)
|
|---|
| 4343 | (x86-instruction-base-opcode instruction)))))
|
|---|
| 4344 |
|
|---|
| 4345 | (defun insert-opcode-reg4 (instruction operand)
|
|---|
| 4346 | (insert-opcode-reg4-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4347 |
|
|---|
| 4348 |
|
|---|
| 4349 | (defun insert-reg4-pseudo-rm-high-entry (instruction entry)
|
|---|
| 4350 | (let* ((reg-num (reg-entry-reg-num entry))
|
|---|
| 4351 | (xreg-num (logior reg-num
|
|---|
| 4352 | (if (logtest +regrex+ (reg-entry-reg-flags entry))
|
|---|
| 4353 | #x08
|
|---|
| 4354 | #x00))))
|
|---|
| 4355 | (setf (x86-instruction-modrm-byte instruction)
|
|---|
| 4356 | (dpb xreg-num (byte 4 4)
|
|---|
| 4357 | (x86-instruction-modrm-byte instruction)))))
|
|---|
| 4358 |
|
|---|
| 4359 | (defun insert-reg4-pseudo-rm-high (instruction operand)
|
|---|
| 4360 | (insert-reg4-pseudo-rm-high-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4361 |
|
|---|
| 4362 |
|
|---|
| 4363 | (defun insert-reg4-pseudo-rm-low-entry (instruction entry)
|
|---|
| 4364 | (let* ((reg-num (reg-entry-reg-num entry))
|
|---|
| 4365 | (xreg-num (logior reg-num
|
|---|
| 4366 | (if (logtest +regrex+ (reg-entry-reg-flags entry))
|
|---|
| 4367 | #x08
|
|---|
| 4368 | #x00))))
|
|---|
| 4369 | (setf (x86-instruction-modrm-byte instruction)
|
|---|
| 4370 | (dpb xreg-num (byte 4 0)
|
|---|
| 4371 | (x86-instruction-modrm-byte instruction)))))
|
|---|
| 4372 |
|
|---|
| 4373 | (defun insert-reg4-pseudo-rm-low (instruction operand)
|
|---|
| 4374 | (insert-reg4-pseudo-rm-low-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4375 |
|
|---|
| 4376 | ;;; Insert a 3-bit register value derived from OPERAND in INSN's modrm.rm
|
|---|
| 4377 | ;;; field. If the register requires REX addressing, set the REX.B bit
|
|---|
| 4378 | ;;; in the instruction's rex-prefix. If either the modrm or rex-prefix
|
|---|
| 4379 | ;;; fields of the instruction are NIL, we're very confused; check for
|
|---|
| 4380 | ;;; that explicitly until this code matures a bit.
|
|---|
| 4381 |
|
|---|
| 4382 | (defun insert-modrm-rm-entry (instruction entry)
|
|---|
| 4383 | (let* ((reg-num (reg-entry-reg-num entry))
|
|---|
| 4384 | (flags (reg-entry-reg-flags entry))
|
|---|
| 4385 | (need-rex.b (logtest +regrex+ flags)))
|
|---|
| 4386 | (setf (x86-instruction-modrm-byte instruction)
|
|---|
| 4387 | (dpb reg-num (byte 3 0) (need-modrm-byte instruction)))
|
|---|
| 4388 | (when need-rex.b
|
|---|
| 4389 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 4390 | (logior +rex-extz+ (need-rex-prefix instruction))))
|
|---|
| 4391 | (when (logtest +regrex64+ flags)
|
|---|
| 4392 | (setf (x86-instruction-rex-prefix instruction)
|
|---|
| 4393 | (logior #x80 (need-rex-prefix instruction))))))
|
|---|
| 4394 |
|
|---|
| 4395 | (defun insert-modrm-rm (instruction operand)
|
|---|
| 4396 | (insert-modrm-rm-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4397 |
|
|---|
| 4398 | (defun insert-mmx-rm-entry (instruction entry)
|
|---|
| 4399 | (let* ((reg-num (reg-entry-reg-num entry)))
|
|---|
| 4400 | (setf (x86-instruction-modrm-byte instruction)
|
|---|
| 4401 | (dpb reg-num (byte 3 0) (need-modrm-byte instruction)))))
|
|---|
| 4402 |
|
|---|
| 4403 | (defun insert-mmx-rm (instruction operand)
|
|---|
| 4404 | (insert-mmx-rm-entry instruction (x86-register-operand-entry operand)))
|
|---|
| 4405 |
|
|---|
| 4406 | (defun insert-imm64 (instruction operand)
|
|---|
| 4407 | (setf (x86-immediate-operand-type operand)
|
|---|
| 4408 | (encode-operand-type :imm64))
|
|---|
| 4409 | (setf (x86-instruction-imm instruction) operand))
|
|---|
| 4410 |
|
|---|
| 4411 | (defun insert-imm32s (instruction operand)
|
|---|
| 4412 | (setf (x86-immediate-operand-type operand)
|
|---|
| 4413 | (encode-operand-type :imm32s))
|
|---|
| 4414 | (setf (x86-instruction-imm instruction) operand))
|
|---|
| 4415 |
|
|---|
| 4416 | (defun insert-imm32 (instruction operand)
|
|---|
| 4417 | (setf (x86-immediate-operand-type operand)
|
|---|
| 4418 | (encode-operand-type :imm32))
|
|---|
| 4419 | (setf (x86-instruction-imm instruction) operand))
|
|---|
| 4420 |
|
|---|
| 4421 | (defun insert-imm16 (instruction operand)
|
|---|
| 4422 | (setf (x86-immediate-operand-type operand)
|
|---|
| 4423 | (encode-operand-type :imm16))
|
|---|
| 4424 | (setf (x86-instruction-imm instruction) operand))
|
|---|
| 4425 |
|
|---|
| 4426 | (defun insert-imm8 (instruction operand)
|
|---|
| 4427 | (setf (x86-immediate-operand-type operand)
|
|---|
| 4428 | (encode-operand-type :imm8))
|
|---|
| 4429 | (setf (x86-instruction-imm instruction) operand))
|
|---|
| 4430 |
|
|---|
| 4431 | (defun insert-imm8s (instruction operand)
|
|---|
| 4432 | (setf (x86-immediate-operand-type operand)
|
|---|
| 4433 | (encode-operand-type :imm8s))
|
|---|
| 4434 | (setf (x86-instruction-imm instruction) operand))
|
|---|
| 4435 |
|
|---|
| 4436 | (defun insert-imm8-for-int (instruction operand)
|
|---|
| 4437 | (declare (ftype (function (t) t) ccl::early-x86-lap-expression-value))
|
|---|
| 4438 | (let* ((expr (x86-immediate-operand-value operand))
|
|---|
| 4439 | (value (ccl::early-x86-lap-expression-value expr)))
|
|---|
| 4440 | (if (eql value 3)
|
|---|
| 4441 | (setf (x86-instruction-base-opcode instruction)
|
|---|
| 4442 | +int3-opcode+)
|
|---|
| 4443 | (insert-imm8 instruction operand))))
|
|---|
| 4444 |
|
|---|
| 4445 | (defun insert-label (instruction operand)
|
|---|
| 4446 | (setf (x86-instruction-extra instruction)
|
|---|
| 4447 | (x86::x86-label-operand-label operand)))
|
|---|
| 4448 |
|
|---|
| 4449 | (defparameter *x8664-register-entries*
|
|---|
| 4450 | (flet ((register-entry (name)
|
|---|
| 4451 | (let* ((r (gethash name *x86-registers*)))
|
|---|
| 4452 | (unless r (error "unknown register ~s" name))
|
|---|
| 4453 | r)))
|
|---|
| 4454 | (vector
|
|---|
| 4455 | ;; 64-bit general-purpose registers
|
|---|
| 4456 | (register-entry "rax")
|
|---|
| 4457 | (register-entry "rcx")
|
|---|
| 4458 | (register-entry "rdx")
|
|---|
| 4459 | (register-entry "rbx")
|
|---|
| 4460 | (register-entry "rsp")
|
|---|
| 4461 | (register-entry "rbp")
|
|---|
| 4462 | (register-entry "rsi")
|
|---|
| 4463 | (register-entry "rdi")
|
|---|
| 4464 | (register-entry "r8")
|
|---|
| 4465 | (register-entry "r9")
|
|---|
| 4466 | (register-entry "r10")
|
|---|
| 4467 | (register-entry "r11")
|
|---|
| 4468 | (register-entry "r12")
|
|---|
| 4469 | (register-entry "r13")
|
|---|
| 4470 | (register-entry "r14")
|
|---|
| 4471 | (register-entry "r15")
|
|---|
| 4472 | ;; 32-bit registers
|
|---|
| 4473 | (register-entry "eax")
|
|---|
| 4474 | (register-entry "ecx")
|
|---|
| 4475 | (register-entry "edx")
|
|---|
| 4476 | (register-entry "ebx")
|
|---|
| 4477 | (register-entry "esp")
|
|---|
| 4478 | (register-entry "ebp")
|
|---|
| 4479 | (register-entry "esi")
|
|---|
| 4480 | (register-entry "edi")
|
|---|
| 4481 | (register-entry "r8d")
|
|---|
| 4482 | (register-entry "r9d")
|
|---|
| 4483 | (register-entry "r10d")
|
|---|
| 4484 | (register-entry "r11d")
|
|---|
| 4485 | (register-entry "r12d")
|
|---|
| 4486 | (register-entry "r13d")
|
|---|
| 4487 | (register-entry "r14d")
|
|---|
| 4488 | (register-entry "r15d")
|
|---|
| 4489 | ;; 16-bit-registers
|
|---|
| 4490 | (register-entry "ax")
|
|---|
| 4491 | (register-entry "cx")
|
|---|
| 4492 | (register-entry "dx")
|
|---|
| 4493 | (register-entry "bx")
|
|---|
| 4494 | (register-entry "sp")
|
|---|
| 4495 | (register-entry "bp")
|
|---|
| 4496 | (register-entry "si")
|
|---|
| 4497 | (register-entry "di")
|
|---|
| 4498 | (register-entry "r8w")
|
|---|
| 4499 | (register-entry "r9w")
|
|---|
| 4500 | (register-entry "r10w")
|
|---|
| 4501 | (register-entry "r11w")
|
|---|
| 4502 | (register-entry "r12w")
|
|---|
| 4503 | (register-entry "r13w")
|
|---|
| 4504 | (register-entry "r14w")
|
|---|
| 4505 | (register-entry "r15w")
|
|---|
| 4506 | ;; 8-bit registers
|
|---|
| 4507 | (register-entry "al")
|
|---|
| 4508 | (register-entry "cl")
|
|---|
| 4509 | (register-entry "dl")
|
|---|
| 4510 | (register-entry "bl")
|
|---|
| 4511 | (register-entry "spl")
|
|---|
| 4512 | (register-entry "bpl")
|
|---|
| 4513 | (register-entry "sil")
|
|---|
| 4514 | (register-entry "dil")
|
|---|
| 4515 | (register-entry "r8b")
|
|---|
| 4516 | (register-entry "r9b")
|
|---|
| 4517 | (register-entry "r10b")
|
|---|
| 4518 | (register-entry "r11b")
|
|---|
| 4519 | (register-entry "r12b")
|
|---|
| 4520 | (register-entry "r13b")
|
|---|
| 4521 | (register-entry "r14b")
|
|---|
| 4522 | (register-entry "r15b")
|
|---|
| 4523 | ;;; xmm registers
|
|---|
| 4524 | (register-entry "xmm0")
|
|---|
| 4525 | (register-entry "xmm1")
|
|---|
| 4526 | (register-entry "xmm2")
|
|---|
| 4527 | (register-entry "xmm3")
|
|---|
| 4528 | (register-entry "xmm4")
|
|---|
| 4529 | (register-entry "xmm5")
|
|---|
| 4530 | (register-entry "xmm6")
|
|---|
| 4531 | (register-entry "xmm7")
|
|---|
| 4532 | (register-entry "xmm8")
|
|---|
| 4533 | (register-entry "xmm9")
|
|---|
| 4534 | (register-entry "xmm10")
|
|---|
| 4535 | (register-entry "xmm11")
|
|---|
| 4536 | (register-entry "xmm12")
|
|---|
| 4537 | (register-entry "xmm13")
|
|---|
| 4538 | (register-entry "xmm14")
|
|---|
| 4539 | (register-entry "xmm15")
|
|---|
| 4540 | ;; MMX registers
|
|---|
| 4541 | (register-entry "mm0")
|
|---|
| 4542 | (register-entry "mm1")
|
|---|
| 4543 | (register-entry "mm2")
|
|---|
| 4544 | (register-entry "mm3")
|
|---|
| 4545 | (register-entry "mm4")
|
|---|
| 4546 | (register-entry "mm5")
|
|---|
| 4547 | (register-entry "mm6")
|
|---|
| 4548 | (register-entry "mm7")
|
|---|
| 4549 | ;; x87 FP regs. May or may not be useful.
|
|---|
| 4550 | (register-entry "st[0]")
|
|---|
| 4551 | (register-entry "st[1]")
|
|---|
| 4552 | (register-entry "st[2]")
|
|---|
| 4553 | (register-entry "st[3]")
|
|---|
| 4554 | (register-entry "st[4]")
|
|---|
| 4555 | (register-entry "st[5]")
|
|---|
| 4556 | (register-entry "st[6]")
|
|---|
| 4557 | (register-entry "st[7]")
|
|---|
| 4558 | ;; Our friends, the segment registers
|
|---|
| 4559 | (register-entry "cs")
|
|---|
| 4560 | (register-entry "ds")
|
|---|
| 4561 | (register-entry "ss")
|
|---|
| 4562 | (register-entry "es")
|
|---|
| 4563 | (register-entry "fs")
|
|---|
| 4564 | (register-entry "gs")
|
|---|
| 4565 | (register-entry "rip")
|
|---|
| 4566 | )))
|
|---|
| 4567 |
|
|---|
| 4568 | (dotimes (i (length *x8664-register-entries*))
|
|---|
| 4569 | (let* ((entry (svref *x8664-register-entries* i)))
|
|---|
| 4570 | (when entry
|
|---|
| 4571 | (setf (reg-entry-ordinal64 entry) i))))
|
|---|
| 4572 |
|
|---|
| 4573 |
|
|---|
| 4574 | (defconstant +x86-64-bit-register+ #x00)
|
|---|
| 4575 | (defconstant +x86-32-bit-register+ #x10)
|
|---|
| 4576 | (defconstant +x86-16-bit-register+ #x20)
|
|---|
| 4577 | (defconstant +x86-8-bit-register+ #x30)
|
|---|
| 4578 | (defconstant +x86-xmm-register-offset+ #x40)
|
|---|
| 4579 | (defconstant +x86-mmx-register-offset+ #x50)
|
|---|
| 4580 | (defconstant +x86-fpu-register-offset+ #x58)
|
|---|
| 4581 | (defconstant +x86-segment-register-offset+ #x60)
|
|---|
| 4582 |
|
|---|
| 4583 | (defun x86-segment-register (i)
|
|---|
| 4584 | (if (and (typep i 'unsigned-byte)
|
|---|
| 4585 | (< i 6))
|
|---|
| 4586 | (svref *x8664-register-entries* (+ +x86-segment-register-offset+ i))))
|
|---|
| 4587 |
|
|---|
| 4588 | (defun x86-xmm-register (i)
|
|---|
| 4589 | (if (typep i '(mod 16))
|
|---|
| 4590 | (svref *x8664-register-entries* (+ +x86-xmm-register-offset+ i))))
|
|---|
| 4591 |
|
|---|
| 4592 | (defun x86-mmx-register (i)
|
|---|
| 4593 | (if (typep i '(mod 8))
|
|---|
| 4594 | (svref *x8664-register-entries* (+ +x86-mmx-register-offset+ i))))
|
|---|
| 4595 |
|
|---|
| 4596 |
|
|---|
| 4597 | (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 |
|
|---|
| 4610 |
|
|---|
| 4611 | (defun x86-reg8 (r)
|
|---|
| 4612 | (svref *x8664-register-entries* (dpb (gpr-ordinal r)
|
|---|
| 4613 | (byte 4 0)
|
|---|
| 4614 | +x86-8-bit-register+)))
|
|---|
| 4615 |
|
|---|
| 4616 | (defun x86-reg16 (r)
|
|---|
| 4617 | (svref *x8664-register-entries* (dpb (gpr-ordinal r)
|
|---|
| 4618 | (byte 4 0)
|
|---|
| 4619 | +x86-16-bit-register+)))
|
|---|
| 4620 |
|
|---|
| 4621 | (defun x86-reg32 (r)
|
|---|
| 4622 | (svref *x8664-register-entries* (dpb (gpr-ordinal r)
|
|---|
| 4623 | (byte 4 0)
|
|---|
| 4624 | +x86-32-bit-register+)))
|
|---|
| 4625 |
|
|---|
| 4626 | (defun x86-reg64 (r)
|
|---|
| 4627 | (svref *x8664-register-entries* (dpb (gpr-ordinal r)
|
|---|
| 4628 | (byte 4 0)
|
|---|
| 4629 | +x86-64-bit-register+)))
|
|---|
| 4630 |
|
|---|
| 4631 |
|
|---|
| 4632 | ;;; This returns true if the template's operand types "match" the
|
|---|
| 4633 | ;;; types of the actual operands.
|
|---|
| 4634 | (defun match-template-types (template type0 type1 type2)
|
|---|
| 4635 | (flet ((match (overlap given)
|
|---|
| 4636 | (and
|
|---|
| 4637 | (not (zerop (logandc2 overlap (encode-operand-type :jumpabsolute))))
|
|---|
| 4638 | (= (logand given (encode-operand-type :baseindex :jumpabsolute))
|
|---|
| 4639 | (logand overlap (encode-operand-type :baseindex :jumpabsolute)))))
|
|---|
| 4640 | (consistent-register-match (m0 g0 t0 m1 g1 t1)
|
|---|
| 4641 | (let* ((g0® (logand g0 (encode-operand-type :reg)))
|
|---|
| 4642 | (g1® (logand g1 (encode-operand-type :reg))))
|
|---|
| 4643 | (or (zerop g0®)
|
|---|
| 4644 | (zerop g1®)
|
|---|
| 4645 | (= g0® g1®)
|
|---|
| 4646 | (not
|
|---|
| 4647 | (logtest
|
|---|
| 4648 | (if (logtest m0 (encode-operand-type :acc))
|
|---|
| 4649 | (encode-operand-type :reg)
|
|---|
| 4650 | t0)
|
|---|
| 4651 | (if (logtest m1 (encode-operand-type :acc))
|
|---|
| 4652 | (encode-operand-type :reg)
|
|---|
| 4653 | t1)))))))
|
|---|
| 4654 | (let* ((nops (if type2 3 (if type1 2 (if type0 1 0)))))
|
|---|
| 4655 | (declare (fixnum nops))
|
|---|
| 4656 | (let* ((template-types
|
|---|
| 4657 | (x86-opcode-template-operand-types template)))
|
|---|
| 4658 | (when (= nops (the fixnum (length template-types)))
|
|---|
| 4659 | (or (zerop nops)
|
|---|
| 4660 | (let* ((template-type0 (svref template-types 0))
|
|---|
| 4661 | (overlap0
|
|---|
| 4662 | (logand type0 template-type0))
|
|---|
| 4663 | (match0 (match overlap0 type0)))
|
|---|
| 4664 | (if match0
|
|---|
| 4665 | (or (= nops 1)
|
|---|
| 4666 | ;; 2 or 3 operands.
|
|---|
| 4667 | (let* ((template-type1 (svref template-types 1))
|
|---|
| 4668 | (overlap1 (logand type1 template-type1))
|
|---|
| 4669 | (match1 (match overlap1 type1)))
|
|---|
| 4670 | (if (and
|
|---|
| 4671 | match1
|
|---|
| 4672 | (consistent-register-match
|
|---|
| 4673 | overlap0
|
|---|
| 4674 | type0
|
|---|
| 4675 | template-type0
|
|---|
| 4676 | overlap1
|
|---|
| 4677 | type1
|
|---|
| 4678 | template-type1))
|
|---|
| 4679 | (or (= nops 2)
|
|---|
| 4680 | ;; 3 operands
|
|---|
| 4681 | (let* ((template-type2 (svref template-types 2))
|
|---|
| 4682 | (overlap2 (logand type2 template-type2)))
|
|---|
| 4683 | (and (match overlap2 type2)
|
|---|
| 4684 | (consistent-register-match
|
|---|
| 4685 | overlap1
|
|---|
| 4686 | type1
|
|---|
| 4687 | template-type1
|
|---|
| 4688 | overlap2
|
|---|
| 4689 | type2
|
|---|
| 4690 | template-type2)))))))))))))))
|
|---|
| 4691 |
|
|---|
| 4692 | (defun match-template (template parsed-operands)
|
|---|
| 4693 | (apply #'match-template-types template (mapcar #'x86-operand-type parsed-operands)))
|
|---|
| 4694 |
|
|---|
| 4695 |
|
|---|
| 4696 |
|
|---|
| 4697 | (provide "X86-ASM")
|
|---|