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