arch.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package x86_64
  2. import (
  3. `fmt`
  4. )
  5. // ISA represents an extension to x86-64 instruction set.
  6. type ISA uint64
  7. const (
  8. ISA_CPUID ISA = 1 << iota
  9. ISA_RDTSC
  10. ISA_RDTSCP
  11. ISA_CMOV
  12. ISA_MOVBE
  13. ISA_POPCNT
  14. ISA_LZCNT
  15. ISA_TBM
  16. ISA_BMI
  17. ISA_BMI2
  18. ISA_ADX
  19. ISA_MMX
  20. ISA_MMX_PLUS
  21. ISA_FEMMS
  22. ISA_3DNOW
  23. ISA_3DNOW_PLUS
  24. ISA_SSE
  25. ISA_SSE2
  26. ISA_SSE3
  27. ISA_SSSE3
  28. ISA_SSE4A
  29. ISA_SSE4_1
  30. ISA_SSE4_2
  31. ISA_FMA3
  32. ISA_FMA4
  33. ISA_XOP
  34. ISA_F16C
  35. ISA_AVX
  36. ISA_AVX2
  37. ISA_AVX512F
  38. ISA_AVX512BW
  39. ISA_AVX512DQ
  40. ISA_AVX512VL
  41. ISA_AVX512PF
  42. ISA_AVX512ER
  43. ISA_AVX512CD
  44. ISA_AVX512VBMI
  45. ISA_AVX512IFMA
  46. ISA_AVX512VPOPCNTDQ
  47. ISA_AVX512_4VNNIW
  48. ISA_AVX512_4FMAPS
  49. ISA_PREFETCH
  50. ISA_PREFETCHW
  51. ISA_PREFETCHWT1
  52. ISA_CLFLUSH
  53. ISA_CLFLUSHOPT
  54. ISA_CLWB
  55. ISA_CLZERO
  56. ISA_RDRAND
  57. ISA_RDSEED
  58. ISA_PCLMULQDQ
  59. ISA_AES
  60. ISA_SHA
  61. ISA_MONITOR
  62. ISA_MONITORX
  63. ISA_ALL = ^ISA(0)
  64. )
  65. var _ISA_NAMES = map[ISA]string {
  66. ISA_CPUID : "CPUID",
  67. ISA_RDTSC : "RDTSC",
  68. ISA_RDTSCP : "RDTSCP",
  69. ISA_CMOV : "CMOV",
  70. ISA_MOVBE : "MOVBE",
  71. ISA_POPCNT : "POPCNT",
  72. ISA_LZCNT : "LZCNT",
  73. ISA_TBM : "TBM",
  74. ISA_BMI : "BMI",
  75. ISA_BMI2 : "BMI2",
  76. ISA_ADX : "ADX",
  77. ISA_MMX : "MMX",
  78. ISA_MMX_PLUS : "MMX+",
  79. ISA_FEMMS : "FEMMS",
  80. ISA_3DNOW : "3dnow!",
  81. ISA_3DNOW_PLUS : "3dnow!+",
  82. ISA_SSE : "SSE",
  83. ISA_SSE2 : "SSE2",
  84. ISA_SSE3 : "SSE3",
  85. ISA_SSSE3 : "SSSE3",
  86. ISA_SSE4A : "SSE4A",
  87. ISA_SSE4_1 : "SSE4.1",
  88. ISA_SSE4_2 : "SSE4.2",
  89. ISA_FMA3 : "FMA3",
  90. ISA_FMA4 : "FMA4",
  91. ISA_XOP : "XOP",
  92. ISA_F16C : "F16C",
  93. ISA_AVX : "AVX",
  94. ISA_AVX2 : "AVX2",
  95. ISA_AVX512F : "AVX512F",
  96. ISA_AVX512BW : "AVX512BW",
  97. ISA_AVX512DQ : "AVX512DQ",
  98. ISA_AVX512VL : "AVX512VL",
  99. ISA_AVX512PF : "AVX512PF",
  100. ISA_AVX512ER : "AVX512ER",
  101. ISA_AVX512CD : "AVX512CD",
  102. ISA_AVX512VBMI : "AVX512VBMI",
  103. ISA_AVX512IFMA : "AVX512IFMA",
  104. ISA_AVX512VPOPCNTDQ : "AVX512VPOPCNTDQ",
  105. ISA_AVX512_4VNNIW : "AVX512_4VNNIW",
  106. ISA_AVX512_4FMAPS : "AVX512_4FMAPS",
  107. ISA_PREFETCH : "PREFETCH",
  108. ISA_PREFETCHW : "PREFETCHW",
  109. ISA_PREFETCHWT1 : "PREFETCHWT1",
  110. ISA_CLFLUSH : "CLFLUSH",
  111. ISA_CLFLUSHOPT : "CLFLUSHOPT",
  112. ISA_CLWB : "CLWB",
  113. ISA_CLZERO : "CLZERO",
  114. ISA_RDRAND : "RDRAND",
  115. ISA_RDSEED : "RDSEED",
  116. ISA_PCLMULQDQ : "PCLMULQDQ",
  117. ISA_AES : "AES",
  118. ISA_SHA : "SHA",
  119. ISA_MONITOR : "MONITOR",
  120. ISA_MONITORX : "MONITORX",
  121. }
  122. var _ISA_MAPPING = map[string]ISA {
  123. "CPUID" : ISA_CPUID,
  124. "RDTSC" : ISA_RDTSC,
  125. "RDTSCP" : ISA_RDTSCP,
  126. "CMOV" : ISA_CMOV,
  127. "MOVBE" : ISA_MOVBE,
  128. "POPCNT" : ISA_POPCNT,
  129. "LZCNT" : ISA_LZCNT,
  130. "TBM" : ISA_TBM,
  131. "BMI" : ISA_BMI,
  132. "BMI2" : ISA_BMI2,
  133. "ADX" : ISA_ADX,
  134. "MMX" : ISA_MMX,
  135. "MMX+" : ISA_MMX_PLUS,
  136. "FEMMS" : ISA_FEMMS,
  137. "3dnow!" : ISA_3DNOW,
  138. "3dnow!+" : ISA_3DNOW_PLUS,
  139. "SSE" : ISA_SSE,
  140. "SSE2" : ISA_SSE2,
  141. "SSE3" : ISA_SSE3,
  142. "SSSE3" : ISA_SSSE3,
  143. "SSE4A" : ISA_SSE4A,
  144. "SSE4.1" : ISA_SSE4_1,
  145. "SSE4.2" : ISA_SSE4_2,
  146. "FMA3" : ISA_FMA3,
  147. "FMA4" : ISA_FMA4,
  148. "XOP" : ISA_XOP,
  149. "F16C" : ISA_F16C,
  150. "AVX" : ISA_AVX,
  151. "AVX2" : ISA_AVX2,
  152. "AVX512F" : ISA_AVX512F,
  153. "AVX512BW" : ISA_AVX512BW,
  154. "AVX512DQ" : ISA_AVX512DQ,
  155. "AVX512VL" : ISA_AVX512VL,
  156. "AVX512PF" : ISA_AVX512PF,
  157. "AVX512ER" : ISA_AVX512ER,
  158. "AVX512CD" : ISA_AVX512CD,
  159. "AVX512VBMI" : ISA_AVX512VBMI,
  160. "AVX512IFMA" : ISA_AVX512IFMA,
  161. "AVX512VPOPCNTDQ" : ISA_AVX512VPOPCNTDQ,
  162. "AVX512_4VNNIW" : ISA_AVX512_4VNNIW,
  163. "AVX512_4FMAPS" : ISA_AVX512_4FMAPS,
  164. "PREFETCH" : ISA_PREFETCH,
  165. "PREFETCHW" : ISA_PREFETCHW,
  166. "PREFETCHWT1" : ISA_PREFETCHWT1,
  167. "CLFLUSH" : ISA_CLFLUSH,
  168. "CLFLUSHOPT" : ISA_CLFLUSHOPT,
  169. "CLWB" : ISA_CLWB,
  170. "CLZERO" : ISA_CLZERO,
  171. "RDRAND" : ISA_RDRAND,
  172. "RDSEED" : ISA_RDSEED,
  173. "PCLMULQDQ" : ISA_PCLMULQDQ,
  174. "AES" : ISA_AES,
  175. "SHA" : ISA_SHA,
  176. "MONITOR" : ISA_MONITOR,
  177. "MONITORX" : ISA_MONITORX,
  178. }
  179. func (self ISA) String() string {
  180. if v, ok := _ISA_NAMES[self]; ok {
  181. return v
  182. } else {
  183. return fmt.Sprintf("(invalid: %#x)", uint64(self))
  184. }
  185. }
  186. // ParseISA parses name into ISA, it will panic if the name is invalid.
  187. func ParseISA(name string) ISA {
  188. if v, ok := _ISA_MAPPING[name]; ok {
  189. return v
  190. } else {
  191. panic("invalid ISA name: " + name)
  192. }
  193. }
  194. // Arch represents the x86_64 architecture.
  195. type Arch struct {
  196. isa ISA
  197. }
  198. // DefaultArch is the default architecture with all ISA enabled.
  199. var DefaultArch = CreateArch()
  200. // CreateArch creates a new Arch with all ISA enabled.
  201. func CreateArch() *Arch {
  202. return new(Arch).EnableISA(ISA_ALL)
  203. }
  204. // HasISA checks if a particular ISA was enabled.
  205. func (self *Arch) HasISA(isa ISA) bool {
  206. return (self.isa & isa) != 0
  207. }
  208. // EnableISA enables a particular ISA.
  209. func (self *Arch) EnableISA(isa ISA) *Arch {
  210. self.isa |= isa
  211. return self
  212. }
  213. // DisableISA disables a particular ISA.
  214. func (self *Arch) DisableISA(isa ISA) *Arch {
  215. self.isa &^= isa
  216. return self
  217. }
  218. // CreateProgram creates a new empty program.
  219. func (self *Arch) CreateProgram() *Program {
  220. return newProgram(self)
  221. }