reg_sizes.asm 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Copyright(c) 2011-2015 Intel Corporation All rights reserved.
  3. ;
  4. ; Redistribution and use in source and binary forms, with or without
  5. ; modification, are permitted provided that the following conditions
  6. ; are met:
  7. ; * Redistributions of source code must retain the above copyright
  8. ; notice, this list of conditions and the following disclaimer.
  9. ; * Redistributions in binary form must reproduce the above copyright
  10. ; notice, this list of conditions and the following disclaimer in
  11. ; the documentation and/or other materials provided with the
  12. ; distribution.
  13. ; * Neither the name of Intel Corporation nor the names of its
  14. ; contributors may be used to endorse or promote products derived
  15. ; from this software without specific prior written permission.
  16. ;
  17. ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  18. ; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  19. ; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  20. ; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  21. ; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  22. ; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  23. ; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  24. ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  25. ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  27. ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. %ifndef _REG_SIZES_ASM_
  30. %define _REG_SIZES_ASM_
  31. %ifndef AS_FEATURE_LEVEL
  32. %define AS_FEATURE_LEVEL 4
  33. %endif
  34. %define EFLAGS_HAS_CPUID (1<<21)
  35. %define FLAG_CPUID1_ECX_CLMUL (1<<1)
  36. %define FLAG_CPUID1_EDX_SSE2 (1<<26)
  37. %define FLAG_CPUID1_ECX_SSE3 (1)
  38. %define FLAG_CPUID1_ECX_SSE4_1 (1<<19)
  39. %define FLAG_CPUID1_ECX_SSE4_2 (1<<20)
  40. %define FLAG_CPUID1_ECX_POPCNT (1<<23)
  41. %define FLAG_CPUID1_ECX_AESNI (1<<25)
  42. %define FLAG_CPUID1_ECX_OSXSAVE (1<<27)
  43. %define FLAG_CPUID1_ECX_AVX (1<<28)
  44. %define FLAG_CPUID1_EBX_AVX2 (1<<5)
  45. %define FLAG_CPUID7_EBX_AVX2 (1<<5)
  46. %define FLAG_CPUID7_EBX_AVX512F (1<<16)
  47. %define FLAG_CPUID7_EBX_AVX512DQ (1<<17)
  48. %define FLAG_CPUID7_EBX_AVX512IFMA (1<<21)
  49. %define FLAG_CPUID7_EBX_AVX512PF (1<<26)
  50. %define FLAG_CPUID7_EBX_AVX512ER (1<<27)
  51. %define FLAG_CPUID7_EBX_AVX512CD (1<<28)
  52. %define FLAG_CPUID7_EBX_AVX512BW (1<<30)
  53. %define FLAG_CPUID7_EBX_AVX512VL (1<<31)
  54. %define FLAG_CPUID7_ECX_AVX512VBMI (1<<1)
  55. %define FLAG_CPUID7_ECX_AVX512VBMI2 (1 << 6)
  56. %define FLAG_CPUID7_ECX_GFNI (1 << 8)
  57. %define FLAG_CPUID7_ECX_VAES (1 << 9)
  58. %define FLAG_CPUID7_ECX_VPCLMULQDQ (1 << 10)
  59. %define FLAG_CPUID7_ECX_VNNI (1 << 11)
  60. %define FLAG_CPUID7_ECX_BITALG (1 << 12)
  61. %define FLAG_CPUID7_ECX_VPOPCNTDQ (1 << 14)
  62. %define FLAGS_CPUID7_EBX_AVX512_G1 (FLAG_CPUID7_EBX_AVX512F | FLAG_CPUID7_EBX_AVX512VL | FLAG_CPUID7_EBX_AVX512BW | FLAG_CPUID7_EBX_AVX512CD | FLAG_CPUID7_EBX_AVX512DQ)
  63. %define FLAGS_CPUID7_ECX_AVX512_G2 (FLAG_CPUID7_ECX_AVX512VBMI2 | FLAG_CPUID7_ECX_GFNI | FLAG_CPUID7_ECX_VAES | FLAG_CPUID7_ECX_VPCLMULQDQ | FLAG_CPUID7_ECX_VNNI | FLAG_CPUID7_ECX_BITALG | FLAG_CPUID7_ECX_VPOPCNTDQ)
  64. %define FLAGS_CPUID7_ECX_AVX2_G2 (FLAG_CPUID7_ECX_GFNI | FLAG_CPUID7_ECX_VAES | FLAG_CPUID7_ECX_VPCLMULQDQ)
  65. %define FLAG_XGETBV_EAX_XMM (1<<1)
  66. %define FLAG_XGETBV_EAX_YMM (1<<2)
  67. %define FLAG_XGETBV_EAX_XMM_YMM 0x6
  68. %define FLAG_XGETBV_EAX_ZMM_OPM 0xe0
  69. %define FLAG_CPUID1_EAX_AVOTON 0x000406d0
  70. %define FLAG_CPUID1_EAX_STEP_MASK 0xfffffff0
  71. ; define d and w variants for registers
  72. %define raxd eax
  73. %define raxw ax
  74. %define raxb al
  75. %define rbxd ebx
  76. %define rbxw bx
  77. %define rbxb bl
  78. %define rcxd ecx
  79. %define rcxw cx
  80. %define rcxb cl
  81. %define rdxd edx
  82. %define rdxw dx
  83. %define rdxb dl
  84. %define rsid esi
  85. %define rsiw si
  86. %define rsib sil
  87. %define rdid edi
  88. %define rdiw di
  89. %define rdib dil
  90. %define rbpd ebp
  91. %define rbpw bp
  92. %define rbpb bpl
  93. %define ymm0x xmm0
  94. %define ymm1x xmm1
  95. %define ymm2x xmm2
  96. %define ymm3x xmm3
  97. %define ymm4x xmm4
  98. %define ymm5x xmm5
  99. %define ymm6x xmm6
  100. %define ymm7x xmm7
  101. %define ymm8x xmm8
  102. %define ymm9x xmm9
  103. %define ymm10x xmm10
  104. %define ymm11x xmm11
  105. %define ymm12x xmm12
  106. %define ymm13x xmm13
  107. %define ymm14x xmm14
  108. %define ymm15x xmm15
  109. %define zmm0x xmm0
  110. %define zmm1x xmm1
  111. %define zmm2x xmm2
  112. %define zmm3x xmm3
  113. %define zmm4x xmm4
  114. %define zmm5x xmm5
  115. %define zmm6x xmm6
  116. %define zmm7x xmm7
  117. %define zmm8x xmm8
  118. %define zmm9x xmm9
  119. %define zmm10x xmm10
  120. %define zmm11x xmm11
  121. %define zmm12x xmm12
  122. %define zmm13x xmm13
  123. %define zmm14x xmm14
  124. %define zmm15x xmm15
  125. %define zmm16x xmm16
  126. %define zmm17x xmm17
  127. %define zmm18x xmm18
  128. %define zmm19x xmm19
  129. %define zmm20x xmm20
  130. %define zmm21x xmm21
  131. %define zmm22x xmm22
  132. %define zmm23x xmm23
  133. %define zmm24x xmm24
  134. %define zmm25x xmm25
  135. %define zmm26x xmm26
  136. %define zmm27x xmm27
  137. %define zmm28x xmm28
  138. %define zmm29x xmm29
  139. %define zmm30x xmm30
  140. %define zmm31x xmm31
  141. %define zmm0y ymm0
  142. %define zmm1y ymm1
  143. %define zmm2y ymm2
  144. %define zmm3y ymm3
  145. %define zmm4y ymm4
  146. %define zmm5y ymm5
  147. %define zmm6y ymm6
  148. %define zmm7y ymm7
  149. %define zmm8y ymm8
  150. %define zmm9y ymm9
  151. %define zmm10y ymm10
  152. %define zmm11y ymm11
  153. %define zmm12y ymm12
  154. %define zmm13y ymm13
  155. %define zmm14y ymm14
  156. %define zmm15y ymm15
  157. %define zmm16y ymm16
  158. %define zmm17y ymm17
  159. %define zmm18y ymm18
  160. %define zmm19y ymm19
  161. %define zmm20y ymm20
  162. %define zmm21y ymm21
  163. %define zmm22y ymm22
  164. %define zmm23y ymm23
  165. %define zmm24y ymm24
  166. %define zmm25y ymm25
  167. %define zmm26y ymm26
  168. %define zmm27y ymm27
  169. %define zmm28y ymm28
  170. %define zmm29y ymm29
  171. %define zmm30y ymm30
  172. %define zmm31y ymm31
  173. %define DWORD(reg) reg %+ d
  174. %define WORD(reg) reg %+ w
  175. %define BYTE(reg) reg %+ b
  176. %define XWORD(reg) reg %+ x
  177. %ifdef INTEL_CET_ENABLED
  178. %ifdef __NASM_VER__
  179. %if AS_FEATURE_LEVEL >= 10
  180. %ifidn __OUTPUT_FORMAT__,elf32
  181. section .note.gnu.property note alloc noexec align=4
  182. DD 0x00000004,0x0000000c,0x00000005,0x00554e47
  183. DD 0xc0000002,0x00000004,0x00000003
  184. %endif
  185. %ifidn __OUTPUT_FORMAT__,elf64
  186. section .note.gnu.property note alloc noexec align=8
  187. DD 0x00000004,0x00000010,0x00000005,0x00554e47
  188. DD 0xc0000002,0x00000004,0x00000003,0x00000000
  189. %endif
  190. %endif
  191. %endif
  192. %endif
  193. %ifidn __OUTPUT_FORMAT__,elf32
  194. section .note.GNU-stack noalloc noexec nowrite progbits
  195. section .text
  196. %endif
  197. %ifidn __OUTPUT_FORMAT__,elf64
  198. %define __x86_64__
  199. section .note.GNU-stack noalloc noexec nowrite progbits
  200. section .text
  201. %endif
  202. %ifidn __OUTPUT_FORMAT__,win64
  203. %define __x86_64__
  204. %endif
  205. %ifidn __OUTPUT_FORMAT__,macho64
  206. %define __x86_64__
  207. %endif
  208. %ifdef __x86_64__
  209. %define endbranch db 0xf3, 0x0f, 0x1e, 0xfa
  210. %else
  211. %define endbranch db 0xf3, 0x0f, 0x1e, 0xfb
  212. %endif
  213. %ifdef REL_TEXT
  214. %define WRT_OPT
  215. %elifidn __OUTPUT_FORMAT__, elf64
  216. %define WRT_OPT wrt ..plt
  217. %else
  218. %define WRT_OPT
  219. %endif
  220. %macro mk_global 1-3
  221. %ifdef __NASM_VER__
  222. %ifidn __OUTPUT_FORMAT__, macho64
  223. global %1
  224. %elifidn __OUTPUT_FORMAT__, win64
  225. global %1
  226. %else
  227. global %1:%2 %3
  228. %endif
  229. %else
  230. global %1:%2 %3
  231. %endif
  232. %endmacro
  233. ; Fixes for nasm lack of MS proc helpers
  234. %ifdef __NASM_VER__
  235. %ifidn __OUTPUT_FORMAT__, win64
  236. %macro alloc_stack 1
  237. sub rsp, %1
  238. %endmacro
  239. %macro proc_frame 1
  240. %1:
  241. %endmacro
  242. %macro save_xmm128 2
  243. movdqa [rsp + %2], %1
  244. %endmacro
  245. %macro save_reg 2
  246. mov [rsp + %2], %1
  247. %endmacro
  248. %macro rex_push_reg 1
  249. push %1
  250. %endmacro
  251. %macro push_reg 1
  252. push %1
  253. %endmacro
  254. %define end_prolog
  255. %endif
  256. %define endproc_frame
  257. %endif
  258. %ifidn __OUTPUT_FORMAT__, macho64
  259. %define elf64 macho64
  260. mac_equ equ 1
  261. %endif
  262. %endif ; ifndef _REG_SIZES_ASM_