Re: [PATCH 5/8] libstdc++: Always-inline most of non-cmath fixed_size implementation

2023-02-24 Thread Jonathan Wakely via Gcc-patches
On Thu, 23 Feb 2023 at 08:54, Matthias Kretz via Libstdc++
 wrote:
>
>
>
> For simd, the inlining behavior should be similar to builtin types. (No
> operator on buitin types is ever translated into a function call.)
> Therefore, always_inline is the right choice (i.e. inline on -O0 as
> well).

OK for trunk (and OK for backport later if no problems show up from
the extra inlining).


>
> Signed-off-by: Matthias Kretz 
>
> libstdc++-v3/ChangeLog:
>
> PR libstdc++/108030
> * include/experimental/bits/simd_fixed_size.h
> (_SimdImplFixedSize::_S_broadcast): Replace inline with
> _GLIBCXX_SIMD_INTRINSIC.
> (_SimdImplFixedSize::_S_generate): Likewise.
> (_SimdImplFixedSize::_S_load): Likewise.
> (_SimdImplFixedSize::_S_masked_load): Likewise.
> (_SimdImplFixedSize::_S_store): Likewise.
> (_SimdImplFixedSize::_S_masked_store): Likewise.
> (_SimdImplFixedSize::_S_min): Likewise.
> (_SimdImplFixedSize::_S_max): Likewise.
> (_SimdImplFixedSize::_S_complement): Likewise.
> (_SimdImplFixedSize::_S_unary_minus): Likewise.
> (_SimdImplFixedSize::_S_plus): Likewise.
> (_SimdImplFixedSize::_S_minus): Likewise.
> (_SimdImplFixedSize::_S_multiplies): Likewise.
> (_SimdImplFixedSize::_S_divides): Likewise.
> (_SimdImplFixedSize::_S_modulus): Likewise.
> (_SimdImplFixedSize::_S_bit_and): Likewise.
> (_SimdImplFixedSize::_S_bit_or): Likewise.
> (_SimdImplFixedSize::_S_bit_xor): Likewise.
> (_SimdImplFixedSize::_S_bit_shift_left): Likewise.
> (_SimdImplFixedSize::_S_bit_shift_right): Likewise.
> (_SimdImplFixedSize::_S_remquo): Add inline keyword (to be
> explicit about not always-inline, yet).
> (_SimdImplFixedSize::_S_isinf): Likewise.
> (_SimdImplFixedSize::_S_isfinite): Likewise.
> (_SimdImplFixedSize::_S_isnan): Likewise.
> (_SimdImplFixedSize::_S_isnormal): Likewise.
> (_SimdImplFixedSize::_S_signbit): Likewise.
> ---
>  .../experimental/bits/simd_fixed_size.h   | 60 +--
>  1 file changed, 30 insertions(+), 30 deletions(-)
>
>
> --
> ──
>  Dr. Matthias Kretz   https://mattkretz.github.io
>  GSI Helmholtz Centre for Heavy Ion Research   https://gsi.de
>  stdₓ::simd
> ──



[PATCH 5/8] libstdc++: Always-inline most of non-cmath fixed_size implementation

2023-02-23 Thread Matthias Kretz via Gcc-patches


For simd, the inlining behavior should be similar to builtin types. (No
operator on buitin types is ever translated into a function call.)
Therefore, always_inline is the right choice (i.e. inline on -O0 as
well).

Signed-off-by: Matthias Kretz 

libstdc++-v3/ChangeLog:

