...
Source file src/internal/cpu/cpu.go
1
2
3
4
5
6
7 package cpu
8
9
10
11
12 var DebugOptions bool
13
14
15 type CacheLinePad struct{ _ [CacheLinePadSize]byte }
16
17
18
19
20 var CacheLineSize uintptr = CacheLinePadSize
21
22 var X86 x86
23
24
25
26
27
28 type x86 struct {
29 _ CacheLinePad
30 HasAES bool
31 HasADX bool
32 HasAVX bool
33 HasAVX2 bool
34 HasBMI1 bool
35 HasBMI2 bool
36 HasERMS bool
37 HasFMA bool
38 HasOSXSAVE bool
39 HasPCLMULQDQ bool
40 HasPOPCNT bool
41 HasSSE2 bool
42 HasSSE3 bool
43 HasSSSE3 bool
44 HasSSE41 bool
45 HasSSE42 bool
46 _ CacheLinePad
47 }
48
49 var PPC64 ppc64
50
51
52
53
54
55
56 type ppc64 struct {
57 _ CacheLinePad
58 HasDARN bool
59 HasSCV bool
60 IsPOWER8 bool
61 IsPOWER9 bool
62 _ CacheLinePad
63 }
64
65 var ARM arm
66
67
68
69 type arm struct {
70 _ CacheLinePad
71 HasVFPv4 bool
72 HasIDIVA bool
73 _ CacheLinePad
74 }
75
76 var ARM64 arm64
77
78
79
80 type arm64 struct {
81 _ CacheLinePad
82 HasFP bool
83 HasASIMD bool
84 HasEVTSTRM bool
85 HasAES bool
86 HasPMULL bool
87 HasSHA1 bool
88 HasSHA2 bool
89 HasCRC32 bool
90 HasATOMICS bool
91 HasFPHP bool
92 HasASIMDHP bool
93 HasCPUID bool
94 HasASIMDRDM bool
95 HasJSCVT bool
96 HasFCMA bool
97 HasLRCPC bool
98 HasDCPOP bool
99 HasSHA3 bool
100 HasSM3 bool
101 HasSM4 bool
102 HasASIMDDP bool
103 HasSHA512 bool
104 HasSVE bool
105 HasASIMDFHM bool
106 _ CacheLinePad
107 }
108
109 var S390X s390x
110
111 type s390x struct {
112 _ CacheLinePad
113 HasZARCH bool
114 HasSTFLE bool
115 HasLDISP bool
116 HasEIMM bool
117 HasDFP bool
118 HasETF3EH bool
119 HasMSA bool
120 HasAES bool
121 HasAESCBC bool
122 HasAESCTR bool
123 HasAESGCM bool
124 HasGHASH bool
125 HasSHA1 bool
126 HasSHA256 bool
127 HasSHA512 bool
128 HasSHA3 bool
129 HasVX bool
130 HasVXE bool
131 HasKDSA bool
132 HasECDSA bool
133 HasEDDSA bool
134 _ CacheLinePad
135 }
136
137
138
139
140
141 func Initialize(env string) {
142 doinit()
143 processOptions(env)
144 }
145
146
147
148
149
150 var options []option
151
152
153 type option struct {
154 Name string
155 Feature *bool
156 Specified bool
157 Enable bool
158 Required bool
159 }
160
161
162
163
164
165
166
167 func processOptions(env string) {
168 field:
169 for env != "" {
170 field := ""
171 i := indexByte(env, ',')
172 if i < 0 {
173 field, env = env, ""
174 } else {
175 field, env = env[:i], env[i+1:]
176 }
177 if len(field) < 4 || field[:4] != "cpu." {
178 continue
179 }
180 i = indexByte(field, '=')
181 if i < 0 {
182 print("GODEBUG: no value specified for \"", field, "\"\n")
183 continue
184 }
185 key, value := field[4:i], field[i+1:]
186
187 var enable bool
188 switch value {
189 case "on":
190 enable = true
191 case "off":
192 enable = false
193 default:
194 print("GODEBUG: value \"", value, "\" not supported for cpu option \"", key, "\"\n")
195 continue field
196 }
197
198 if key == "all" {
199 for i := range options {
200 options[i].Specified = true
201 options[i].Enable = enable || options[i].Required
202 }
203 continue field
204 }
205
206 for i := range options {
207 if options[i].Name == key {
208 options[i].Specified = true
209 options[i].Enable = enable
210 continue field
211 }
212 }
213
214 print("GODEBUG: unknown cpu feature \"", key, "\"\n")
215 }
216
217 for _, o := range options {
218 if !o.Specified {
219 continue
220 }
221
222 if o.Enable && !*o.Feature {
223 print("GODEBUG: can not enable \"", o.Name, "\", missing CPU support\n")
224 continue
225 }
226
227 if !o.Enable && o.Required {
228 print("GODEBUG: can not disable \"", o.Name, "\", required CPU feature\n")
229 continue
230 }
231
232 *o.Feature = o.Enable
233 }
234 }
235
236
237
238 func indexByte(s string, c byte) int {
239 for i := 0; i < len(s); i++ {
240 if s[i] == c {
241 return i
242 }
243 }
244 return -1
245 }
246
View as plain text