simd constexpr vec: more improvement

This commit is contained in:
sharkautarch 2024-09-15 13:24:12 -04:00
parent d5f8676b3a
commit 7144171b20
No known key found for this signature in database
GPG Key ID: F270CA9462164405
3 changed files with 19 additions and 17 deletions

View File

@ -3,19 +3,19 @@ namespace glm::detail
{ {
consteval bool NotEmpty(length_t I, length_t L) { return I <= L; } consteval bool NotEmpty(length_t I, length_t L) { return I <= L; }
struct Empty {}; struct Empty {};
struct RowTwo { struct GLM_TRIVIAL RowTwo {
[[no_unique_address]] Empty y; [[no_unique_address]] Empty g; [[no_unique_address]] Empty t; [[no_unique_address]] Empty y; [[no_unique_address]] Empty g; [[no_unique_address]] Empty t;
}; };
struct RowThree { struct GLM_TRIVIAL RowThree {
[[no_unique_address]] Empty z; [[no_unique_address]] Empty b; [[no_unique_address]] Empty p; [[no_unique_address]] Empty z; [[no_unique_address]] Empty b; [[no_unique_address]] Empty p;
}; };
struct RowFour { struct GLM_TRIVIAL RowFour {
[[no_unique_address]] Empty w; [[no_unique_address]] Empty a; [[no_unique_address]] Empty q; [[no_unique_address]] Empty w; [[no_unique_address]] Empty a; [[no_unique_address]] Empty q;
}; };
template <qualifier Q, typename T, length_t L> template <qualifier Q, typename T, length_t L>
struct ElementCollection; struct ElementCollection;
template <qualifier Q, typename T> template <qualifier Q, typename T>
struct ElementCollection<Q, T, 4> { struct GLM_TRIVIAL ElementCollection<Q, T, 4> {
using data_t = typename detail::storage<4, T, detail::is_aligned<Q>::value>::type; using data_t = typename detail::storage<4, T, detail::is_aligned<Q>::value>::type;
union union
{ {
@ -31,7 +31,7 @@ namespace glm::detail
template <qualifier Q, typename T> template <qualifier Q, typename T>
struct ElementCollection<Q, T, 3> : RowFour { struct GLM_TRIVIAL ElementCollection<Q, T, 3> : RowFour {
using data_t = typename detail::storage<3, T, detail::is_aligned<Q>::value>::type; using data_t = typename detail::storage<3, T, detail::is_aligned<Q>::value>::type;
using RowFour::w; using RowFour::w;
using RowFour::a; using RowFour::a;
@ -47,7 +47,7 @@ namespace glm::detail
}; };
}; };
template <qualifier Q, typename T> template <qualifier Q, typename T>
struct ElementCollection<Q, T, 2> : RowThree, RowFour { struct GLM_TRIVIAL ElementCollection<Q, T, 2> : RowThree, RowFour {
using data_t = typename detail::storage<2, T, detail::is_aligned<Q>::value>::type; using data_t = typename detail::storage<2, T, detail::is_aligned<Q>::value>::type;
using RowThree::z; using RowThree::z;
using RowThree::b; using RowThree::b;
@ -65,7 +65,7 @@ namespace glm::detail
}; };
}; };
template <qualifier Q, typename T> template <qualifier Q, typename T>
struct ElementCollection<Q, T, 1> : RowTwo, RowThree, RowFour { struct GLM_TRIVIAL ElementCollection<Q, T, 1> : RowTwo, RowThree, RowFour {
using data_t = typename detail::storage<1, T, detail::is_aligned<Q>::value>::type; using data_t = typename detail::storage<1, T, detail::is_aligned<Q>::value>::type;
using RowTwo::y; using RowTwo::y;
using RowTwo::g; using RowTwo::g;

View File

@ -69,7 +69,7 @@ namespace glm::detail
{ {
//assuming that number of scalars is always the same as the length of the to-be-constructed vector //assuming that number of scalars is always the same as the length of the to-be-constructed vector
gcc_vec_t v; gcc_vec_t v;
std::array<T, sizeof...(scalars)> pack{scalars...}; std::array<T, sizeof...(scalars)> pack{static_cast<T>(scalars)...};
for (int i = 0; i != sizeof...(scalars); i++ ) { for (int i = 0; i != sizeof...(scalars); i++ ) {
v[i] = pack[i]; v[i] = pack[i];
pack[i].T::~T(); pack[i].T::~T();

View File

@ -16,6 +16,11 @@
#include <ranges> #include <ranges>
namespace glm namespace glm
{ {
#ifdef __clang__
#define GLM_TRIVIAL __attribute__((trivial_abi))
#else
#define GLM_TRIVIAL
#endif
template <length_t L> template <length_t L>
concept NotVec1 = !std::is_same_v<std::integral_constant<length_t, L>, std::integral_constant<length_t, 1>>; concept NotVec1 = !std::is_same_v<std::integral_constant<length_t, L>, std::integral_constant<length_t, 1>>;
template <qualifier Q> template <qualifier Q>
@ -119,7 +124,7 @@ namespace glm
template <length_t L, typename T, qualifier Q> template <length_t L, typename T, qualifier Q>
using EC = detail::ElementCollection<Q, T, L>; using EC = detail::ElementCollection<Q, T, L>;
template<length_t L, typename T, qualifier Q> template<length_t L, typename T, qualifier Q>
struct vec : detail::ElementCollection<Q, T, L> struct GLM_TRIVIAL vec : detail::ElementCollection<Q, T, L>
{ {
// -- Data -- // -- Data --
using detail::ElementCollection<Q, T, L>::x; using detail::ElementCollection<Q, T, L>::x;
@ -282,7 +287,7 @@ namespace glm
} }
} }
template <length_t len> template <length_t len>
using RetArr = T[len]; using RetArr = std::array<T, len>;
template <typename Vs0> template <typename Vs0>
static constexpr length_t ctor_mixed_constexpr_single_get_length() static constexpr length_t ctor_mixed_constexpr_single_get_length()
@ -353,19 +358,16 @@ namespace glm
const auto params = std::tuple{vecOrScalar...}; const auto params = std::tuple{vecOrScalar...};
const auto arr = ctor_mixed_constexpr_single(std::get<0>(params)); const auto arr = ctor_mixed_constexpr_single(std::get<0>(params));
if (arr) [[likely]] std::ranges::copy(arr.cbegin(), aa.a.p.begin()+i, aa.a.p.begin()+i + sizeof(T)*lengths[0]);
std::memcpy(aa.a.p.begin()+i, arr, sizeof(T)*lengths[0]);
constexpr auto i2 = i + lengths[0]; constexpr auto i2 = i + lengths[0];
if constexpr (sizeof...(VecOrScalar) > 1) { if constexpr (sizeof...(VecOrScalar) > 1) {
const auto arr2 = ctor_mixed_constexpr_single(std::get<1>(params)); const auto arr2 = ctor_mixed_constexpr_single(std::get<1>(params));
if (arr2) [[likely]] std::ranges::copy(arr2.cbegin(), aa.a.p.begin()+i2, aa.a.p.begin()+i2 + sizeof(T)*lengths[1]);
std::memcpy(aa.a.p.begin()+i2, arr2, sizeof(T)*lengths[1]);
constexpr auto i3 = i2 + lengths[1]; constexpr auto i3 = i2 + lengths[1];
if constexpr (sizeof...(VecOrScalar) > 2) { if constexpr (sizeof...(VecOrScalar) > 2) {
const auto arr3 = ctor_mixed_constexpr_single(std::get<2>(params)); const auto arr3 = ctor_mixed_constexpr_single(std::get<2>(params));
if (arr3) [[likely]] std::ranges::copy(arr3.cbegin(), aa.a.p.begin()+i3, aa.a.p.begin()+i3 + sizeof(T)*lengths[2]);
std::memcpy(aa.a.p.begin()+i3, arr3, sizeof(T)*lengths[2]);
} }
} }
@ -460,7 +462,7 @@ namespace glm
} }
template<typename Tx> template<typename Tx>
inline GLM_CONSTEXPR vec<L, T, Q> & operator*=(vec<L, Tx, Q> const& __restrict__ v) __restrict__ inline GLM_CONSTEXPR vec<L, T, Q> & operator*=(vec<L, Tx, Q> const& __restrict__ v)
{ {
if constexpr (L < 3) { if constexpr (L < 3) {
this->data *= v.data; this->data *= v.data;