public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-10815] libstdc++: Always-inline most of non-cmath fixed_size implementation
@ 2023-05-25 7:04 Matthias Kretz
0 siblings, 0 replies; only message in thread
From: Matthias Kretz @ 2023-05-25 7:04 UTC (permalink / raw)
To: gcc-cvs, libstdc++-cvs
https://gcc.gnu.org/g:0911926f37cf41313c26e1e9d89424d64af972c9
commit r11-10815-g0911926f37cf41313c26e1e9d89424d64af972c9
Author: Matthias Kretz <m.kretz@gsi.de>
Date: Mon Feb 20 17:49:37 2023 +0100
libstdc++: Always-inline most of non-cmath fixed_size implementation
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 <m.kretz@gsi.de>
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.
(cherry picked from commit e37b04328ae68f91efe1fb2c5de9122be34bc74a)
Diff:
---
.../include/experimental/bits/simd_fixed_size.h | 60 +++++++++++-----------
1 file changed, 30 insertions(+), 30 deletions(-)
diff --git a/libstdc++-v3/include/experimental/bits/simd_fixed_size.h b/libstdc++-v3/include/experimental/bits/simd_fixed_size.h
index 4a85798e8df..eb08b85f99c 100644
--- a/libstdc++-v3/include/experimental/bits/simd_fixed_size.h
+++ b/libstdc++-v3/include/experimental/bits/simd_fixed_size.h
@@ -1306,7 +1306,8 @@ template <int _Np>
// broadcast {{{2
template <typename _Tp>
- 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 {
@@ -1316,8 +1317,8 @@ template <int _Np>
// _S_generator {{{2
template <typename _Fp, typename _Tp>
- 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 {
@@ -1332,8 +1333,8 @@ template <int _Np>
// _S_load {{{2
template <typename _Tp, typename _Up>
- 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 {
@@ -1343,7 +1344,7 @@ template <int _Np>
// _S_masked_load {{{2
template <typename _Tp, typename... _As, typename _Up>
- 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
{
@@ -1366,8 +1367,8 @@ template <int _Np>
// _S_store {{{2
template <typename _Tp, typename _Up>
- 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>());
@@ -1376,9 +1377,9 @@ template <int _Np>
// _S_masked_store {{{2
template <typename _Tp, typename... _As, typename _Up>
- 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* __mem,
+ const _MaskMember __bits) noexcept
{
__for_each(__v, [&](auto __meta, auto __native) _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA {
if (__meta._S_submask(__bits).any())
@@ -1486,7 +1487,7 @@ template <int _Np>
// _S_min, _S_max {{{2
template <typename _Tp, typename... _As>
- static inline constexpr _SimdTuple<_Tp, _As...>
+ _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdTuple<_Tp, _As...>
_S_min(const _SimdTuple<_Tp, _As...>& __a,
const _SimdTuple<_Tp, _As...>& __b)
{
@@ -1498,7 +1499,7 @@ template <int _Np>
}
template <typename _Tp, typename... _As>
- static inline constexpr _SimdTuple<_Tp, _As...>
+ _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdTuple<_Tp, _As...>
_S_max(const _SimdTuple<_Tp, _As...>& __a,
const _SimdTuple<_Tp, _As...>& __b)
{
@@ -1511,7 +1512,7 @@ template <int _Np>
// _S_complement {{{2
template <typename _Tp, typename... _As>
- static inline constexpr _SimdTuple<_Tp, _As...>
+ _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdTuple<_Tp, _As...>
_S_complement(const _SimdTuple<_Tp, _As...>& __x) noexcept
{
return __x._M_apply_per_chunk(
@@ -1522,7 +1523,7 @@ template <int _Np>
// _S_unary_minus {{{2
template <typename _Tp, typename... _As>
- static inline constexpr _SimdTuple<_Tp, _As...>
+ _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdTuple<_Tp, _As...>
_S_unary_minus(const _SimdTuple<_Tp, _As...>& __x) noexcept
{
return __x._M_apply_per_chunk(
@@ -1535,7 +1536,7 @@ template <int _Np>
#define _GLIBCXX_SIMD_FIXED_OP(name_, op_) \
template <typename _Tp, typename... _As> \
- static inline constexpr _SimdTuple<_Tp, _As...> name_( \
+ _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdTuple<_Tp, _As...> name_( \
const _SimdTuple<_Tp, _As...>& __x, const _SimdTuple<_Tp, _As...>& __y) \
{ \
return __x._M_apply_per_chunk( \
@@ -1558,7 +1559,7 @@ template <int _Np>
#undef _GLIBCXX_SIMD_FIXED_OP
template <typename _Tp, typename... _As>
- static inline constexpr _SimdTuple<_Tp, _As...>
+ _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdTuple<_Tp, _As...>
_S_bit_shift_left(const _SimdTuple<_Tp, _As...>& __x, int __y)
{
return __x._M_apply_per_chunk(
@@ -1568,7 +1569,7 @@ template <int _Np>
}
template <typename _Tp, typename... _As>
- static inline constexpr _SimdTuple<_Tp, _As...>
+ _GLIBCXX_SIMD_INTRINSIC static constexpr _SimdTuple<_Tp, _As...>
_S_bit_shift_right(const _SimdTuple<_Tp, _As...>& __x, int __y)
{
return __x._M_apply_per_chunk(
@@ -1687,10 +1688,9 @@ template <int _Np>
#undef _GLIBCXX_SIMD_APPLY_ON_TUPLE
template <typename _Tp, typename... _Abis>
- static _SimdTuple<_Tp, _Abis...> _S_remquo(
- const _SimdTuple<_Tp, _Abis...>& __x,
- const _SimdTuple<_Tp, _Abis...>& __y,
- __fixed_size_storage_t<int, _SimdTuple<_Tp, _Abis...>::_S_size()>* __z)
+ static inline _SimdTuple<_Tp, _Abis...>
+ _S_remquo(const _SimdTuple<_Tp, _Abis...>& __x, const _SimdTuple<_Tp, _Abis...>& __y,
+ __fixed_size_storage_t<int, _SimdTuple<_Tp, _Abis...>::_S_size()>* __z)
{
return __x._M_apply_per_chunk(
[](auto __impl, const auto __xx, const auto __yy, auto& __zz)
@@ -1711,14 +1711,14 @@ template <int _Np>
}, __exp);
}
-#define _GLIBCXX_SIMD_TEST_ON_TUPLE_(name_) \
- template <typename _Tp, typename... _As> \
- static inline _MaskMember \
- _S_##name_(const _SimdTuple<_Tp, _As...>& __x) noexcept \
- { \
- return _M_test([](auto __impl, \
- auto __xx) { return __impl._S_##name_(__xx); }, \
- __x); \
+#define _GLIBCXX_SIMD_TEST_ON_TUPLE_(name_) \
+ template <typename _Tp, typename... _As> \
+ static inline _MaskMember \
+ _S_##name_(const _SimdTuple<_Tp, _As...>& __x) noexcept \
+ { \
+ return _M_test([] (auto __impl, auto __xx) _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA { \
+ return __impl._S_##name_(__xx); \
+ }, __x); \
}
_GLIBCXX_SIMD_TEST_ON_TUPLE_(isinf)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-05-25 7:04 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-25 7:04 [gcc r11-10815] libstdc++: Always-inline most of non-cmath fixed_size implementation Matthias Kretz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).