inst.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. .macro XMM_NUM opd xmm
  9. .ifc \xmm,%xmm0
  10. \opd = 0
  11. .endif
  12. .ifc \xmm,%xmm1
  13. \opd = 1
  14. .endif
  15. .ifc \xmm,%xmm2
  16. \opd = 2
  17. .endif
  18. .ifc \xmm,%xmm3
  19. \opd = 3
  20. .endif
  21. .ifc \xmm,%xmm4
  22. \opd = 4
  23. .endif
  24. .ifc \xmm,%xmm5
  25. \opd = 5
  26. .endif
  27. .ifc \xmm,%xmm6
  28. \opd = 6
  29. .endif
  30. .ifc \xmm,%xmm7
  31. \opd = 7
  32. .endif
  33. .ifc \xmm,%xmm8
  34. \opd = 8
  35. .endif
  36. .ifc \xmm,%xmm9
  37. \opd = 9
  38. .endif
  39. .ifc \xmm,%xmm10
  40. \opd = 10
  41. .endif
  42. .ifc \xmm,%xmm11
  43. \opd = 11
  44. .endif
  45. .ifc \xmm,%xmm12
  46. \opd = 12
  47. .endif
  48. .ifc \xmm,%xmm13
  49. \opd = 13
  50. .endif
  51. .ifc \xmm,%xmm14
  52. \opd = 14
  53. .endif
  54. .ifc \xmm,%xmm15
  55. \opd = 15
  56. .endif
  57. .endm
  58. .macro PFX_OPD_SIZE
  59. .byte 0x66
  60. .endm
  61. .macro PFX_REX opd1 opd2
  62. .if (\opd1 | \opd2) & 8
  63. .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1)
  64. .endif
  65. .endm
  66. .macro MODRM mod opd1 opd2
  67. .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
  68. .endm
  69. .macro PSHUFB_XMM xmm1 xmm2
  70. XMM_NUM pshufb_opd1 \xmm1
  71. XMM_NUM pshufb_opd2 \xmm2
  72. PFX_OPD_SIZE
  73. PFX_REX pshufb_opd1 pshufb_opd2
  74. .byte 0x0f, 0x38, 0x00
  75. MODRM 0xc0 pshufb_opd1 pshufb_opd2
  76. .endm
  77. .macro PCLMULQDQ imm8 xmm1 xmm2
  78. XMM_NUM clmul_opd1 \xmm1
  79. XMM_NUM clmul_opd2 \xmm2
  80. PFX_OPD_SIZE
  81. PFX_REX clmul_opd1 clmul_opd2
  82. .byte 0x0f, 0x3a, 0x44
  83. MODRM 0xc0 clmul_opd1 clmul_opd2
  84. .byte \imm8
  85. .endm
  86. .macro AESKEYGENASSIST rcon xmm1 xmm2
  87. XMM_NUM aeskeygen_opd1 \xmm1
  88. XMM_NUM aeskeygen_opd2 \xmm2
  89. PFX_OPD_SIZE
  90. PFX_REX aeskeygen_opd1 aeskeygen_opd2
  91. .byte 0x0f, 0x3a, 0xdf
  92. MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2
  93. .byte \rcon
  94. .endm
  95. .macro AESIMC xmm1 xmm2
  96. XMM_NUM aesimc_opd1 \xmm1
  97. XMM_NUM aesimc_opd2 \xmm2
  98. PFX_OPD_SIZE
  99. PFX_REX aesimc_opd1 aesimc_opd2
  100. .byte 0x0f, 0x38, 0xdb
  101. MODRM 0xc0 aesimc_opd1 aesimc_opd2
  102. .endm
  103. .macro AESENC xmm1 xmm2
  104. XMM_NUM aesenc_opd1 \xmm1
  105. XMM_NUM aesenc_opd2 \xmm2
  106. PFX_OPD_SIZE
  107. PFX_REX aesenc_opd1 aesenc_opd2
  108. .byte 0x0f, 0x38, 0xdc
  109. MODRM 0xc0 aesenc_opd1 aesenc_opd2
  110. .endm
  111. .macro AESENCLAST xmm1 xmm2
  112. XMM_NUM aesenclast_opd1 \xmm1
  113. XMM_NUM aesenclast_opd2 \xmm2
  114. PFX_OPD_SIZE
  115. PFX_REX aesenclast_opd1 aesenclast_opd2
  116. .byte 0x0f, 0x38, 0xdd
  117. MODRM 0xc0 aesenclast_opd1 aesenclast_opd2
  118. .endm
  119. .macro AESDEC xmm1 xmm2
  120. XMM_NUM aesdec_opd1 \xmm1
  121. XMM_NUM aesdec_opd2 \xmm2
  122. PFX_OPD_SIZE
  123. PFX_REX aesdec_opd1 aesdec_opd2
  124. .byte 0x0f, 0x38, 0xde
  125. MODRM 0xc0 aesdec_opd1 aesdec_opd2
  126. .endm
  127. .macro AESDECLAST xmm1 xmm2
  128. XMM_NUM aesdeclast_opd1 \xmm1
  129. XMM_NUM aesdeclast_opd2 \xmm2
  130. PFX_OPD_SIZE
  131. PFX_REX aesdeclast_opd1 aesdeclast_opd2
  132. .byte 0x0f, 0x38, 0xdf
  133. MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2
  134. .endm
  135. #endif
  136. #endif