diff --git a/Engine/Source/Runtime/Core/public/Math/Detail/IntVector3Decl.inl b/Engine/Source/Runtime/Core/public/Math/Detail/IntVector3Decl.inl index 1e4dbd0..ae81615 100644 --- a/Engine/Source/Runtime/Core/public/Math/Detail/IntVector3Decl.inl +++ b/Engine/Source/Runtime/Core/public/Math/Detail/IntVector3Decl.inl @@ -2,8 +2,6 @@ #include "Core/public/Math/Boilerplate.h" -#include "../IntVector3.hpp" - namespace Phanes::Core::Math::Detail { template<IntType T, bool S> diff --git a/Engine/Source/Runtime/Core/public/Math/Include.h b/Engine/Source/Runtime/Core/public/Math/Include.h index 3080630..460ac8c 100644 --- a/Engine/Source/Runtime/Core/public/Math/Include.h +++ b/Engine/Source/Runtime/Core/public/Math/Include.h @@ -4,4 +4,5 @@ #include "Core/public/Math/Vector2.hpp" // <-- Includes Vector3/4 automatically #include "Core/public/Math/IntVector2.hpp" +#include "Core/public/Math/IntVector3.hpp" #include "Core/public/Math/IntVector4.hpp" \ No newline at end of file diff --git a/Engine/Source/Runtime/Core/public/Math/IntVector3.hpp b/Engine/Source/Runtime/Core/public/Math/IntVector3.hpp index d56696f..248b718 100644 --- a/Engine/Source/Runtime/Core/public/Math/IntVector3.hpp +++ b/Engine/Source/Runtime/Core/public/Math/IntVector3.hpp @@ -73,7 +73,7 @@ namespace Phanes::Core::Math { TIntVector3(const T* comp); - TIntVector3(const TIntVector2<T, A>& v1, const T s) + TIntVector3(const TIntVector2<T, A>& v1, const T s); }; @@ -732,3 +732,4 @@ namespace Phanes::Core::Math { #endif // !INTVECTOR3_H +#include "Core/public/Math/IntVector3.inl" \ No newline at end of file diff --git a/Engine/Source/Runtime/Core/public/Math/IntVector3.inl b/Engine/Source/Runtime/Core/public/Math/IntVector3.inl index fcc7093..26daf56 100644 --- a/Engine/Source/Runtime/Core/public/Math/IntVector3.inl +++ b/Engine/Source/Runtime/Core/public/Math/IntVector3.inl @@ -7,7 +7,6 @@ #include "Core/public/Math/SIMD/PhanesSIMDTypes.h" -#include "IntVector3.hpp" namespace Phanes::Core::Math { @@ -20,7 +19,7 @@ namespace Phanes::Core::Math template<IntType T, bool A> TIntVector3<T, A>::TIntVector3(const T _x, const T _y, const T _z) { - Detail::construct_ivec3<T, SIMD::use_simd<T, 3, A>::value>::map(*this, _x, _y, _z, _w); + Detail::construct_ivec3<T, SIMD::use_simd<T, 3, A>::value>::map(*this, _x, _y, _z); } template<IntType T, bool A> diff --git a/Engine/Source/Runtime/Core/public/Math/IntVector4.hpp b/Engine/Source/Runtime/Core/public/Math/IntVector4.hpp index 60e74d3..037277b 100644 --- a/Engine/Source/Runtime/Core/public/Math/IntVector4.hpp +++ b/Engine/Source/Runtime/Core/public/Math/IntVector4.hpp @@ -591,7 +591,7 @@ namespace Phanes::Core::Math { (v1.x > 0) ? 1 : -1, (v1.y > 0) ? 1 : -1, (v1.z > 0) ? 1 : -1, - (v1.w > 0) ? 1 : -1, + (v1.w > 0) ? 1 : -1 ); } diff --git a/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathFPU.hpp b/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathFPU.hpp index c2794ea..853d748 100644 --- a/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathFPU.hpp +++ b/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathFPU.hpp @@ -495,4 +495,452 @@ namespace Phanes::Core::Math::Detail }; + // =============== // + // TIntVector4 // + // =============== // + + template<> + struct construct_ivec4<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, const TIntVector4<int, true>& v2) + { + v1.x = v2.x; + v1.y = v2.y; + v1.z = v2.z; + v1.w = v2.w; + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + v1.x = s; + v1.y = s; + v1.z = s; + v1.w = s; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, int x, int y, int z, int w) + { + v1.x = x; + v1.y = y; + v1.y = z; + v1.y = w; + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, const int* comp) + { + v1.x = comp[0]; + v1.y = comp[1]; + v1.z = comp[2]; + v1.w = comp[3]; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector2<int, true>& v1, const Phanes::Core::Math::TIntVector2<int, true>& v2) + { + r.x = v1.x; + r.y = v1.y; + r.x = v2.x; + r.y = v2.y; + } + }; + + template<> + struct compute_ivec4_add<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x + v2.x; + r.y = v1.y + v2.y; + r.z = v1.z + v2.z; + r.w = v1.w + v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x + s; + r.y = v1.y + s; + r.z = v1.z + s; + r.w = v1.w + s; + } + }; + + template<> + struct compute_ivec4_sub<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x - v2.x; + r.y = v1.y - v2.y; + r.z = v1.z - v2.z; + r.w = v1.w - v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x - s; + r.y = v1.y - s; + r.z = v1.z - s; + r.w = v1.w - s; + } + }; + + template<> + struct compute_ivec4_mul<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x * v2.x; + r.y = v1.y * v2.y; + r.z = v1.z * v2.z; + r.w = v1.w * v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x * s; + r.y = v1.y * s; + r.z = v1.z * s; + r.w = v1.w * s; + } + }; + + template<> + struct compute_ivec4_inc<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1) + { + r.x = v1.x + 1; + r.y = v1.y + 1; + r.z = v1.z + 1; + r.w = v1.w + 1; + } + }; + + template<> + struct compute_ivec4_dec<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1) + { + r.x = v1.x - 1; + r.y = v1.y - 1; + r.z = v1.z - 1; + r.w = v1.w - 1; + } + }; + + template<> + struct compute_ivec4_and<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x & v2.x; + r.y = v1.y & v2.y; + r.z = v1.z & v2.z; + r.w = v1.w & v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x & s; + r.y = v1.y & s; + r.z = v1.z & s; + r.w = v1.w & s; + } + }; + + template<> + struct compute_ivec4_or<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x | v2.x; + r.y = v1.y | v2.y; + r.z = v1.z | v2.z; + r.w = v1.w | v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x | s; + r.y = v1.y | s; + r.z = v1.z | s; + r.w = v1.w | s; + } + }; + + template<> + struct compute_ivec4_xor<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x ^ v2.x; + r.y = v1.y ^ v2.y; + r.z = v1.z ^ v2.z; + r.w = v1.w ^ v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x ^ s; + r.y = v1.y ^ s; + r.z = v1.z ^ s; + r.w = v1.w ^ s; + } + }; + + template<> + struct compute_ivec4_left_shift<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x << v2.x; + r.y = v1.y << v2.y; + r.z = v1.z << v2.z; + r.w = v1.w << v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x << s; + r.y = v1.y << s; + r.z = v1.z << s; + r.w = v1.w << s; + } + }; + + template<> + struct compute_ivec4_right_shift<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.x = v1.x >> v2.x; + r.y = v1.y >> v2.y; + r.z = v1.z >> v2.z; + r.w = v1.w >> v2.w; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.x = v1.x >> s; + r.y = v1.y >> s; + r.z = v1.z >> s; + r.w = v1.w >> s; + } + }; + + + // =============== // + // TIntVector3 // + // =============== // + + + template<> + struct construct_ivec3<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, const TIntVector3<int, true>& v2) + { + v1.x = v2.x; + v1.y = v2.y; + v1.z = v2.z; + v1.w = (T)0; + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, int s) + { + v1.x = s; + v1.y = s; + v1.z = s; + v1.w = (T)0; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, int x, int y, int z) + { + v1.x = x; + v1.y = y; + v1.y = z; + v1.w = (T)0; + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, const int* comp) + { + v1.x = comp[0]; + v1.y = comp[1]; + v1.z = comp[2]; + v1.w = (T)0; + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& r, const Phanes::Core::Math::TIntVector2<int, true>& v1, const int s) + { + v1.x = v2.x; + v1.y = v2.y; + v1.z = s; + v1.w = (T)0; + } + }; + + + template<> struct compute_ivec3_add<int, true> : public compute_ivec4_add<int, true> {}; + template<> struct compute_ivec3_sub<int, true> : public compute_ivec4_sub<int, true> {}; + template<> struct compute_ivec3_mul<int, true> : public compute_ivec4_mul<int, true> {}; + template<> struct compute_ivec3_div<int, true> : public compute_ivec4_div<int, true> {}; + template<> struct compute_ivec3_inc<int, true> : public compute_ivec4_inc<int, true> {}; + template<> struct compute_ivec3_dec<int, true> : public compute_ivec4_dec<int, true> {}; + + + template<> struct compute_ivec3_and<int, true> : public compute_ivec4_and<int, true> {}; + template<> struct compute_ivec3_or<int, true> : public compute_ivec4_or<int, true> {}; + template<> struct compute_ivec3_xor<int, true> : public compute_ivec4_xor<int, true> {}; + template<> struct compute_ivec3_left_shift<int, true> : public compute_ivec4_left_shift<int, true> {}; + template<> struct compute_ivec3_right_shift<int, true> : public compute_ivec4_right_shift<int, true> {}; + + + // =============== // + // TIntVector2 // + // =============== // + + template<> + struct construct_ivec2<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + v1.comp = _mm_setr_epi64x(v2.x, v2.y); + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, Phanes::Core::Types::int64 s) + { + v1.comp = _mm_set1_epi64x(s); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, Phanes::Core::Types::int64 x, Phanes::Core::Types::int64 y) + { + v1.comp = _mm_setr_epi64x(x, y); + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Types::int64* comp) + { + v1.comp = _mm_loadu_epi64(comp); + } + }; + + template<> + struct compute_ivec2_add<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + r.comp = _mm_add_epi64(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, T s) + { + r.comp = _mm_add_epi64(v1.comp, _mm_set1_epi64x(s)); + } + }; + + template<> + struct compute_ivec2_sub<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + r.comp = _mm_sub_epi64(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, T s) + { + r.comp = _mm_sub_epi64(v1.comp, _mm_set1_epi64x(s)); + } + }; + + template<> + struct compute_ivec2_inc<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1) + { + r.comp = _mm_add_epi64(v1.comp, _mm_set1_epi64x(1)); + } + }; + + template<> + struct compute_ivec2_dec<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1) + { + r.comp = _mm_sub_epi64(v1.comp, _mm_set1_epi64x(1)); + } + }; + + template<> + struct compute_ivec2_and<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + r.comp = _mm_and_si128(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, T s) + { + r.comp = _mm_and_si128(v1.comp, _mm_set1_epi64x(s)); + } + }; + + template<> + struct compute_ivec2_or<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + r.comp = _mm_or_si128(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, T s) + { + r.comp = _mm_or_si128(v1.comp, _mm_set1_epi64x(s)); + } + }; + + template<> + struct compute_ivec2_xor<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + r.comp = _mm_xor_si128(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, T s) + { + r.comp = _mm_xor_si128(v1.comp, _mm_set1_epi64x(s)); + } + }; + + template<> + struct compute_ivec2_left_shift<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + r.comp = _mm_sll_epi64(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, T s) + { + r.comp = _mm_sll_epi64(v1.comp, _mm_set1_epi64x(s)); + } + }; + + template<> + struct compute_ivec2_right_shift<Phanes::Core::Types::int64, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) + { + r.comp = _mm_srl_epi64(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, T s) + { + r.comp = _mm_srl_epi64(v1.comp, _mm_set1_epi64x(s)); + } + }; + } \ No newline at end of file diff --git a/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathSSE.hpp b/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathSSE.hpp index 31ea41f..440f5dd 100644 --- a/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathSSE.hpp +++ b/Engine/Source/Runtime/Core/public/Math/SIMD/PhanesVectorMathSSE.hpp @@ -349,12 +349,230 @@ namespace Phanes::Core::Math::Detail } }; + // =============== // + // TIntVector4 // + // =============== // + + template<> + struct construct_ivec4<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, const TIntVector4<int, true>& v2) + { + v1.comp = _mm_setr_epi32(v2.x, v2.y, v2.z, v2.w); + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + v1.comp = _mm_set1_epi32(s); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, int x, int y, int z, int w) + { + v1.comp = _mm_setr_epi32(x, y, z, w); + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, const int* comp) + { + v1.comp = _mm_loadu_epi32(comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector2<int, true>& v1, const Phanes::Core::Math::TIntVector2<int, true>& v2) + { + r.comp = _mm_setr_epi32(v1.x, v1.y, v2.x, v2.y); + } + }; + + template<> + struct compute_ivec4_add<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_add_epi32(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_add_epi32(v1.comp, _mm_set1_epi32(s)); + } + }; + + template<> + struct compute_ivec4_sub<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_sub_epi32(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_sub_epi32(v1.comp, _mm_set1_epi32(s)); + } + }; + + template<> + struct compute_ivec4_mul<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_mul_epi32(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_mul_epi32(v1.comp, _mm_set1_epi32(s)); + } + }; + + template<> + struct compute_ivec4_inc<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1) + { + r.comp = _mm_add_epi32(v1.comp, _mm_set1_epi32(1)); + } + }; + + template<> + struct compute_ivec4_dec<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1) + { + r.comp = _mm_sub_epi32(v1.comp, _mm_set1_epi32(1)); + } + }; + + template<> + struct compute_ivec4_and<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_and_si128(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_and_si128(v1.comp, _mm_set1_epi32(s)); + } + }; + + template<> + struct compute_ivec4_or<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_or_si128(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_or_si128(v1.comp, _mm_set1_epi32(s)); + } + }; + + template<> + struct compute_ivec4_xor<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_xor_si128(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_xor_si128(v1.comp, _mm_set1_epi32(s)); + } + }; + + template<> + struct compute_ivec4_left_shift<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_sll_epi32(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_sll_epi32(v1.comp, _mm_set1_epi32(s)); + } + }; + + template<> + struct compute_ivec4_right_shift<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) + { + r.comp = _mm_srl_epi32(v1.comp, v2.comp); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, int s) + { + r.comp = _mm_srl_epi32(v1.comp, _mm_set1_epi32(s)); + } + }; + + + // =============== // + // TIntVector3 // + // =============== // + + + template<> + struct construct_ivec3<int, true> + { + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, const TIntVector3<int, true>& v2) + { + v1.comp = _mm_setr_epi32(v2.x, v2.y, v2.z, v2.w); + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, int s) + { + v1.comp = _mm_set1_epi32(s); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, int x, int y, int z) + { + v1.comp = _mm_setr_epi32(x, y, z, 0); + } + + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& v1, const int* comp) + { + v1.comp = _mm_setr_epi32(comp[0], comp[1], comp[2], 0); + } + + static FORCEINLINE void map(Phanes::Core::Math::TIntVector3<int, true>& r, const Phanes::Core::Math::TIntVector2<int, true>& v1, const int s) + { + r.comp = _mm_setr_epi32(v1.x, v1.y, s, 0); + } + }; + + + template<> struct compute_ivec3_add<int, true> : public compute_ivec4_add<int, true> {}; + template<> struct compute_ivec3_sub<int, true> : public compute_ivec4_sub<int, true> {}; + template<> struct compute_ivec3_mul<int, true> : public compute_ivec4_mul<int, true> {}; + template<> struct compute_ivec3_div<int, true> : public compute_ivec4_div<int, true> {}; + template<> struct compute_ivec3_inc<int, true> : public compute_ivec4_inc<int, true> {}; + template<> struct compute_ivec3_dec<int, true> : public compute_ivec4_dec<int, true> {}; + + + template<> struct compute_ivec3_and<int, true> : public compute_ivec4_and<int, true> {}; + template<> struct compute_ivec3_or<int, true> : public compute_ivec4_or<int, true> {}; + template<> struct compute_ivec3_xor<int, true> : public compute_ivec4_xor<int, true> {}; + template<> struct compute_ivec3_left_shift<int, true> : public compute_ivec4_left_shift<int, true> {}; + template<> struct compute_ivec3_right_shift<int, true> : public compute_ivec4_right_shift<int, true> {}; + + // =============== // // TIntVector2 // // =============== // template<> - struct construct_ivec2<Phanes::Core::Types::int64, true> + struct construct_ivec2<Phanes::Core::Types::int64, true> { static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const TIntVector2<Phanes::Core::Types::int64, true>& v2) { @@ -380,7 +598,7 @@ namespace Phanes::Core::Math::Detail }; template<> - struct compute_ivec2_add<Phanes::Core::Types::int64, true> + struct compute_ivec2_add<Phanes::Core::Types::int64, true> { static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) { @@ -394,7 +612,7 @@ namespace Phanes::Core::Math::Detail }; template<> - struct compute_ivec2_sub<Phanes::Core::Types::int64, true> + struct compute_ivec2_sub<Phanes::Core::Types::int64, true> { static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v2) { @@ -408,7 +626,7 @@ namespace Phanes::Core::Math::Detail }; template<> - struct compute_ivec2_inc<Phanes::Core::Types::int64, true> + struct compute_ivec2_inc<Phanes::Core::Types::int64, true> { static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1) { @@ -417,7 +635,7 @@ namespace Phanes::Core::Math::Detail }; template<> - struct compute_ivec2_dec<Phanes::Core::Types::int64, true> + struct compute_ivec2_dec<Phanes::Core::Types::int64, true> { static FORCEINLINE void map(Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& r, const Phanes::Core::Math::TIntVector2<Phanes::Core::Types::int64, true>& v1) { @@ -494,157 +712,4 @@ namespace Phanes::Core::Math::Detail r.comp = _mm_srl_epi64(v1.comp, _mm_set1_epi64x(s)); } }; - - - // =============== // - // TIntVector4 // - // =============== // - - template<> - struct construct_ivec4<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, const TIntVector4<int, true>& v2) - { - v1.comp = _mm_setr_epi32(v2.x, v2.y, v2.z, v2.w); - } - - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, int s) - { - v1.comp = _mm_set1_epi32(s); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, int x, int y, int z, int w) - { - v1.comp = _mm_setr_epi32(x, y, z, w); - } - - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& v1, const int* comp) - { - v1.comp = _mm_loadu_epi32(comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector2<int, true>& v1, const Phanes::Core::Math::TIntVector2<int, true>& v2) - { - r.comp = _mm_setr_epi32(v1.x, v1.y, v2.x, v2.y); - } - }; - - template<> - struct compute_ivec4_add<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) - { - r.comp = _mm_add_epi32(v1.comp, v2.comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, T s) - { - r.comp = _mm_add_epi32(v1.comp, _mm_set1_epi32(s)); - } - }; - - template<> - struct compute_ivec4_sub<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) - { - r.comp = _mm_sub_epi32(v1.comp, v2.comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, T s) - { - r.comp = _mm_sub_epi32(v1.comp, _mm_set1_epi32(s)); - } - }; - - template<> - struct compute_ivec4_inc<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1) - { - r.comp = _mm_add_epi32(v1.comp, _mm_set1_epi32(1)); - } - }; - - template<> - struct compute_ivec4_dec<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1) - { - r.comp = _mm_sub_epi32(v1.comp, _mm_set1_epi32(1)); - } - }; - - template<> - struct compute_ivec4_and<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) - { - r.comp = _mm_and_si128(v1.comp, v2.comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, T s) - { - r.comp = _mm_and_si128(v1.comp, _mm_set1_epi32(s)); - } - }; - - template<> - struct compute_ivec4_or<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) - { - r.comp = _mm_or_si128(v1.comp, v2.comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, T s) - { - r.comp = _mm_or_si128(v1.comp, _mm_set1_epi32(s)); - } - }; - - template<> - struct compute_ivec4_xor<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) - { - r.comp = _mm_xor_si128(v1.comp, v2.comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, T s) - { - r.comp = _mm_xor_si128(v1.comp, _mm_set1_epi32(s)); - } - }; - - template<> - struct compute_ivec4_left_shift<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) - { - r.comp = _mm_sll_epi32(v1.comp, v2.comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, T s) - { - r.comp = _mm_sll_epi32(v1.comp, _mm_set1_epi32(s)); - } - }; - - template<> - struct compute_ivec4_right_shift<int, true> - { - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, const Phanes::Core::Math::TIntVector4<int, true>& v2) - { - r.comp = _mm_srl_epi32(v1.comp, v2.comp); - } - - static FORCEINLINE void map(Phanes::Core::Math::TIntVector4<int, true>& r, const Phanes::Core::Math::TIntVector4<int, true>& v1, T s) - { - r.comp = _mm_srl_epi32(v1.comp, _mm_set1_epi32(s)); - } - }; - } \ No newline at end of file