@@ -113,6 +113,7 @@ static struct {
113113 {NPY_CPU_FEATURE_AVX512VBMI2 , "AVX512VBMI2" },
114114 {NPY_CPU_FEATURE_AVX512BITALG , "AVX512BITALG" },
115115 {NPY_CPU_FEATURE_AVX512FP16 , "AVX512FP16" },
116+ {NPY_CPU_FEATURE_AVX512BF16 , "AVX512BF16" },
116117 {NPY_CPU_FEATURE_AVX512_KNL , "AVX512_KNL" },
117118 {NPY_CPU_FEATURE_AVX512_KNM , "AVX512_KNM" },
118119 {NPY_CPU_FEATURE_AVX512_SKX , "AVX512_SKX" },
@@ -410,12 +411,18 @@ npy__cpu_getxcr0(void)
410411}
411412
412413static void
413- npy__cpu_cpuid (int reg [4 ], int func_id )
414+ npy__cpu_cpuid_count (int reg [4 ], int func_id , int count )
414415{
415416#if defined(_MSC_VER )
416- __cpuidex (reg , func_id , 0 );
417+ __cpuidex (reg , func_id , count );
417418#elif defined(__INTEL_COMPILER )
418419 __cpuid (reg , func_id );
420+ // classic Intel compilers do not support count
421+ if (count != 0 ) {
422+ for (int i = 0 ; i < 4 ; i ++ ) {
423+ reg [i ] = 0 ;
424+ }
425+ }
419426#elif defined(__GNUC__ ) || defined(__clang__ )
420427 #if defined(NPY_CPU_X86 ) && defined(__PIC__ )
421428 // %ebx may be the PIC register
@@ -424,20 +431,26 @@ npy__cpu_cpuid(int reg[4], int func_id)
424431 "xchg{l}\t{%%}ebx, %1\n\t"
425432 : "=a" (reg [0 ]), "=r" (reg [1 ]), "=c" (reg [2 ]),
426433 "=d" (reg [3 ])
427- : "a" (func_id ), "c" (0 )
434+ : "a" (func_id ), "c" (count )
428435 );
429436 #else
430437 __asm__("cpuid\n\t"
431438 : "=a" (reg [0 ]), "=b" (reg [1 ]), "=c" (reg [2 ]),
432439 "=d" (reg [3 ])
433- : "a" (func_id ), "c" (0 )
440+ : "a" (func_id ), "c" (count )
434441 );
435442 #endif
436443#else
437444 reg [0 ] = 0 ;
438445#endif
439446}
440447
448+ static void
449+ npy__cpu_cpuid (int reg [4 ], int func_id )
450+ {
451+ return npy__cpu_cpuid_count (reg , func_id , 0 );
452+ }
453+
441454static void
442455npy__cpu_init_features (void )
443456{
@@ -552,6 +565,8 @@ npy__cpu_init_features(void)
552565 npy__cpu_have [NPY_CPU_FEATURE_AVX512BITALG ] = (reg [2 ] & (1 << 12 )) != 0 ;
553566 // Sapphire Rapids
554567 npy__cpu_have [NPY_CPU_FEATURE_AVX512FP16 ] = (reg [3 ] & (1 << 23 )) != 0 ;
568+ npy__cpu_cpuid_count (reg , 7 , 1 );
569+ npy__cpu_have [NPY_CPU_FEATURE_AVX512BF16 ] = (reg [0 ] & (1 << 5 )) != 0 ;
555570 }
556571
557572 // Groups
@@ -598,7 +613,9 @@ npy__cpu_init_features(void)
598613 npy__cpu_have [NPY_CPU_FEATURE_VPCLMULQDQ ];
599614
600615 npy__cpu_have [NPY_CPU_FEATURE_AVX512_SPR ] = npy__cpu_have [NPY_CPU_FEATURE_AVX512_ICL ] &&
601- npy__cpu_have [NPY_CPU_FEATURE_AVX512FP16 ];
616+ npy__cpu_have [NPY_CPU_FEATURE_AVX512FP16 ] &&
617+ npy__cpu_have [NPY_CPU_FEATURE_AVX512BF16 ];
618+
602619
603620
604621 // Legacy groups
0 commit comments