@@ -64,6 +64,7 @@ func initOptions() {
6464
6565func archInit () {
6666
67+ // From internal/cpu
6768 const (
6869 // eax bits
6970 cpuid_AVXVNNI = 1 << 4
@@ -112,6 +113,30 @@ func archInit() {
112113 // edx bits for CPUID 0x80000001
113114 cpuid_RDTSCP = 1 << 27
114115 )
116+ // Additional constants not in internal/cpu
117+ const (
118+ // eax=1: edx
119+ cpuid_SSE2 = 1 << 26
120+ // eax=1: ecx
121+ cpuid_CX16 = 1 << 13
122+ cpuid_RDRAND = 1 << 30
123+ // eax=7,ecx=0: ebx
124+ cpuid_RDSEED = 1 << 18
125+ cpuid_AVX512IFMA = 1 << 21
126+ cpuid_AVX512PF = 1 << 26
127+ cpuid_AVX512ER = 1 << 27
128+ // eax=7,ecx=0: edx
129+ cpuid_AVX5124VNNIW = 1 << 2
130+ cpuid_AVX5124FMAPS = 1 << 3
131+ cpuid_AMXBF16 = 1 << 22
132+ cpuid_AMXTile = 1 << 24
133+ cpuid_AMXInt8 = 1 << 25
134+ // eax=7,ecx=1: eax
135+ cpuid_AVX512BF16 = 1 << 5
136+ cpuid_AVXIFMA = 1 << 23
137+ // eax=7,ecx=1: edx
138+ cpuid_AVXVNNIInt8 = 1 << 4
139+ )
115140
116141 Initialized = true
117142
@@ -122,19 +147,19 @@ func archInit() {
122147 }
123148
124149 _ , _ , ecx1 , edx1 := cpuid (1 , 0 )
125- X86 .HasSSE2 = isSet (edx1 , 1 << 26 )
150+ X86 .HasSSE2 = isSet (edx1 , cpuid_SSE2 )
126151
127152 X86 .HasSSE3 = isSet (ecx1 , cpuid_SSE3 )
128153 X86 .HasPCLMULQDQ = isSet (ecx1 , cpuid_PCLMULQDQ )
129154 X86 .HasSSSE3 = isSet (ecx1 , cpuid_SSSE3 )
130155 X86 .HasFMA = isSet (ecx1 , cpuid_FMA )
131- X86 .HasCX16 = isSet (ecx1 , 1 << 13 )
156+ X86 .HasCX16 = isSet (ecx1 , cpuid_CX16 )
132157 X86 .HasSSE41 = isSet (ecx1 , cpuid_SSE41 )
133158 X86 .HasSSE42 = isSet (ecx1 , cpuid_SSE42 )
134159 X86 .HasPOPCNT = isSet (ecx1 , cpuid_POPCNT )
135160 X86 .HasAES = isSet (ecx1 , cpuid_AES )
136161 X86 .HasOSXSAVE = isSet (ecx1 , cpuid_OSXSAVE )
137- X86 .HasRDRAND = isSet (ecx1 , 1 << 30 )
162+ X86 .HasRDRAND = isSet (ecx1 , cpuid_RDRAND )
138163
139164 var osSupportsAVX , osSupportsAVX512 bool
140165 // For XGETBV, OSXSAVE bit is required and sufficient.
@@ -163,22 +188,22 @@ func archInit() {
163188 X86 .HasAVX2 = isSet (ebx7 , cpuid_AVX2 ) && osSupportsAVX
164189 X86 .HasBMI2 = isSet (ebx7 , cpuid_BMI2 )
165190 X86 .HasERMS = isSet (ebx7 , cpuid_ERMS )
166- X86 .HasRDSEED = isSet (ebx7 , 1 << 18 )
191+ X86 .HasRDSEED = isSet (ebx7 , cpuid_RDSEED )
167192 X86 .HasADX = isSet (ebx7 , cpuid_ADX )
168193
169194 X86 .HasAVX512 = isSet (ebx7 , cpuid_AVX512F ) && osSupportsAVX512 // Because avx-512 foundation is the core required extension
170195 if X86 .HasAVX512 {
171196 X86 .HasAVX512F = true
172197 X86 .HasAVX512CD = isSet (ebx7 , cpuid_AVX512CD )
173- X86 .HasAVX512ER = isSet (ebx7 , 1 << 27 )
174- X86 .HasAVX512PF = isSet (ebx7 , 1 << 26 )
198+ X86 .HasAVX512ER = isSet (ebx7 , cpuid_AVX512ER )
199+ X86 .HasAVX512PF = isSet (ebx7 , cpuid_AVX512PF )
175200 X86 .HasAVX512VL = isSet (ebx7 , cpuid_AVX512VL )
176201 X86 .HasAVX512BW = isSet (ebx7 , cpuid_AVX512BW )
177202 X86 .HasAVX512DQ = isSet (ebx7 , cpuid_AVX512DQ )
178- X86 .HasAVX512IFMA = isSet (ebx7 , 1 << 21 )
203+ X86 .HasAVX512IFMA = isSet (ebx7 , cpuid_AVX512IFMA )
179204 X86 .HasAVX512VBMI = isSet (ecx7 , cpuid_AVX512_VBMI )
180- X86 .HasAVX5124VNNIW = isSet (edx7 , 1 << 2 )
181- X86 .HasAVX5124FMAPS = isSet (edx7 , 1 << 3 )
205+ X86 .HasAVX5124VNNIW = isSet (edx7 , cpuid_AVX5124VNNIW )
206+ X86 .HasAVX5124FMAPS = isSet (edx7 , cpuid_AVX5124FMAPS )
182207 X86 .HasAVX512VPOPCNTDQ = isSet (ecx7 , cpuid_AVX512VPOPCNTDQ )
183208 X86 .HasAVX512VPCLMULQDQ = isSet (ecx7 , cpuid_AVX512VPCLMULQDQ )
184209 X86 .HasAVX512VNNI = isSet (ecx7 , cpuid_AVX512VNNI )
@@ -188,20 +213,20 @@ func archInit() {
188213 X86 .HasAVX512BITALG = isSet (ecx7 , cpuid_AVX512BITALG )
189214 }
190215
191- X86 .HasAMXTile = isSet (edx7 , 1 << 24 )
192- X86 .HasAMXInt8 = isSet (edx7 , 1 << 25 )
193- X86 .HasAMXBF16 = isSet (edx7 , 1 << 22 )
216+ X86 .HasAMXTile = isSet (edx7 , cpuid_AMXTile )
217+ X86 .HasAMXInt8 = isSet (edx7 , cpuid_AMXInt8 )
218+ X86 .HasAMXBF16 = isSet (edx7 , cpuid_AMXBF16 )
194219
195220 // These features depend on the second level of extended features.
196221 if eax7 >= 1 {
197222 eax71 , _ , _ , edx71 := cpuid (7 , 1 )
198223 if X86 .HasAVX512 {
199- X86 .HasAVX512BF16 = isSet (eax71 , 1 << 5 )
224+ X86 .HasAVX512BF16 = isSet (eax71 , cpuid_AVX512BF16 )
200225 }
201226 if X86 .HasAVX {
202- X86 .HasAVXIFMA = isSet (eax71 , 1 << 23 )
227+ X86 .HasAVXIFMA = isSet (eax71 , cpuid_AVXIFMA )
203228 X86 .HasAVXVNNI = isSet (eax71 , cpuid_AVXVNNI )
204- X86 .HasAVXVNNIInt8 = isSet (edx71 , 1 << 4 )
229+ X86 .HasAVXVNNIInt8 = isSet (edx71 , cpuid_AVXVNNIInt8 )
205230 }
206231 }
207232}
0 commit comments