@@ -20,26 +20,38 @@ const (
20
20
cpuid_SSE2 = 1 << 26
21
21
22
22
// ecx bits
23
- cpuid_SSE3 = 1 << 0
24
- cpuid_PCLMULQDQ = 1 << 1
25
- cpuid_SSSE3 = 1 << 9
26
- cpuid_FMA = 1 << 12
27
- cpuid_SSE41 = 1 << 19
28
- cpuid_SSE42 = 1 << 20
29
- cpuid_POPCNT = 1 << 23
30
- cpuid_AES = 1 << 25
31
- cpuid_OSXSAVE = 1 << 27
32
- cpuid_AVX = 1 << 28
23
+ cpuid_SSE3 = 1 << 0
24
+ cpuid_PCLMULQDQ = 1 << 1
25
+ cpuid_SSSE3 = 1 << 9
26
+ cpuid_FMA = 1 << 12
27
+ cpuid_CMPXCHG16B = 1 << 13
28
+ cpuid_SSE41 = 1 << 19
29
+ cpuid_SSE42 = 1 << 20
30
+ cpuid_MOVBE = 1 << 22
31
+ cpuid_POPCNT = 1 << 23
32
+ cpuid_AES = 1 << 25
33
+ cpuid_OSXSAVE = 1 << 27
34
+ cpuid_AVX = 1 << 28
35
+ cpuid_F16C = 1 << 29
33
36
34
37
// ebx bits
35
- cpuid_BMI1 = 1 << 3
36
- cpuid_AVX2 = 1 << 5
37
- cpuid_BMI2 = 1 << 8
38
- cpuid_ERMS = 1 << 9
39
- cpuid_ADX = 1 << 19
38
+ cpuid_BMI1 = 1 << 3
39
+ cpuid_AVX2 = 1 << 5
40
+ cpuid_BMI2 = 1 << 8
41
+ cpuid_ERMS = 1 << 9
42
+ cpuid_ADX = 1 << 19
43
+ cpuid_AVX512F = 1 << 16
44
+ cpuid_AVX512DQ = 1 << 17
45
+ cpuid_AVX512CD = 1 << 28
46
+ cpuid_AVX512BW = 1 << 30
47
+ cpuid_AVX512VL = 1 << 31
40
48
41
49
// edx bits for CPUID 0x80000001
42
50
cpuid_RDTSCP = 1 << 27
51
+
52
+ // ecx bits for CPUID 0x80000001
53
+ cpuid_LAHF = 1 << 0
54
+ cpuid_ABM = 1 << 5
43
55
)
44
56
45
57
var maxExtendedFunctionInformation uint32
@@ -80,6 +92,9 @@ func doinit() {
80
92
X86 .HasSSE42 = isSet (ecx1 , cpuid_SSE42 )
81
93
X86 .HasPOPCNT = isSet (ecx1 , cpuid_POPCNT )
82
94
X86 .HasAES = isSet (ecx1 , cpuid_AES )
95
+ X86 .HasMOVBE = isSet (ecx1 , cpuid_MOVBE )
96
+ X86 .HasCMPXCHG16B = isSet (ecx1 , cpuid_CMPXCHG16B )
97
+ X86 .HasF16C = isSet (ecx1 , cpuid_F16C )
83
98
84
99
// OSXSAVE can be false when using older Operating Systems
85
100
// or when explicitly disabled on newer Operating Systems by
@@ -112,6 +127,11 @@ func doinit() {
112
127
X86 .HasBMI2 = isSet (ebx7 , cpuid_BMI2 )
113
128
X86 .HasERMS = isSet (ebx7 , cpuid_ERMS )
114
129
X86 .HasADX = isSet (ebx7 , cpuid_ADX )
130
+ X86 .HasAVX512F = isSet (ebx7 , cpuid_AVX512F )
131
+ X86 .HasAVX512BW = isSet (ebx7 , cpuid_AVX512BW )
132
+ X86 .HasAVX512CD = isSet (ebx7 , cpuid_AVX512CD )
133
+ X86 .HasAVX512DQ = isSet (ebx7 , cpuid_AVX512DQ )
134
+ X86 .HasAVX512VL = isSet (ebx7 , cpuid_AVX512VL )
115
135
116
136
var maxExtendedInformation uint32
117
137
maxExtendedInformation , _ , _ , _ = cpuid (0x80000000 , 0 )
@@ -120,8 +140,11 @@ func doinit() {
120
140
return
121
141
}
122
142
123
- _ , _ , _ , edxExt1 := cpuid (0x80000001 , 0 )
143
+ _ , _ , ecxExt1 , edxExt1 := cpuid (0x80000001 , 0 )
124
144
X86 .HasRDTSCP = isSet (edxExt1 , cpuid_RDTSCP )
145
+
146
+ X86 .HasLAHF = isSet (ecxExt1 , cpuid_LAHF )
147
+ X86 .HasABM = isSet (ecxExt1 , cpuid_ABM )
125
148
}
126
149
127
150
func isSet (hwc uint32 , value uint32 ) bool {
0 commit comments