Message ID | 6675252.LvFx2qVVIh@excalibur |
---|---|
State | New |
Headers | show |
Series | libstdc++: Fix call signature of builtins from masked ++/-- | expand |
On Wed, 27 Mar 2024 at 08:51, Matthias Kretz <m.kretz@gsi.de> wrote: > > This is broken on GCC 13 and 14 (https://compiler-explorer.com/z/GPKGPGs6T) > > Tested on x86_64-linux-gnu. > > OK for trunk and 13? OK for both, thanks. > > ----------------------- 8< --------------------- > > This resolves failures in the "expensive" where-* test of check-simd > when targeting AVX-512. > > Signed-off-by: Matthias Kretz <m.kretz@gsi.de> > > libstdc++-v3/ChangeLog: > > * include/experimental/bits/simd_x86.h (_S_masked_unary): Call > the 4- and 8-byte variants of __builtin_ia32_subp[ds] without > rounding direction argument. > --- > libstdc++-v3/include/experimental/bits/simd_x86.h | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > > -- > ────────────────────────────────────────────────────────────────────────── > Dr. Matthias Kretz https://mattkretz.github.io > GSI Helmholtz Centre for Heavy Ion Research https://gsi.de > stdₓ::simd > ──────────────────────────────────────────────────────────────────────────
diff --git a/libstdc++-v3/include/experimental/bits/simd_x86.h b/libstdc++-v3/include/experimental/bits/simd_x86.h index 16b207be2a3..6b414486fee 100644 --- a/libstdc++-v3/include/experimental/bits/simd_x86.h +++ b/libstdc++-v3/include/experimental/bits/simd_x86.h @@ -3538,17 +3538,23 @@ _S_masked_unary(const _SimdWrapper<_K, _Np> __k, const _SimdWrapper<_Tp, _Np> __ } else { -#define _GLIBCXX_SIMD_MASK_SUB(_Sizeof, _Width, _Instr) \ +#define _GLIBCXX_SIMD_MASK_SUB_512(_Sizeof, _Width, _Instr) \ if constexpr (sizeof(_Tp) == _Sizeof && sizeof(__v) == _Width) \ return __builtin_ia32_##_Instr##_mask( \ __v._M_data, __vector_broadcast<_Np>(_Tp(__pm_one)), __v._M_data, \ __k._M_data, _MM_FROUND_CUR_DIRECTION) - _GLIBCXX_SIMD_MASK_SUB(4, 64, subps512); +#define _GLIBCXX_SIMD_MASK_SUB(_Sizeof, _Width, _Instr) \ + if constexpr (sizeof(_Tp) == _Sizeof && sizeof(__v) == _Width) \ + return __builtin_ia32_##_Instr##_mask( \ + __v._M_data, __vector_broadcast<_Np>(_Tp(__pm_one)), __v._M_data, \ + __k._M_data) + _GLIBCXX_SIMD_MASK_SUB_512(4, 64, subps512); _GLIBCXX_SIMD_MASK_SUB(4, 32, subps256); _GLIBCXX_SIMD_MASK_SUB(4, 16, subps128); - _GLIBCXX_SIMD_MASK_SUB(8, 64, subpd512); + _GLIBCXX_SIMD_MASK_SUB_512(8, 64, subpd512); _GLIBCXX_SIMD_MASK_SUB(8, 32, subpd256); _GLIBCXX_SIMD_MASK_SUB(8, 16, subpd128); +#undef _GLIBCXX_SIMD_MASK_SUB_512 #undef _GLIBCXX_SIMD_MASK_SUB } #endif // __clang__
This is broken on GCC 13 and 14 (https://compiler-explorer.com/z/GPKGPGs6T) Tested on x86_64-linux-gnu. OK for trunk and 13? ----------------------- 8< --------------------- This resolves failures in the "expensive" where-* test of check-simd when targeting AVX-512. Signed-off-by: Matthias Kretz <m.kretz@gsi.de> libstdc++-v3/ChangeLog: * include/experimental/bits/simd_x86.h (_S_masked_unary): Call the 4- and 8-byte variants of __builtin_ia32_subp[ds] without rounding direction argument. --- libstdc++-v3/include/experimental/bits/simd_x86.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Centre for Heavy Ion Research https://gsi.de stdₓ::simd ──────────────────────────────────────────────────────────────────────────