@@ -53,6 +53,9 @@ func initOptions() {
53
53
{Name : "sse41" , Feature : & X86 .HasSSE41 },
54
54
{Name : "sse42" , Feature : & X86 .HasSSE42 },
55
55
{Name : "ssse3" , Feature : & X86 .HasSSSE3 },
56
+ {Name : "avxifma" , Feature : & X86 .HasAVXIFMA },
57
+ {Name : "avxvnni" , Feature : & X86 .HasAVXVNNI },
58
+ {Name : "avxvnniint8" , Feature : & X86 .HasAVXVNNIInt8 },
56
59
57
60
// These capabilities should always be enabled on amd64:
58
61
{Name : "sse2" , Feature : & X86 .HasSSE2 , Required : runtime .GOARCH == "amd64" },
@@ -92,10 +95,8 @@ func archInit() {
92
95
osSupportsAVX = isSet (1 , eax ) && isSet (2 , eax )
93
96
94
97
if runtime .GOOS == "darwin" {
95
- // Darwin doesn't save/restore AVX-512 mask registers correctly across signal handlers.
96
- // Since users can't rely on mask register contents, let's not advertise AVX-512 support.
97
- // See issue 49233.
98
- osSupportsAVX512 = false
98
+ // Darwin requires special AVX512 checks, see cpu_darwin_x86.go
99
+ osSupportsAVX512 = osSupportsAVX && darwinSupportsAVX512 ()
99
100
} else {
100
101
// Check if OPMASK and ZMM registers have OS support.
101
102
osSupportsAVX512 = osSupportsAVX && isSet (5 , eax ) && isSet (6 , eax ) && isSet (7 , eax )
@@ -108,7 +109,7 @@ func archInit() {
108
109
return
109
110
}
110
111
111
- _ , ebx7 , ecx7 , edx7 := cpuid (7 , 0 )
112
+ eax7 , ebx7 , ecx7 , edx7 := cpuid (7 , 0 )
112
113
X86 .HasBMI1 = isSet (3 , ebx7 )
113
114
X86 .HasAVX2 = isSet (5 , ebx7 ) && osSupportsAVX
114
115
X86 .HasBMI2 = isSet (8 , ebx7 )
@@ -136,14 +137,24 @@ func archInit() {
136
137
X86 .HasAVX512VAES = isSet (9 , ecx7 )
137
138
X86 .HasAVX512VBMI2 = isSet (6 , ecx7 )
138
139
X86 .HasAVX512BITALG = isSet (12 , ecx7 )
139
-
140
- eax71 , _ , _ , _ := cpuid (7 , 1 )
141
- X86 .HasAVX512BF16 = isSet (5 , eax71 )
142
140
}
143
141
144
142
X86 .HasAMXTile = isSet (24 , edx7 )
145
143
X86 .HasAMXInt8 = isSet (25 , edx7 )
146
144
X86 .HasAMXBF16 = isSet (22 , edx7 )
145
+
146
+ // These features depend on the second level of extended features.
147
+ if eax7 >= 1 {
148
+ eax71 , _ , _ , edx71 := cpuid (7 , 1 )
149
+ if X86 .HasAVX512 {
150
+ X86 .HasAVX512BF16 = isSet (5 , eax71 )
151
+ }
152
+ if X86 .HasAVX {
153
+ X86 .HasAVXIFMA = isSet (23 , eax71 )
154
+ X86 .HasAVXVNNI = isSet (4 , eax71 )
155
+ X86 .HasAVXVNNIInt8 = isSet (4 , edx71 )
156
+ }
157
+ }
147
158
}
148
159
149
160
func isSet (bitpos uint , value uint32 ) bool {
0 commit comments