inst.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*
  2. * Generate .byte code for some instructions not supported by old
  3. * binutils.
  4. */
  5. #ifndef X86_ASM_INST_H
  6. #define X86_ASM_INST_H
  7. #ifdef __ASSEMBLY__
  8. #define REG_NUM_INVALID 100
  9. #define REG_TYPE_R32 0
  10. #define REG_TYPE_R64 1
  11. #define REG_TYPE_XMM 2
  12. #define REG_TYPE_INVALID 100
  13. .macro R32_NUM opd r32
  14. \opd = REG_NUM_INVALID
  15. .ifc \r32,%eax
  16. \opd = 0
  17. .endif
  18. .ifc \r32,%ecx
  19. \opd = 1
  20. .endif
  21. .ifc \r32,%edx
  22. \opd = 2
  23. .endif
  24. .ifc \r32,%ebx
  25. \opd = 3
  26. .endif
  27. .ifc \r32,%esp
  28. \opd = 4
  29. .endif
  30. .ifc \r32,%ebp
  31. \opd = 5
  32. .endif
  33. .ifc \r32,%esi
  34. \opd = 6
  35. .endif
  36. .ifc \r32,%edi
  37. \opd = 7
  38. .endif
  39. #ifdef CONFIG_X86_64
  40. .ifc \r32,%r8d
  41. \opd = 8
  42. .endif
  43. .ifc \r32,%r9d
  44. \opd = 9
  45. .endif
  46. .ifc \r32,%r10d
  47. \opd = 10
  48. .endif
  49. .ifc \r32,%r11d
  50. \opd = 11
  51. .endif
  52. .ifc \r32,%r12d
  53. \opd = 12
  54. .endif
  55. .ifc \r32,%r13d
  56. \opd = 13
  57. .endif
  58. .ifc \r32,%r14d
  59. \opd = 14
  60. .endif
  61. .ifc \r32,%r15d
  62. \opd = 15
  63. .endif
  64. #endif
  65. .endm
  66. .macro R64_NUM opd r64
  67. \opd = REG_NUM_INVALID
  68. #ifdef CONFIG_X86_64
  69. .ifc \r64,%rax
  70. \opd = 0
  71. .endif
  72. .ifc \r64,%rcx
  73. \opd = 1
  74. .endif
  75. .ifc \r64,%rdx
  76. \opd = 2
  77. .endif
  78. .ifc \r64,%rbx
  79. \opd = 3
  80. .endif
  81. .ifc \r64,%rsp
  82. \opd = 4
  83. .endif
  84. .ifc \r64,%rbp
  85. \opd = 5
  86. .endif
  87. .ifc \r64,%rsi
  88. \opd = 6
  89. .endif
  90. .ifc \r64,%rdi
  91. \opd = 7
  92. .endif
  93. .ifc \r64,%r8
  94. \opd = 8
  95. .endif
  96. .ifc \r64,%r9
  97. \opd = 9
  98. .endif
  99. .ifc \r64,%r10
  100. \opd = 10
  101. .endif
  102. .ifc \r64,%r11
  103. \opd = 11
  104. .endif
  105. .ifc \r64,%r12
  106. \opd = 12
  107. .endif
  108. .ifc \r64,%r13
  109. \opd = 13
  110. .endif
  111. .ifc \r64,%r14
  112. \opd = 14
  113. .endif
  114. .ifc \r64,%r15
  115. \opd = 15
  116. .endif
  117. #endif
  118. .endm
  119. .macro XMM_NUM opd xmm
  120. \opd = REG_NUM_INVALID
  121. .ifc \xmm,%xmm0
  122. \opd = 0
  123. .endif
  124. .ifc \xmm,%xmm1
  125. \opd = 1
  126. .endif
  127. .ifc \xmm,%xmm2
  128. \opd = 2
  129. .endif
  130. .ifc \xmm,%xmm3
  131. \opd = 3
  132. .endif
  133. .ifc \xmm,%xmm4
  134. \opd = 4
  135. .endif
  136. .ifc \xmm,%xmm5
  137. \opd = 5
  138. .endif
  139. .ifc \xmm,%xmm6
  140. \opd = 6
  141. .endif
  142. .ifc \xmm,%xmm7
  143. \opd = 7
  144. .endif
  145. .ifc \xmm,%xmm8
  146. \opd = 8
  147. .endif
  148. .ifc \xmm,%xmm9
  149. \opd = 9
  150. .endif
  151. .ifc \xmm,%xmm10
  152. \opd = 10
  153. .endif
  154. .ifc \xmm,%xmm11
  155. \opd = 11
  156. .endif
  157. .ifc \xmm,%xmm12
  158. \opd = 12
  159. .endif
  160. .ifc \xmm,%xmm13
  161. \opd = 13
  162. .endif
  163. .ifc \xmm,%xmm14
  164. \opd = 14
  165. .endif
  166. .ifc \xmm,%xmm15
  167. \opd = 15
  168. .endif
  169. .endm
  170. .macro REG_TYPE type reg
  171. R32_NUM reg_type_r32 \reg
  172. R64_NUM reg_type_r64 \reg
  173. XMM_NUM reg_type_xmm \reg
  174. .if reg_type_r64 <> REG_NUM_INVALID
  175. \type = REG_TYPE_R64
  176. .elseif reg_type_r32 <> REG_NUM_INVALID
  177. \type = REG_TYPE_R32
  178. .elseif reg_type_xmm <> REG_NUM_INVALID
  179. \type = REG_TYPE_XMM
  180. .else
  181. \type = REG_TYPE_INVALID
  182. .endif
  183. .endm
  184. .macro PFX_OPD_SIZE
  185. .byte 0x66
  186. .endm
  187. .macro PFX_REX opd1 opd2 W=0
  188. .if ((\opd1 | \opd2) & 8) || \W
  189. .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3)
  190. .endif
  191. .endm
  192. .macro MODRM mod opd1 opd2
  193. .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
  194. .endm
  195. .macro PSHUFB_XMM xmm1 xmm2
  196. XMM_NUM pshufb_opd1 \xmm1
  197. XMM_NUM pshufb_opd2 \xmm2
  198. PFX_OPD_SIZE
  199. PFX_REX pshufb_opd1 pshufb_opd2
  200. .byte 0x0f, 0x38, 0x00
  201. MODRM 0xc0 pshufb_opd1 pshufb_opd2
  202. .endm
  203. .macro PCLMULQDQ imm8 xmm1 xmm2
  204. XMM_NUM clmul_opd1 \xmm1
  205. XMM_NUM clmul_opd2 \xmm2
  206. PFX_OPD_SIZE
  207. PFX_REX clmul_opd1 clmul_opd2
  208. .byte 0x0f, 0x3a, 0x44
  209. MODRM 0xc0 clmul_opd1 clmul_opd2
  210. .byte \imm8
  211. .endm
  212. .macro PEXTRD imm8 xmm gpr
  213. R32_NUM extrd_opd1 \gpr
  214. XMM_NUM extrd_opd2 \xmm
  215. PFX_OPD_SIZE
  216. PFX_REX extrd_opd1 extrd_opd2
  217. .byte 0x0f, 0x3a, 0x16
  218. MODRM 0xc0 extrd_opd1 extrd_opd2
  219. .byte \imm8
  220. .endm
  221. .macro AESKEYGENASSIST rcon xmm1 xmm2
  222. XMM_NUM aeskeygen_opd1 \xmm1
  223. XMM_NUM aeskeygen_opd2 \xmm2
  224. PFX_OPD_SIZE
  225. PFX_REX aeskeygen_opd1 aeskeygen_opd2
  226. .byte 0x0f, 0x3a, 0xdf
  227. MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2
  228. .byte \rcon
  229. .endm
  230. .macro AESIMC xmm1 xmm2
  231. XMM_NUM aesimc_opd1 \xmm1
  232. XMM_NUM aesimc_opd2 \xmm2
  233. PFX_OPD_SIZE
  234. PFX_REX aesimc_opd1 aesimc_opd2
  235. .byte 0x0f, 0x38, 0xdb
  236. MODRM 0xc0 aesimc_opd1 aesimc_opd2
  237. .endm
  238. .macro AESENC xmm1 xmm2
  239. XMM_NUM aesenc_opd1 \xmm1
  240. XMM_NUM aesenc_opd2 \xmm2
  241. PFX_OPD_SIZE
  242. PFX_REX aesenc_opd1 aesenc_opd2
  243. .byte 0x0f, 0x38, 0xdc
  244. MODRM 0xc0 aesenc_opd1 aesenc_opd2
  245. .endm
  246. .macro AESENCLAST xmm1 xmm2
  247. XMM_NUM aesenclast_opd1 \xmm1
  248. XMM_NUM aesenclast_opd2 \xmm2
  249. PFX_OPD_SIZE
  250. PFX_REX aesenclast_opd1 aesenclast_opd2
  251. .byte 0x0f, 0x38, 0xdd
  252. MODRM 0xc0 aesenclast_opd1 aesenclast_opd2
  253. .endm
  254. .macro AESDEC xmm1 xmm2
  255. XMM_NUM aesdec_opd1 \xmm1
  256. XMM_NUM aesdec_opd2 \xmm2
  257. PFX_OPD_SIZE
  258. PFX_REX aesdec_opd1 aesdec_opd2
  259. .byte 0x0f, 0x38, 0xde
  260. MODRM 0xc0 aesdec_opd1 aesdec_opd2
  261. .endm
  262. .macro AESDECLAST xmm1 xmm2
  263. XMM_NUM aesdeclast_opd1 \xmm1
  264. XMM_NUM aesdeclast_opd2 \xmm2
  265. PFX_OPD_SIZE
  266. PFX_REX aesdeclast_opd1 aesdeclast_opd2
  267. .byte 0x0f, 0x38, 0xdf
  268. MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2
  269. .endm
  270. .macro MOVQ_R64_XMM opd1 opd2
  271. REG_TYPE movq_r64_xmm_opd1_type \opd1
  272. .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
  273. XMM_NUM movq_r64_xmm_opd1 \opd1
  274. R64_NUM movq_r64_xmm_opd2 \opd2
  275. .else
  276. R64_NUM movq_r64_xmm_opd1 \opd1
  277. XMM_NUM movq_r64_xmm_opd2 \opd2
  278. .endif
  279. PFX_OPD_SIZE
  280. PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1
  281. .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
  282. .byte 0x0f, 0x7e
  283. .else
  284. .byte 0x0f, 0x6e
  285. .endif
  286. MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2
  287. .endm
  288. #endif
  289. #endif