@@ -115,52 +115,37 @@ namespace xsimd
115115 rvv = bool (getauxval (AT_HWCAP) & HWCAP_V);
116116#endif
117117#endif
118+ // Safe on all platforms, we simply be false
118119 const auto cpuid = xsimd::x86_cpu_id::read ();
119- auto xcr0 = xsimd::x86_xcr0::make_false ();
120-
121- bool sse_enabled = true ;
122- // AVX and AVX512 strictly require OSXSAVE to be enabled by the OS.
123- // If OSXSAVE is disabled (e.g., via bcdedit /set xsavedisable 1),
124- // AVX state won't be preserved across context switches, so AVX cannot be used.
125- bool avx_enabled = false ;
126- bool avx512_enabled = false ;
127-
128- if (cpuid.osxsave ())
129- {
130- xcr0 = xsimd::x86_xcr0::read ();
131-
132- sse_enabled = xcr0.sse_enabled ();
133- avx_enabled = xcr0.avx_enabled ();
134- avx512_enabled = xcr0.avx512_enabled ();
135- }
136-
137- sse2 = cpuid.sse2 () && sse_enabled;
138- sse3 = cpuid.sse3 () && sse_enabled;
139- ssse3 = cpuid.ssse3 () && sse_enabled;
140- sse4_1 = cpuid.sse4_1 () && sse_enabled;
141- sse4_2 = cpuid.sse4_2 () && sse_enabled;
142- fma3_sse42 = cpuid.fma3 () && sse_enabled;
120+ const auto xcr0 = cpuid.osxsave () ? x86_xcr0::read () : x86_xcr0::safe_default ();
121+
122+ sse2 = cpuid.sse2 () && xcr0.sse_enabled ();
123+ sse3 = cpuid.sse3 () && xcr0.sse_enabled ();
124+ ssse3 = cpuid.ssse3 () && xcr0.sse_enabled ();
125+ sse4_1 = cpuid.sse4_1 () && xcr0.sse_enabled ();
126+ sse4_2 = cpuid.sse4_2 () && xcr0.sse_enabled ();
127+ fma3_sse42 = cpuid.fma3 () && xcr0.sse_enabled ();
143128
144129 // sse4a not implemented in cpu_id yet
145130 // xop not implemented in cpu_id yet
146131
147- avx = cpuid.avx () && avx_enabled;
132+ avx = cpuid.avx () && xcr0. avx_enabled () ;
148133 fma3_avx = avx && fma3_sse42;
149- fma4 = cpuid.fma4 () && avx_enabled;
150- avx2 = cpuid.avx2 () && avx_enabled;
151- avxvnni = cpuid.avxvnni () && avx_enabled;
134+ fma4 = cpuid.fma4 () && xcr0. avx_enabled () ;
135+ avx2 = cpuid.avx2 () && xcr0. avx_enabled () ;
136+ avxvnni = cpuid.avxvnni () && xcr0. avx_enabled () ;
152137 fma3_avx2 = avx2 && fma3_sse42;
153138
154- avx512f = cpuid.avx512f () && avx512_enabled;
155- avx512cd = cpuid.avx512cd () && avx512_enabled;
156- avx512dq = cpuid.avx512dq () && avx512_enabled;
157- avx512bw = cpuid.avx512bw () && avx512_enabled;
158- avx512er = cpuid.avx512er () && avx512_enabled;
159- avx512pf = cpuid.avx512pf () && avx512_enabled;
160- avx512ifma = cpuid.avx512ifma () && avx512_enabled;
161- avx512vbmi = cpuid.avx512vbmi () && avx512_enabled;
162- avx512vbmi2 = cpuid.avx512vbmi2 () && avx512_enabled;
163- avx512vnni_bw = cpuid.avx512vnni_bw () && avx512_enabled;
139+ avx512f = cpuid.avx512f () && xcr0. avx512_enabled () ;
140+ avx512cd = cpuid.avx512cd () && xcr0. avx512_enabled () ;
141+ avx512dq = cpuid.avx512dq () && xcr0. avx512_enabled () ;
142+ avx512bw = cpuid.avx512bw () && xcr0. avx512_enabled () ;
143+ avx512er = cpuid.avx512er () && xcr0. avx512_enabled () ;
144+ avx512pf = cpuid.avx512pf () && xcr0. avx512_enabled () ;
145+ avx512ifma = cpuid.avx512ifma () && xcr0. avx512_enabled () ;
146+ avx512vbmi = cpuid.avx512vbmi () && xcr0. avx512_enabled () ;
147+ avx512vbmi2 = cpuid.avx512vbmi2 () && xcr0. avx512_enabled () ;
148+ avx512vnni_bw = cpuid.avx512vnni_bw () && xcr0. avx512_enabled () ;
164149 avx512vnni_vbmi2 = avx512vbmi2 && avx512vnni_bw;
165150 }
166151 };
0 commit comments