X86Encode.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. //
  7. // Contains constants and tables used by the encoder.
  8. //
  9. // Define the encodings of the second byte in instructions. This value is
  10. // or'ed in with the mod r/m fields to build a constant reg field.
  11. //
  12. // mod reg r/m 00reg000 reg 0->7.
  13. #define RNON 0x00
  14. #define R000 0x00
  15. #define R001 0x08
  16. #define R010 0x10
  17. #define R011 0x18
  18. #define R100 0x20
  19. #define R101 0x28
  20. #define R110 0x30
  21. #define R111 0x38
  22. /* values for the opcode dope vector */
  23. #define DFLT 0x1 /* floating point instructions */
  24. #define DSETCC 0x2 /* sets one or more condition codes */
  25. #define DUSECC 0x4 /* uses one or more condition codes */
  26. #define DNOMF 0x8 /* floating point instruction, no "mf" bits */
  27. #define DZEROF 0x10 /* the 0x0f style 386 instruction extensions */
  28. #define DNO16 0x20 /* 16 bit op size override not legal */
  29. #define DOPEQ 0x40 /* DST and SRC1 must be the same */
  30. #define DUSEPRE 0x80 /* this instruction can have use a prefix instruction*/
  31. #define DISPRE 0x100 /* this is a 'prefix' instruction */
  32. #define DFWAIT 0x200 /* generate a WAIT before this instruction */
  33. #define DDST 0x800 /* get the first operand from the DST list */
  34. #define DCOMMOP 0x1000 /* opcode is commutative */
  35. #define DSSE 0x4000 /* Instruction operates on XMM registers but not AVX */
  36. #define D66EX 0x2000 // Optional 0x66 for WNI/MNI 128-bit extended MMX opcodes
  37. #define D66 0x100000 // 0x66 0x0F style WNI form (usually 128-bit DP FP)
  38. #define DF2 0x200000 // 0xF2 0x0F style WNI form (usually 64-bit DP FP)
  39. #define DF3 0x400000 // 0xF3 0x0F style KNI opcodes
  40. #define NDPinc 0x800000 /* instruction incs stack level by 1 */
  41. #define NDPdec 0x1000000 /* instruction decs stack level by 1 */
  42. // 2nd 3 bits is options
  43. #define SBIT 0x20
  44. #define DBIT 0x40
  45. #define WBIT 0x80 // applies to MODRM, IMM, NO, SHFT, AX_IM
  46. #define FAC 0x20 // applies to FMODRM
  47. #define FINT 0x40 // applies to FMODRM, FUMODRM
  48. // values for the "form" field
  49. // first 5 bits is basic form
  50. #define FORM_MASK 0x1F
  51. #define INVALID 0
  52. #define MODRM 1 // MODRM
  53. #define IMM 2 // long immediate
  54. #define AX_MEM 3 // EAX, mem
  55. #define SH_IM 4 // short immediate
  56. #define SHIMR 5 // short immediate, reg
  57. #define SH_REG 6
  58. #define NO 7
  59. #define LABREL1 8
  60. #define LABREL2 9 // near jmp/call
  61. #define SPECIAL 13 // requires special handling
  62. #define FMODRM 14
  63. #define FUMODRM 15
  64. #define FNSMODRM 16
  65. #define NO2 17
  66. #define SHFT 18
  67. #define AXMODRM 19
  68. #define AX_IM 20 // EAX, immediate
  69. #define FMODRMR 21
  70. #define FILD 22
  71. // Forms
  72. #define TEMPLATE_FORM_BINOP {AX_IM+SBIT+WBIT,IMM+SBIT+WBIT, MODRM+DBIT+WBIT, INVALID}
  73. #define TEMPLATE_FORM_CALL {LABREL2, MODRM, INVALID}
  74. #define TEMPLATE_FORM_FILD {SPECIAL, FUMODRM+FINT, INVALID}
  75. #define TEMPLATE_FORM_FLD {SPECIAL, FUMODRM, INVALID}
  76. #define TEMPLATE_FORM_INCDEC {SH_REG, MODRM+WBIT, INVALID}
  77. #define TEMPLATE_FORM_JMP {LABREL1, LABREL2, MODRM, INVALID}
  78. #define TEMPLATE_FORM_MODRM {MODRM, INVALID}
  79. #define TEMPLATE_FORM_MODRMW {MODRM+WBIT, INVALID}
  80. #define TEMPLATE_FORM_MOV {AX_MEM+WBIT, SHIMR, IMM+WBIT, MODRM+WBIT+DBIT, INVALID}
  81. #define TEMPLATE_FORM_MULDIV {AXMODRM+WBIT, INVALID}
  82. #define TEMPLATE_FORM_NO {NO, INVALID}
  83. #define TEMPLATE_FORM_PSHPOP {SH_REG, SH_IM+SBIT, MODRM, INVALID}
  84. #define TEMPLATE_FORM_SHIFT {SHFT+WBIT, INVALID}
  85. #define TEMPLATE_FORM_SPECIAL {SPECIAL, INVALID}
  86. #define TEMPLATE_FORM_SPMOD {SPECIAL, MODRM, INVALID}
  87. #define TEMPLATE_FORM_TEST {AX_IM+WBIT, IMM+WBIT, MODRM+WBIT, INVALID}
  88. #define TEMPLATE_FORM_TEST_AH {IMM+WBIT, INVALID}
  89. #define TEMPLATE_FORM_XCHG {SPECIAL, MODRM+WBIT, INVALID}
  90. enum Forms : BYTE
  91. {
  92. FORM_BINOP,
  93. FORM_CALL,
  94. FORM_FILD,
  95. FORM_FLD,
  96. FORM_INCDEC,
  97. FORM_JMP,
  98. FORM_MODRM,
  99. FORM_MODRMW,
  100. FORM_MOV,
  101. FORM_MULDIV,
  102. FORM_NO,
  103. FORM_PSHPOP,
  104. FORM_SHIFT,
  105. FORM_SPECIAL,
  106. FORM_SPMOD,
  107. FORM_TEST,
  108. FORM_TEST_AH,
  109. FORM_XCHG
  110. };
  111. // LeadIn
  112. #define OLB_NONE 0x1
  113. #define OLB_0F3A 0x2
  114. // OpBytes
  115. #define OPBYTE_ADD {0x4, 0x80, 0x0} // binop, byte2=0x0
  116. #define OPBYTE_ADC {0x14, 0x80, 0x10} // binop, byte2=0x0
  117. #define OPBYTE_ADDPD {0x58} // modrm
  118. #define OPBYTE_ADDPS {0x58} // modrm
  119. #define OPBYTE_ADDSD {0x58} // modrm
  120. #define OPBYTE_ADDSS {0x58} // modrm
  121. #define OPBYTE_AND {0x24, 0x80, 0x20} // binop, byte2=0x4
  122. #define OPBYTE_ANDNPD {0x55} // modrm
  123. #define OPBYTE_ANDNPS {0x55} // modrm
  124. #define OPBYTE_ANDPD {0x54} // modrm
  125. #define OPBYTE_ANDPS {0x54} // modrm
  126. #define OPBYTE_BSF {0xbc} // modrm
  127. #define OPBYTE_BSR {0xbd} // modrm
  128. #define OPBYTE_BT {0xba, 0xa3} // special, modrm
  129. #define OPBYTE_BTR {0xba, 0xb3} // special, modrm
  130. #define OPBYTE_CALL {0xe8, 0xff} // call, byte2=2
  131. #define OPBYTE_CDQ {0x99} // no
  132. #define OPBYTE_CMOVA {0x47} // modrm
  133. #define OPBYTE_CMOVAE {0x43} // modrm
  134. #define OPBYTE_CMOVB {0x42} // modrm
  135. #define OPBYTE_CMOVBE {0x46} // modrm
  136. #define OPBYTE_CMOVE {0x44} // modrm
  137. #define OPBYTE_CMOVG {0x4F} // modrm
  138. #define OPBYTE_CMOVGE {0x4D} // modrm
  139. #define OPBYTE_CMOVL {0x4C} // modrm
  140. #define OPBYTE_CMOVLE {0x4E} // modrm
  141. #define OPBYTE_CMOVNE {0x45} // modrm
  142. #define OPBYTE_CMOVNO {0x41} // modrm
  143. #define OPBYTE_CMOVNP {0x4B} // modrm
  144. #define OPBYTE_CMOVNS {0x49} // modrm
  145. #define OPBYTE_CMOVO {0x40} // modrm
  146. #define OPBYTE_CMOVP {0x4A} // modrm
  147. #define OPBYTE_CMOVS {0x48} // modrm
  148. #define OPBYTE_CMP {0x3c, 0x80, 0x38} // binop, byte2=7
  149. #define OPBYTE_CMPPD {0xc2} // modrm
  150. #define OPBYTE_CMPPS {0xc2} // modrm
  151. #define OPBYTE_COMISD {0x2F} // modrm
  152. #define OPBYTE_COMISS {0x2F} // modrm
  153. #define OPBYTE_CVTDQ2PD {0xE6} // modrm
  154. #define OPBYTE_CVTDQ2PS {0x5B} // special (modrm)
  155. #define OPBYTE_CVTPD2PS {0x5A} // modrm
  156. #define OPBYTE_CVTTPS2DQ {0x5B} // special (modrm)
  157. #define OPBYTE_CVTTPD2DQ {0xE6} // modrm
  158. #define OPBYTE_CVTSD2SI {0x2D} // modrm
  159. #define OPBYTE_CVTSI2SD {0x2A} // modrm
  160. #define OPBYTE_CVTSI2SS {0x2A} // modrm
  161. #define OPBYTE_CVTPS2PD {0x5A} // modrm
  162. #define OPBYTE_CVTSD2SS {0x5A} // modrm
  163. #define OPBYTE_CVTSS2SD {0x5A} // modrm
  164. #define OPBYTE_CVTSS2SI {0x2D} // modrm
  165. #define OPBYTE_CVTTSD2SI {0x2C} // modrm
  166. #define OPBYTE_CVTTSS2SI {0x2C} // modrm
  167. #define OPBYTE_DEC {0x48, 0xfe} // incdec, byte2=1
  168. #define OPBYTE_DIV {0xf6} // imul, byte2=6
  169. #define OPBYTE_DIVPS {0x5E} // modrm
  170. #define OPBYTE_DIVPD {0x5E} // modrm
  171. #define OPBYTE_DIVSD {0x5E} // modrm
  172. #define OPBYTE_DIVSS {0x5E} // modrm
  173. #define OPBYTE_FISTTP {0xDD, 0xDB} // modrm
  174. #define OPBYTE_FLD {0xd9, 0xd9} // fld, byte2=0
  175. #define OPBYTE_FSTP {0xd9, 0xd9} // fld, byte2=3
  176. #define OPBYTE_IDIV {0xf6} // imul, byte2=7
  177. #define OPBYTE_IMUL {0xf6} // imul, byte2=5
  178. #define OPBYTE_IMUL2 {0x69, 0xaf} // special, modrm
  179. #define OPBYTE_INC {0x40, 0xfe} // incdec, byte2=0
  180. #define OPBYTE_INT {0xcc} // special
  181. #define OPBYTE_JCC {0x70, 0x80} // jcc
  182. #define OPBYTE_JMP {0xeb, 0xe9, 0xff} // jmp, byte2=4
  183. #define OPBYTE_LAHF {0x9f} // no
  184. #define OPBYTE_LEA {0x8d} // modrm
  185. #define OPBYTE_MAXPD {0x5f} // modrm
  186. #define OPBYTE_MAXPS {0x5f} // modrm
  187. #define OPBYTE_MINPD {0x5d} // modrm
  188. #define OPBYTE_MINPS {0x5d} // modrm
  189. #define OPBYTE_TZCNT {0xbc} // modrm
  190. #define OPBYTE_LZCNT {0xbd} // modrm
  191. #define OPBYTE_MOV {0xa0, 0xb0, 0xc6, 0x88} // mov, byte2=0
  192. #define OPBYTE_MOVAPS {0x28} // special
  193. #define OPBYTE_MOVD {0x6e} // special
  194. #define OPBYTE_MOVHLPS {0x12} // modrm
  195. #define OPBYTE_MOVHPD {0x16} // special
  196. #define OPBYTE_MOVLHPS {0x16} // modrm
  197. #define OPBYTE_MOVMSKPD {0x50} // modrm
  198. #define OPBYTE_MOVMSKPS {0x50} // modrm
  199. #define OPBYTE_MOVSD {0x10} // special
  200. #define OPBYTE_MOVSS {0x10} // special
  201. #define OPBYTE_MOVSX {0xbe} // modrm
  202. #define OPBYTE_MOVSXW {0xbf} // modrm
  203. #define OPBYTE_MOVUPS {0x10} // special
  204. #define OPBYTE_MOVZX {0xb6} // modrm
  205. #define OPBYTE_MOVZXW {0xb7} // modrm
  206. #define OPBYTE_MULPD {0x59} // modrm
  207. #define OPBYTE_MULPS {0x59} // modrm
  208. #define OPBYTE_MULSD {0x59} // modrm
  209. #define OPBYTE_MULSS {0x59} // modrm
  210. #define OPBYTE_NEG {0xf6} // modrm, byte2=3
  211. #define OPBYTE_NOP {0x90} // no
  212. #define OPBYTE_NOT {0xf6} // modrm, byte2=2
  213. #define OPBYTE_OR {0x0c, 0x80, 0x08} // binop, byte2=0x1
  214. #define OPBYTE_ORPS {0x56} // modrm
  215. #define OPBYTE_PADDB {0xfc} // modrm
  216. #define OPBYTE_PADDD {0xfe} // modrm
  217. #define OPBYTE_PADDW {0xfd} // modrm
  218. #define OPBYTE_PADDSB {0xec} // modrm
  219. #define OPBYTE_PADDSW {0xed} // modrm
  220. #define OPBYTE_PADDUSB {0xdc} // modrm
  221. #define OPBYTE_PADDUSW {0xdd} // modrm
  222. #define OPBYTE_PAND {0xdb} // modrm
  223. #define OPBYTE_PANDN {0xdf} // modrm
  224. #define OPBYTE_PCMPEQB {0x74} // modrm
  225. #define OPBYTE_PCMPEQD {0x76} // modrm
  226. #define OPBYTE_PCMPEQW {0x75} // modrm
  227. #define OPBYTE_PCMPGTB {0x64} // modrm
  228. #define OPBYTE_PCMPGTD {0x66} // modrm
  229. #define OPBYTE_PCMPGTW {0x65} // modrm
  230. #define OPBYTE_PMAXSW {0xee} // modrm
  231. #define OPBYTE_PMAXUB {0xde} // modrm
  232. #define OPBYTE_PMINSW {0xea} // modrm
  233. #define OPBYTE_PMINUB {0xda} // modrm
  234. #define OPBYTE_PMOVMSKB {0xd7} // modrm
  235. #define OPBYTE_PMULLW {0xd5} // modrm
  236. #define OPBYTE_PMULUDQ {0xf4} // modrm
  237. #define OPBYTE_PMULLW {0xd5} // modrm
  238. #define OPBYTE_POP {0x58, 0, 0x8f} // pshpop, byte2=0 immed not legal
  239. #define OPBYTE_POR {0xeb} // modrm
  240. #define OPBYTE_POPCNT {0xB8} // modrm
  241. #define OPBYTE_PSHUFD {0x70} // special
  242. #define OPBYTE_PEXTRW {0xc5} // special
  243. #define OPBYTE_PINSRW {0xc4} // special
  244. #define OPBYTE_PSLLDQ {0x73} // mmxshift
  245. #define OPBYTE_PSRLDQ {0x73} // mmxshift
  246. #define OPBYTE_PSLLW {0x71} // mmx lane shift
  247. #define OPBYTE_PSLLD {0x72} // mmx lane shift
  248. #define OPBYTE_PSRAW {0x71} // mmx lane shift
  249. #define OPBYTE_PSRAD {0x72} // mmx lane shift
  250. #define OPBYTE_PSRLW {0x71} // mmx lane shift
  251. #define OPBYTE_PSRLD {0x72} // mmx lane shift
  252. #define OPBYTE_PSUBB {0xf8} // modrm
  253. #define OPBYTE_PSUBD {0xfa} // modrm
  254. #define OPBYTE_PSUBW {0xf9} // modrm
  255. #define OPBYTE_PSUBSB {0xe8} // modrm
  256. #define OPBYTE_PSUBSW {0xe9} // modrm
  257. #define OPBYTE_PSUBUSB {0xd8} // modrm
  258. #define OPBYTE_PSUBUSW {0xd9} // modrm
  259. #define OPBYTE_PUNPCKLBW {0x60} // modrm
  260. #define OPBYTE_PUNPCKLWD {0x61} // modrm
  261. #define OPBYTE_PUNPCKLDQ {0x62} // modrm
  262. #define OPBYTE_PUNPCKLWD {0x61} // modrm
  263. #define OPBYTE_PUSH {0x50, 0x68, 0xff} // pshpop, byte2=6
  264. #define OPBYTE_PXOR {0xef} // modrm
  265. #define OPBYTE_RET {0xc2} // special
  266. #define OPBYTE_ROL {0xc0, 0xd2} // shift, byte2=0
  267. #define OPBYTE_ROR {0xc0, 0xd2} // shift, byte2=1
  268. #define OPBYTE_ROUNDSD {0x0B} // modrm
  269. #define OPBYTE_ROUNDSS {0x0A} // modrm
  270. #define OPBYTE_SAR {0xc0, 0xd2} // shift, byte2=7
  271. #define OPBYTE_SBB {0x1c, 0x80, 0x18} // binop, byte2=3
  272. #define OPBYTE_SETO {0x90} // modrm
  273. #define OPBYTE_SETNO {0x91} // modrm
  274. #define OPBYTE_SETB {0x92} // modrm
  275. #define OPBYTE_SETAE {0x93} // modrm
  276. #define OPBYTE_SETE {0x94} // modrm
  277. #define OPBYTE_SETNE {0x95} // modrm
  278. #define OPBYTE_SETBE {0x96} // modrm
  279. #define OPBYTE_SETA {0x97} // modrm
  280. #define OPBYTE_SETS {0x98} // modrm
  281. #define OPBYTE_SETNS {0x99} // modrm
  282. #define OPBYTE_SETP {0x9a} // modrm
  283. #define OPBYTE_SETNP {0x9b} // modrm
  284. #define OPBYTE_SETL {0x9c} // modrm
  285. #define OPBYTE_SETGE {0x9d} // modrm
  286. #define OPBYTE_SETLE {0x9e} // modrm
  287. #define OPBYTE_SETG {0x9f} // modrm
  288. #define OPBYTE_SHL {0xc0, 0xd2} // shift, byte2=4
  289. #define OPBYTE_SHR {0xc0, 0xd2} // shift, byte2=5
  290. #define OPBYTE_SHUFPD {0xc6} // special
  291. #define OPBYTE_SHUFPS {0xc6} // special
  292. #define OPBYTE_SQRTSD {0x51} // modrm
  293. #define OPBYTE_SQRTPD {0x51} // modrm
  294. #define OPBYTE_SQRTPS {0x51} // modrm
  295. #define OPBYTE_SQRTSS {0x51} // modrm
  296. #define OPBYTE_SUB {0x2c, 0x80, 0x28} // binop, byte2=5
  297. #define OPBYTE_SUBPD {0x5C} // modrm
  298. #define OPBYTE_SUBPS {0x5C} // modrm
  299. #define OPBYTE_SUBSD {0x5C} // modrm
  300. #define OPBYTE_SUBSS {0x5C} // modrm
  301. #define OPBYTE_TEST {0xa8, 0xf6, 0x84} // test, byte2=0
  302. #define OPBYTE_TEST_AH {0xf6} // test, byte2=0
  303. #define OPBYTE_UCOMISD {0x2e} // modrm
  304. #define OPBYTE_UCOMISS {0x2E} // modrm
  305. #define OPBYTE_XCHG {0x90, 0x86} // special, modrm
  306. #define OPBYTE_XOR {0x34, 0x80, 0x30} // binop, byte2=0x6
  307. #define OPBYTE_XORPS {0x57} // modrm