diff --git a/src/tenvex/expressions/core.h b/src/tenvex/expressions/core.h index dee9a82..69c44f2 100644 --- a/src/tenvex/expressions/core.h +++ b/src/tenvex/expressions/core.h @@ -87,6 +87,14 @@ vf4 dot3(vf4 l, vf4 r) noexcept return _mm_shuffle_ps(xyz, xyz, _MM_SHUFFLE(0, 0, 0, 0)); } +[[nodiscard]] TNVX_INLINE +vf4 dot4(vf4 l, vf4 r) noexcept +{ + vf4 t = _mm_mul_ps(l, r); + vf4 h = _mm_hadd_ps(t, t); + return _mm_hadd_ps(h, h); +} + [[nodiscard]] TNVX_INLINE vf4 magnitude3(vf4 v) noexcept { diff --git a/src/tenvex/expressions/dot4.h b/src/tenvex/expressions/dot4.h new file mode 100644 index 0000000..59a9f9e --- /dev/null +++ b/src/tenvex/expressions/dot4.h @@ -0,0 +1,43 @@ +#pragma once + +#include "core.h" +#include "expression.h" +#include "traits.h" +#include "concepts.h" + +namespace tnvx +{ + +template +struct Dot4 : Expr> +{ + TNVX_INLINE + Dot4(const L& TNVX_RESTRICT l, const R& TNVX_RESTRICT r) noexcept; + + [[nodiscard]] TNVX_INLINE + vf4 eval() const noexcept; + + [[nodiscard]] TNVX_INLINE + operator float() const noexcept; + +private: + tnvx_ref_or_value_t _l; + tnvx_ref_or_value_t _r; +}; + +template inline constexpr bool is_scalar_expr> = true; + +template +[[nodiscard]] TNVX_INLINE +Dot3 dot4(const L& l, const R& r) noexcept; + +template +TNVX_INLINE +Dot3 dot4(const L& l, const R& r) noexcept +{ + return { l, r }; +} + +} + +#include "dot4_impl.hpp" diff --git a/src/tenvex/expressions/dot4_impl.hpp b/src/tenvex/expressions/dot4_impl.hpp new file mode 100644 index 0000000..5161d37 --- /dev/null +++ b/src/tenvex/expressions/dot4_impl.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include "dot4.h" + +namespace tnvx +{ + +template +TNVX_INLINE +Dot4::Dot4(const L& TNVX_RESTRICT l, const R& TNVX_RESTRICT r) noexcept + : _l(l) + , _r(r) +{ +} + +template +TNVX_INLINE +vf4 Dot4::eval() const noexcept +{ + return detail::dot4(_l.eval(), _r.eval()); +} + +template +TNVX_INLINE +Dot4::operator float() const noexcept +{ + return detail::to_float(eval()); +} + +} diff --git a/src/tenvex/tenvex.h b/src/tenvex/tenvex.h index ad2e4ba..c9e9162 100644 --- a/src/tenvex/tenvex.h +++ b/src/tenvex/tenvex.h @@ -7,6 +7,7 @@ #include "expressions/mul.h" #include "expressions/div.h" #include "expressions/dot3.h" +#include "expressions/dot4.h" #include "expressions/magnitude3.h" #include "expressions/norm3.h" #include "expressions/cross3.h"