@@ -153,8 +153,11 @@ SIMSIMD_MAKE_MAHALANOBIS(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_ma
153153#if SIMSIMD_TARGET_NEON
154154#pragma GCC push_options
155155#pragma GCC target("arch=armv8.2-a+simd")
156+ #ifdef __clang__
156157#pragma clang attribute push(__attribute__((target("arch=armv8.2-a+simd"))), apply_to = function)
157158
159+ #endif
160+
158161SIMSIMD_PUBLIC void simsimd_bilinear_f32_neon (simsimd_f32_t const * a , simsimd_f32_t const * b , simsimd_f32_t const * c ,
159162 simsimd_size_t n , simsimd_distance_t * result ) {
160163 float32x4_t sum_vec = vdupq_n_f32 (0 );
@@ -220,15 +223,20 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_f32_neon(simsimd_f32_t const* a, simsimd
220223 * result = sum ;
221224}
222225
226+ #ifdef __clang__
223227#pragma clang attribute pop
228+ #endif
224229#pragma GCC pop_options
225230#endif // SIMSIMD_TARGET_NEON
226231
227232#if SIMSIMD_TARGET_NEON_F16
228233#pragma GCC push_options
229234#pragma GCC target("arch=armv8.2-a+simd+fp16")
235+ #ifdef __clang__
230236#pragma clang attribute push(__attribute__((target("arch=armv8.2-a+simd+fp16"))), apply_to = function)
231237
238+ #endif
239+
232240SIMSIMD_PUBLIC void simsimd_bilinear_f16_neon (simsimd_f16_t const * a , simsimd_f16_t const * b , simsimd_f16_t const * c ,
233241 simsimd_size_t n , simsimd_distance_t * result ) {
234242 float32x4_t sum_vec = vdupq_n_f32 (0 );
@@ -301,15 +309,20 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_f16_neon(simsimd_f16_t const* a, simsimd
301309 * result = sum ;
302310}
303311
312+ #ifdef __clang__
304313#pragma clang attribute pop
314+ #endif
305315#pragma GCC pop_options
306316#endif // SIMSIMD_TARGET_NEON_F16
307317
308318#if SIMSIMD_TARGET_NEON_BF16
309319#pragma GCC push_options
310320#pragma GCC target("arch=armv8.6-a+simd+bf16")
321+ #ifdef __clang__
311322#pragma clang attribute push(__attribute__((target("arch=armv8.6-a+simd+bf16"))), apply_to = function)
312323
324+ #endif
325+
313326SIMSIMD_PUBLIC void simsimd_bilinear_bf16_neon (simsimd_bf16_t const * a , simsimd_bf16_t const * b ,
314327 simsimd_bf16_t const * c , simsimd_size_t n , simsimd_distance_t * result ) {
315328 float32x4_t sum_vec = vdupq_n_f32 (0 );
@@ -401,7 +414,9 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_bf16_neon(simsimd_bf16_t const* a, simsi
401414 * result = sum ;
402415}
403416
417+ #ifdef __clang__
404418#pragma clang attribute pop
419+ #endif
405420#pragma GCC pop_options
406421#endif // SIMSIMD_TARGET_NEON_BF16
407422
@@ -411,8 +426,11 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_bf16_neon(simsimd_bf16_t const* a, simsi
411426#if SIMSIMD_TARGET_HASWELL
412427#pragma GCC push_options
413428#pragma GCC target("avx2", "f16c", "fma")
429+ #ifdef __clang__
414430#pragma clang attribute push(__attribute__((target("avx2,f16c,fma"))), apply_to = function)
415431
432+ #endif
433+
416434SIMSIMD_PUBLIC void simsimd_bilinear_f16_haswell (simsimd_f16_t const * a , simsimd_f16_t const * b , simsimd_f16_t const * c ,
417435 simsimd_size_t n , simsimd_distance_t * result ) {
418436 __m256 sum_vec = _mm256_setzero_ps ();
@@ -558,15 +576,20 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_bf16_haswell(simsimd_bf16_t const* a, si
558576 * result = sum ;
559577}
560578
579+ #ifdef __clang__
561580#pragma clang attribute pop
581+ #endif
562582#pragma GCC pop_options
563583#endif // SIMSIMD_TARGET_HASWELL
564584
565585#if SIMSIMD_TARGET_SKYLAKE
566586#pragma GCC push_options
567587#pragma GCC target("avx2", "avx512f", "avx512vl", "bmi2")
588+ #ifdef __clang__
568589#pragma clang attribute push(__attribute__((target("avx2,avx512f,avx512vl,bmi2"))), apply_to = function)
569590
591+ #endif
592+
570593SIMSIMD_PUBLIC void simsimd_bilinear_f32_skylake (simsimd_f32_t const * a , simsimd_f32_t const * b , simsimd_f32_t const * c ,
571594 simsimd_size_t n , simsimd_distance_t * result ) {
572595 simsimd_size_t tail_length = n % 16 ;
@@ -634,16 +657,21 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_f32_skylake(simsimd_f32_t const* a, sims
634657 * result = _mm512_reduce_add_ps (sum_vec );
635658}
636659
660+ #ifdef __clang__
637661#pragma clang attribute pop
662+ #endif
638663#pragma GCC pop_options
639664#endif // SIMSIMD_TARGET_SKYLAKE
640665
641666#if SIMSIMD_TARGET_GENOA
642667#pragma GCC push_options
643668#pragma GCC target("avx2", "avx512f", "avx512vl", "bmi2", "avx512bw", "avx512bf16")
669+ #ifdef __clang__
644670#pragma clang attribute push(__attribute__((target("avx2,avx512f,avx512vl,bmi2,avx512bw,avx512bf16"))), \
645671 apply_to = function)
646672
673+ #endif
674+
647675SIMSIMD_PUBLIC void simsimd_bilinear_bf16_genoa (simsimd_bf16_t const * a , simsimd_bf16_t const * b ,
648676 simsimd_bf16_t const * c , simsimd_size_t n , simsimd_distance_t * result ) {
649677 simsimd_size_t tail_length = n % 32 ;
@@ -711,16 +739,21 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_bf16_genoa(simsimd_bf16_t const* a, sims
711739 * result = _mm512_reduce_add_ps (sum_vec );
712740}
713741
742+ #ifdef __clang__
714743#pragma clang attribute pop
744+ #endif
715745#pragma GCC pop_options
716746#endif // SIMSIMD_TARGET_GENOA
717747
718748#if SIMSIMD_TARGET_SAPPHIRE
719749#pragma GCC push_options
720750#pragma GCC target("avx2", "avx512f", "avx512vl", "bmi2", "avx512bw", "avx512fp16")
751+ #ifdef __clang__
721752#pragma clang attribute push(__attribute__((target("avx2,avx512f,avx512vl,bmi2,avx512bw,avx512fp16"))), \
722753 apply_to = function)
723754
755+ #endif
756+
724757SIMSIMD_PUBLIC void simsimd_bilinear_f16_sapphire (simsimd_f16_t const * a , simsimd_f16_t const * b ,
725758 simsimd_f16_t const * c , simsimd_size_t n ,
726759 simsimd_distance_t * result ) {
@@ -800,7 +833,9 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_bf16_sapphire(simsimd_bf16_t const* a, s
800833 simsimd_bf16_t const * c , simsimd_size_t n ,
801834 simsimd_distance_t * result ) {}
802835
836+ #ifdef __clang__
803837#pragma clang attribute pop
838+ #endif
804839#pragma GCC pop_options
805840#endif // SIMSIMD_TARGET_SAPPHIRE
806841#endif // SIMSIMD_TARGET_X86
0 commit comments