PR libstdc++/108030
* include/experimental/bits/simd_fixed_size.h
(_SimdImplFixedSize::_S_broadcast): Replace inline with
_GLIBCXX_SIMD_INTRINSIC.
(_SimdImplFixedSize::_S_generate): Likewise.
(_SimdImplFixedSize::_S_load): Likewise.
(_SimdImplFixedSize::_S_masked_load): Likewise.
(_SimdImplFixedSize::_S_store): Likewise.
(_SimdImplFixedSize::_S_masked_store): Likewise.
(_SimdImplFixedSize::_S_min): Likewise.
(_SimdImplFixedSize::_S_max): Likewise.
(_SimdImplFixedSize::_S_complement): Likewise.
(_SimdImplFixedSize::_S_unary_minus): Likewise.
(_SimdImplFixedSize::_S_plus): Likewise.
(_SimdImplFixedSize::_S_minus): Likewise.
(_SimdImplFixedSize::_S_multiplies): Likewise.
(_SimdImplFixedSize::_S_divides): Likewise.
(_SimdImplFixedSize::_S_modulus): Likewise.
(_SimdImplFixedSize::_S_bit_and): Likewise.
(_SimdImplFixedSize::_S_bit_or): Likewise.
(_SimdImplFixedSize::_S_bit_xor): Likewise.
(_SimdImplFixedSize::_S_bit_shift_left): Likewise.
(_SimdImplFixedSize::_S_bit_shift_right): Likewise.
(_SimdImplFixedSize::_S_remquo): Add inline keyword (to be
explicit about not always-inline, yet).
(_SimdImplFixedSize::_S_isinf): Likewise.
(_SimdImplFixedSize::_S_isfinite): Likewise.
(_SimdImplFixedSize::_S_isnan): Likewise.
(_SimdImplFixedSize::_S_isnormal): Likewise.
(_SimdImplFixedSize::_S_signbit): Likewise.
---
 .../experimental/bits/simd_fixed_size.h   | 60 +--
 1 file changed, 30 insertions(+), 30 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_fixed_size.h b/libstdc++-v3/include/experimental/bits/simd_fixed_size.h
index 3ac6eaa3f6b..88a9b27e359 100644
--- a/libstdc++-v3/include/experimental/bits/simd_fixed_size.h
+++ b/libstdc++-v3/include/experimental/bits/simd_fixed_size.h
@@ -1284,7 +1284,8 @@ struct _SimdImplFixedSize
 
 // broadcast {{{2
 template 
-  static constexpr inline _SimdMember<_Tp> _S_broadcast(_Tp __x) noexcept
+  _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdMember<_Tp>
+  _S_broadcast(_Tp __x) noexcept
   {
 	return _SimdMember<_Tp>::_S_generate(
 		 [&](auto __meta) constexpr _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA {
@@ -1294,8 +1295,8 @@ struct _SimdImplFixedSize
 
 // _S_generator {{{2
 template 
-  static constexpr inline _SimdMember<_Tp> _S_generator(_Fp&& __gen,
-			_TypeTag<_Tp>)
+  _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdMember<_Tp>
+  _S_generator(_Fp&& __gen, _TypeTag<_Tp>)
   {
 	return _SimdMember<_Tp>::_S_generate(
 		 [&__gen](auto __meta) constexpr _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA {
@@ -1310,8 +1311,8 @@ struct _SimdImplFixedSize
 
 // _S_load {{{2
 template 
-  static inline _SimdMember<_Tp> _S_load(const _Up* __mem,
-	 _TypeTag<_Tp>) noexcept
+  _GLIBCXX_SIMD_INTRINSIC static _SimdMember<_Tp>
+  _S_load(const _Up* __mem, _TypeTag<_Tp>) noexcept
   {
 	return _SimdMember<_Tp>::_S_generate(
 		 [&](auto __meta) _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA {
@@ -1321,7 +1322,7 @@ struct _SimdImplFixedSize
 
 // _S_masked_load {{{2
 template 
-  static inline _SimdTuple<_Tp, _As...>
+  _GLIBCXX_SIMD_INTRINSIC static _SimdTuple<_Tp, _As...>
   _S_masked_load(const _SimdTuple<_Tp, _As...>& __old,
 		 const _MaskMember __bits, const _Up* __mem) noexcept
   {
@@ -1344,8 +1345,8 @@ _S_masked_load(const _SimdTuple<_Tp, _As...>& __old,
 
 // _S_store {{{2
 template 
-  static inline void _S_store(const _SimdMember<_Tp>& __v, _Up* __mem,
-  _TypeTag<_Tp>) noexcept
+  _GLIBCXX_SIMD_INTRINSIC static void
+  _S_store(const _SimdMember<_Tp>& __v, _Up* __mem, _TypeTag<_Tp>) noexcept
   {
 	__for_each(__v, [&](auto __meta, auto __native) _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA {
 	  __meta._S_store(__native, &__mem[__meta._S_offset], _TypeTag<_Tp>());
@@ -1354,9 +1355,9 @@ _S_masked_load(const _SimdTuple<_Tp, _As...>& __old,
 
 // _S_masked_store {{{2
 template 
-  static inline void _S_masked_store(const _SimdTuple<_Tp, _As...>& __v,
-	 _Up* __mem,
-	 const _MaskMember __bits) noexcept
+  _GLIBCXX_SIMD_INTRINSIC static void
+  _S_masked_store(const _SimdTuple<_Tp, _As...>& __v, _Up*