opflags.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /* ----------------------------------------------------------------------- *
  2. *
  3. * Copyright 1996-2018 The NASM Authors - All Rights Reserved
  4. * See the file AUTHORS included with the NASM distribution for
  5. * the specific copyright holders.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following
  9. * conditions are met:
  10. *
  11. * * Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * * Redistributions in binary form must reproduce the above
  14. * copyright notice, this list of conditions and the following
  15. * disclaimer in the documentation and/or other materials provided
  16. * with the distribution.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  19. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  20. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  21. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  26. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  29. * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  30. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. *
  32. * ----------------------------------------------------------------------- */
  33. /*
  34. * opflags.h - operand flags
  35. */
  36. #ifndef NASM_OPFLAGS_H
  37. #define NASM_OPFLAGS_H
  38. #include "compiler.h"
  39. #include "tables.h" /* for opflags_t and nasm_reg_flags[] */
  40. #include "regs.h"
  41. /*
  42. * Here we define the operand types. These are implemented as bit
  43. * masks, since some are subsets of others; e.g. AX in a MOV
  44. * instruction is a special operand type, whereas AX in other
  45. * contexts is just another 16-bit register. (Also, consider CL in
  46. * shift instructions, DX in OUT, etc.)
  47. *
  48. * The basic concept here is that
  49. * (class & ~operand) == 0
  50. *
  51. * if and only if "operand" belongs to class type "class".
  52. */
  53. #define OP_GENMASK(bits, shift) (((UINT64_C(1) << (bits)) - 1) << (shift))
  54. #define OP_GENBIT(bit, shift) (UINT64_C(1) << ((shift) + (bit)))
  55. /*
  56. * Type of operand: memory reference, register, etc.
  57. *
  58. * Bits: 0 - 3
  59. */
  60. #define OPTYPE_SHIFT (0)
  61. #define OPTYPE_BITS (4)
  62. #define OPTYPE_MASK OP_GENMASK(OPTYPE_BITS, OPTYPE_SHIFT)
  63. #define GEN_OPTYPE(bit) OP_GENBIT(bit, OPTYPE_SHIFT)
  64. /*
  65. * Modifiers.
  66. *
  67. * Bits: 4 - 6
  68. */
  69. #define MODIFIER_SHIFT (4)
  70. #define MODIFIER_BITS (3)
  71. #define MODIFIER_MASK OP_GENMASK(MODIFIER_BITS, MODIFIER_SHIFT)
  72. #define GEN_MODIFIER(bit) OP_GENBIT(bit, MODIFIER_SHIFT)
  73. /*
  74. * Register classes.
  75. *
  76. * Bits: 7 - 16
  77. */
  78. #define REG_CLASS_SHIFT (7)
  79. #define REG_CLASS_BITS (10)
  80. #define REG_CLASS_MASK OP_GENMASK(REG_CLASS_BITS, REG_CLASS_SHIFT)
  81. #define GEN_REG_CLASS(bit) OP_GENBIT(bit, REG_CLASS_SHIFT)
  82. /*
  83. * Subclasses. Depends on type of operand.
  84. *
  85. * Bits: 17 - 24
  86. */
  87. #define SUBCLASS_SHIFT (17)
  88. #define SUBCLASS_BITS (8)
  89. #define SUBCLASS_MASK OP_GENMASK(SUBCLASS_BITS, SUBCLASS_SHIFT)
  90. #define GEN_SUBCLASS(bit) OP_GENBIT(bit, SUBCLASS_SHIFT)
  91. /*
  92. * Special flags. Context dependant.
  93. *
  94. * Bits: 25 - 31
  95. */
  96. #define SPECIAL_SHIFT (25)
  97. #define SPECIAL_BITS (7)
  98. #define SPECIAL_MASK OP_GENMASK(SPECIAL_BITS, SPECIAL_SHIFT)
  99. #define GEN_SPECIAL(bit) OP_GENBIT(bit, SPECIAL_SHIFT)
  100. /*
  101. * Sizes of the operands and attributes.
  102. *
  103. * Bits: 32 - 42
  104. */
  105. #define SIZE_SHIFT (32)
  106. #define SIZE_BITS (11)
  107. #define SIZE_MASK OP_GENMASK(SIZE_BITS, SIZE_SHIFT)
  108. #define GEN_SIZE(bit) OP_GENBIT(bit, SIZE_SHIFT)
  109. /*
  110. * Register set count
  111. *
  112. * Bits: 47 - 43
  113. */
  114. #define REGSET_SHIFT (43)
  115. #define REGSET_BITS (5)
  116. #define REGSET_MASK OP_GENMASK(REGSET_BITS, REGSET_SHIFT)
  117. #define GEN_REGSET(bit) OP_GENBIT(bit, REGSET_SHIFT)
  118. /*
  119. * Bits distribution (counted from 0)
  120. *
  121. * 6 5 4 3 2 1
  122. * 3210987654321098765432109876543210987654321098765432109876543210
  123. * |
  124. * | dword bound
  125. *
  126. * ............................................................1111 optypes
  127. * .........................................................111.... modifiers
  128. * ...............................................1111111111....... register classes
  129. * .......................................11111111................. subclasses
  130. * ................................1111111......................... specials
  131. * .....................11111111111................................ sizes
  132. * ................11111........................................... regset count
  133. */
  134. #define REGISTER GEN_OPTYPE(0) /* register number in 'basereg' */
  135. #define IMMEDIATE GEN_OPTYPE(1)
  136. #define REGMEM GEN_OPTYPE(2) /* for r/m, ie EA, operands */
  137. #define MEMORY (GEN_OPTYPE(3) | REGMEM)
  138. #define BITS8 GEN_SIZE(0) /* 8 bits (BYTE) */
  139. #define BITS16 GEN_SIZE(1) /* 16 bits (WORD) */
  140. #define BITS32 GEN_SIZE(2) /* 32 bits (DWORD) */
  141. #define BITS64 GEN_SIZE(3) /* 64 bits (QWORD), x64 and FPU only */
  142. #define BITS80 GEN_SIZE(4) /* 80 bits (TWORD), FPU only */
  143. #define BITS128 GEN_SIZE(5) /* 128 bits (OWORD) */
  144. #define BITS256 GEN_SIZE(6) /* 256 bits (YWORD) */
  145. #define BITS512 GEN_SIZE(7) /* 512 bits (ZWORD) */
  146. #define FAR GEN_SIZE(8) /* grotty: this means 16:16 or 16:32, like in CALL/JMP */
  147. #define NEAR GEN_SIZE(9)
  148. #define SHORT GEN_SIZE(10) /* and this means what it says :) */
  149. #define TO GEN_MODIFIER(0) /* reverse effect in FADD, FSUB &c */
  150. #define COLON GEN_MODIFIER(1) /* operand is followed by a colon */
  151. #define STRICT GEN_MODIFIER(2) /* do not optimize this operand */
  152. #define REG_CLASS_CDT GEN_REG_CLASS(0)
  153. #define REG_CLASS_GPR GEN_REG_CLASS(1)
  154. #define REG_CLASS_SREG GEN_REG_CLASS(2)
  155. #define REG_CLASS_FPUREG GEN_REG_CLASS(3)
  156. #define REG_CLASS_RM_MMX GEN_REG_CLASS(4)
  157. #define REG_CLASS_RM_XMM GEN_REG_CLASS(5)
  158. #define REG_CLASS_RM_YMM GEN_REG_CLASS(6)
  159. #define REG_CLASS_RM_ZMM GEN_REG_CLASS(7)
  160. #define REG_CLASS_OPMASK GEN_REG_CLASS(8)
  161. #define REG_CLASS_BND GEN_REG_CLASS(9)
  162. static inline bool is_class(opflags_t class, opflags_t op)
  163. {
  164. return !(class & ~op);
  165. }
  166. static inline bool is_reg_class(opflags_t class, opflags_t reg)
  167. {
  168. if (reg >= EXPR_REG_START && reg <= EXPR_REG_END)
  169. return is_class(class, nasm_reg_flags[reg]);
  170. return false;
  171. }
  172. #define IS_SREG(reg) is_reg_class(REG_SREG, (reg))
  173. #define IS_FSGS(reg) is_reg_class(REG_FSGS, (reg))
  174. /* Register classes */
  175. #define REG_EA ( REGMEM | REGISTER) /* 'normal' reg, qualifies as EA */
  176. #define RM_GPR ( REG_CLASS_GPR | REGMEM) /* integer operand */
  177. #define REG_GPR ( REG_CLASS_GPR | REGMEM | REGISTER) /* integer register */
  178. #define REG8 ( REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* 8-bit GPR */
  179. #define REG16 ( REG_CLASS_GPR | BITS16 | REGMEM | REGISTER) /* 16-bit GPR */
  180. #define REG32 ( REG_CLASS_GPR | BITS32 | REGMEM | REGISTER) /* 32-bit GPR */
  181. #define REG64 ( REG_CLASS_GPR | BITS64 | REGMEM | REGISTER) /* 64-bit GPR */
  182. #define FPUREG ( REG_CLASS_FPUREG | REGISTER) /* floating point stack registers */
  183. #define FPU0 (GEN_SUBCLASS(1) | REG_CLASS_FPUREG | REGISTER) /* FPU stack register zero */
  184. #define RM_MMX ( REG_CLASS_RM_MMX | REGMEM) /* MMX operand */
  185. #define MMXREG ( REG_CLASS_RM_MMX | REGMEM | REGISTER) /* MMX register */
  186. #define RM_XMM ( REG_CLASS_RM_XMM | REGMEM) /* XMM (SSE) operand */
  187. #define XMMREG ( REG_CLASS_RM_XMM | REGMEM | REGISTER) /* XMM (SSE) register */
  188. #define RM_YMM ( REG_CLASS_RM_YMM | REGMEM) /* YMM (AVX) operand */
  189. #define YMMREG ( REG_CLASS_RM_YMM | REGMEM | REGISTER) /* YMM (AVX) register */
  190. #define RM_ZMM ( REG_CLASS_RM_ZMM | REGMEM) /* ZMM (AVX512) operand */
  191. #define ZMMREG ( REG_CLASS_RM_ZMM | REGMEM | REGISTER) /* ZMM (AVX512) register */
  192. #define RM_OPMASK ( REG_CLASS_OPMASK | REGMEM) /* Opmask operand */
  193. #define OPMASKREG ( REG_CLASS_OPMASK | REGMEM | REGISTER) /* Opmask register */
  194. #define OPMASK0 (GEN_SUBCLASS(1) | REG_CLASS_OPMASK | REGMEM | REGISTER) /* Opmask register zero (k0) */
  195. #define RM_K RM_OPMASK
  196. #define KREG OPMASKREG
  197. #define RM_BND ( REG_CLASS_BND | REGMEM) /* Bounds operand */
  198. #define BNDREG ( REG_CLASS_BND | REGMEM | REGISTER) /* Bounds register */
  199. #define REG_CDT ( REG_CLASS_CDT | BITS32 | REGISTER) /* CRn, DRn and TRn */
  200. #define REG_CREG (GEN_SUBCLASS(1) | REG_CLASS_CDT | BITS32 | REGISTER) /* CRn */
  201. #define REG_DREG (GEN_SUBCLASS(2) | REG_CLASS_CDT | BITS32 | REGISTER) /* DRn */
  202. #define REG_TREG (GEN_SUBCLASS(3) | REG_CLASS_CDT | BITS32 | REGISTER) /* TRn */
  203. #define REG_SREG ( REG_CLASS_SREG | BITS16 | REGISTER) /* any segment register */
  204. /* Segment registers */
  205. #define REG_ES (GEN_SUBCLASS(0) | GEN_SUBCLASS(2) | REG_CLASS_SREG | BITS16 | REGISTER) /* ES */
  206. #define REG_CS (GEN_SUBCLASS(1) | GEN_SUBCLASS(2) | REG_CLASS_SREG | BITS16 | REGISTER) /* CS */
  207. #define REG_SS (GEN_SUBCLASS(0) | GEN_SUBCLASS(3) | REG_CLASS_SREG | BITS16 | REGISTER) /* SS */
  208. #define REG_DS (GEN_SUBCLASS(1) | GEN_SUBCLASS(3) | REG_CLASS_SREG | BITS16 | REGISTER) /* DS */
  209. #define REG_FS (GEN_SUBCLASS(0) | GEN_SUBCLASS(4) | REG_CLASS_SREG | BITS16 | REGISTER) /* FS */
  210. #define REG_GS (GEN_SUBCLASS(1) | GEN_SUBCLASS(4) | REG_CLASS_SREG | BITS16 | REGISTER) /* GS */
  211. #define REG_FSGS ( GEN_SUBCLASS(4) | REG_CLASS_SREG | BITS16 | REGISTER) /* FS or GS */
  212. #define REG_SEG67 ( GEN_SUBCLASS(5) | REG_CLASS_SREG | BITS16 | REGISTER) /* Unimplemented segment registers */
  213. /* Special GPRs */
  214. #define REG_SMASK SUBCLASS_MASK /* a mask for the following */
  215. #define REG_ACCUM (GEN_SUBCLASS(1) | REG_CLASS_GPR | REGMEM | REGISTER) /* accumulator: AL, AX, EAX, RAX */
  216. #define REG_AL (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER)
  217. #define REG_AX (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER)
  218. #define REG_EAX (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER)
  219. #define REG_RAX (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER)
  220. #define REG_COUNT (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | REGMEM | REGISTER) /* counter: CL, CX, ECX, RCX */
  221. #define REG_CL (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER)
  222. #define REG_CX (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER)
  223. #define REG_ECX (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER)
  224. #define REG_RCX (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER)
  225. #define REG_DL (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* data: DL, DX, EDX, RDX */
  226. #define REG_DX (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER)
  227. #define REG_EDX (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER)
  228. #define REG_RDX (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER)
  229. #define REG_HIGH (GEN_SUBCLASS(5) | GEN_SUBCLASS(4) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* high regs: AH, CH, DH, BH */
  230. #define REG_NOTACC GEN_SUBCLASS(5) /* non-accumulator register */
  231. #define REG8NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* 8-bit non-acc GPR */
  232. #define REG16NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER) /* 16-bit non-acc GPR */
  233. #define REG32NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER) /* 32-bit non-acc GPR */
  234. #define REG64NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER) /* 64-bit non-acc GPR */
  235. /* special types of EAs */
  236. #define MEM_OFFS (GEN_SUBCLASS(1) | MEMORY) /* simple [address] offset - absolute! */
  237. #define IP_REL (GEN_SUBCLASS(2) | MEMORY) /* IP-relative offset */
  238. #define XMEM (GEN_SUBCLASS(3) | MEMORY) /* 128-bit vector SIB */
  239. #define YMEM (GEN_SUBCLASS(4) | MEMORY) /* 256-bit vector SIB */
  240. #define ZMEM (GEN_SUBCLASS(5) | MEMORY) /* 512-bit vector SIB */
  241. /* memory which matches any type of r/m operand */
  242. #define MEMORY_ANY (MEMORY | RM_GPR | RM_MMX | RM_XMM_L16 | RM_YMM_L16 | RM_ZMM_L16 | RM_OPMASK | RM_BND)
  243. /* special immediate values */
  244. #define UNITY (GEN_SUBCLASS(0) | IMMEDIATE) /* operand equals 1 */
  245. #define SBYTEWORD (GEN_SUBCLASS(1) | IMMEDIATE) /* operand is in the range -128..127 mod 2^16 */
  246. #define SBYTEDWORD (GEN_SUBCLASS(2) | IMMEDIATE) /* operand is in the range -128..127 mod 2^32 */
  247. #define SDWORD (GEN_SUBCLASS(3) | IMMEDIATE) /* operand is in the range -0x80000000..0x7FFFFFFF */
  248. #define UDWORD (GEN_SUBCLASS(4) | IMMEDIATE) /* operand is in the range 0..0xFFFFFFFF */
  249. /*
  250. * Subset of vector registers: register 0 only and registers 0-15.
  251. * Avoid conflicts in subclass bitfield with any of special EA types!
  252. */
  253. #define RM_XMM_L16 (GEN_SUBCLASS(6) | RM_XMM) /* XMM r/m operand 0 ~ 15 */
  254. #define XMM0 (GEN_SUBCLASS(1) | GEN_SUBCLASS(6) | XMMREG) /* XMM register zero */
  255. #define XMM_L16 ( GEN_SUBCLASS(6) | XMMREG) /* XMM register 0 ~ 15 */
  256. #define RM_YMM_L16 (GEN_SUBCLASS(6) | RM_YMM) /* YMM r/m operand 0 ~ 15 */
  257. #define YMM0 (GEN_SUBCLASS(1) | GEN_SUBCLASS(6) | YMMREG) /* YMM register zero */
  258. #define YMM_L16 ( GEN_SUBCLASS(6) | YMMREG) /* YMM register 0 ~ 15 */
  259. #define RM_ZMM_L16 (GEN_SUBCLASS(6) | RM_ZMM) /* ZMM r/m operand 0 ~ 15 */
  260. #define ZMM0 (GEN_SUBCLASS(1) | GEN_SUBCLASS(6) | ZMMREG) /* ZMM register zero */
  261. #define ZMM_L16 ( GEN_SUBCLASS(6) | ZMMREG) /* ZMM register 0 ~ 15 */
  262. /* Register set sizes */
  263. #define RS2 GEN_REGSET(0)
  264. #define RS4 GEN_REGSET(1)
  265. #define RS8 GEN_REGSET(2)
  266. #define RS16 GEN_REGSET(3)
  267. #define RS32 GEN_REGSET(4)
  268. #endif /* NASM_OPFLAGS_H */