@@ -53,6 +53,9 @@ func initOptions() {
5353 {Name : "sse41" , Feature : & X86 .HasSSE41 },
5454 {Name : "sse42" , Feature : & X86 .HasSSE42 },
5555 {Name : "ssse3" , Feature : & X86 .HasSSSE3 },
56+ {Name : "avxifma" , Feature : & X86 .HasAVXIFMA },
57+ {Name : "avxvnni" , Feature : & X86 .HasAVXVNNI },
58+ {Name : "avxvnniint8" , Feature : & X86 .HasAVXVNNIInt8 },
5659
5760 // These capabilities should always be enabled on amd64:
5861 {Name : "sse2" , Feature : & X86 .HasSSE2 , Required : runtime .GOARCH == "amd64" },
@@ -92,10 +95,8 @@ func archInit() {
9295 osSupportsAVX = isSet (1 , eax ) && isSet (2 , eax )
9396
9497 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 ()
99100 } else {
100101 // Check if OPMASK and ZMM registers have OS support.
101102 osSupportsAVX512 = osSupportsAVX && isSet (5 , eax ) && isSet (6 , eax ) && isSet (7 , eax )
@@ -108,7 +109,7 @@ func archInit() {
108109 return
109110 }
110111
111- _ , ebx7 , ecx7 , edx7 := cpuid (7 , 0 )
112+ eax7 , ebx7 , ecx7 , edx7 := cpuid (7 , 0 )
112113 X86 .HasBMI1 = isSet (3 , ebx7 )
113114 X86 .HasAVX2 = isSet (5 , ebx7 ) && osSupportsAVX
114115 X86 .HasBMI2 = isSet (8 , ebx7 )
@@ -136,14 +137,24 @@ func archInit() {
136137 X86 .HasAVX512VAES = isSet (9 , ecx7 )
137138 X86 .HasAVX512VBMI2 = isSet (6 , ecx7 )
138139 X86 .HasAVX512BITALG = isSet (12 , ecx7 )
139-
140- eax71 , _ , _ , _ := cpuid (7 , 1 )
141- X86 .HasAVX512BF16 = isSet (5 , eax71 )
142140 }
143141
144142 X86 .HasAMXTile = isSet (24 , edx7 )
145143 X86 .HasAMXInt8 = isSet (25 , edx7 )
146144 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+ }
147158}
148159
149160func isSet (bitpos uint , value uint32 ) bool {
0 commit comments