29#ifndef PXFOUNDATION_PXUNIXSSE2INLINEAOS_H
30#define PXFOUNDATION_PXUNIXSSE2INLINEAOS_H
32#if !COMPILE_VECTOR_INTRINSICS
33#error Vector intrinsics should not be included when using scalar implementation.
40#include "../../PxVecMathSSE.h"
47#define PX_FPCLASS_SNAN 0x0001
48#define PX_FPCLASS_QNAN 0x0002
49#define PX_FPCLASS_NINF 0x0004
50#define PX_FPCLASS_PINF 0x0200
54 return _mm_castsi128_ps(n);
58 return _mm_castps_si128(n);
65#define FLOAT_COMPONENTS_EQUAL_THRESHOLD 0.01f
68 const PxF32 x = V4ReadX(a);
69 const PxF32 y = V4ReadY(a);
70 const PxF32 z = V4ReadZ(a);
71 const PxF32 w = V4ReadW(a);
73 return (x == y && x == z && x == w);
100 return (f[3] == 0.0f);
105 return !FAllEq(V4LengthSq(a), FZero());
110 return(0 == (
size_t(a) & 0x0f));
116#define ASSERT_ISVALIDVEC3V(a) PX_ASSERT(isValidVec3V(a))
117#define ASSERT_ISVALIDFLOATV(a) PX_ASSERT(isValidFloatV(a))
118#define ASSERT_ISALIGNED16(a) PX_ASSERT(isAligned16(reinterpret_cast<void*>(a)))
119#define ASSERT_ISFINITELENGTH(a)
121#define ASSERT_ISVALIDVEC3V(a)
122#define ASSERT_ISVALIDFLOATV(a)
123#define ASSERT_ISALIGNED16(a)
124#define ASSERT_ISFINITELENGTH(a)
128namespace internalUnitSSE2Simd
132 const PxI32 moveMask = _mm_movemask_ps(a);
133 return PxU32(moveMask == 0xf);
138 const PxI32 moveMask = _mm_movemask_ps(a);
139 return PxU32((moveMask & 0x7) == 0x7);
144 const PxI32 moveMask = _mm_movemask_ps(a);
145 return PxU32(moveMask != 0x0);
150 const PxI32 moveMask = _mm_movemask_ps(a);
151 return PxU32((moveMask & 0x7) != 0x0);
160 const BoolV one = FOne();
161 const BoolV
zero = FZero();
162 const BoolV a1 = V4Sel(a, one, zero);
163 const BoolV b1 = V4Sel(b, one, zero);
165 _mm_comieq_ss(a1, b1) &&
166 _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(1, 1, 1, 1)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(1, 1, 1, 1))) &&
167 _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(2, 2, 2, 2)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(2, 2, 2, 2))) &&
168 _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(3, 3, 3, 3)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(3, 3, 3, 3))));
174#pragma clang diagnostic push
175#pragma clang diagnostic ignored "-Wglobal-constructors"
178const PX_ALIGN(16, PxF32 gMaskXYZ[4]) = { physx::PxUnionCast<PxF32>(0xffffffff), physx::PxUnionCast<PxF32>(0xffffffff),
179 physx::PxUnionCast<PxF32>(0xffffffff), 0 };
182#pragma clang diagnostic pop
188const PX_ALIGN(16, PxU32 gMaskXYZ[4]) = { 0xffffffff, 0xffffffff, 0xffffffff, 0 };
192namespace vecMathTests
197 const float f = 1.0f;
198 return _mm_load1_ps(&f);
201PX_FORCE_INLINE bool allElementsEqualFloatV(
const FloatV a,
const FloatV b)
203 ASSERT_ISVALIDFLOATV(a);
204 ASSERT_ISVALIDFLOATV(b);
205 return _mm_comieq_ss(a, b) != 0;
208PX_FORCE_INLINE bool allElementsEqualVec3V(
const Vec3V a,
const Vec3V b)
210 return V3AllEq(a, b) != 0;
213PX_FORCE_INLINE bool allElementsEqualVec4V(
const Vec4V a,
const Vec4V b)
215 return V4AllEq(a, b) != 0;
218PX_FORCE_INLINE bool allElementsEqualBoolV(
const BoolV a,
const BoolV b)
220 return internalUnitSSE2Simd::BAllTrue4_R(VecI32V_IsEq(m128_F2I(a), m128_F2I(b))) != 0;
223PX_FORCE_INLINE bool allElementsEqualVecU32V(
const VecU32V a,
const VecU32V b)
225 return internalUnitSSE2Simd::BAllTrue4_R(V4IsEqU32(a, b)) != 0;
228PX_FORCE_INLINE bool allElementsEqualVecI32V(
const VecI32V a,
const VecI32V b)
230 BoolV c = m128_I2F(_mm_cmpeq_epi32(a, b));
231 return internalUnitSSE2Simd::BAllTrue4_R(c) != 0;
234#define VECMATH_AOS_EPSILON (1e-3f)
236PX_FORCE_INLINE bool allElementsNearEqualFloatV(
const FloatV a,
const FloatV b)
238 ASSERT_ISVALIDFLOATV(a);
239 ASSERT_ISVALIDFLOATV(b);
240 const FloatV c = FSub(a, b);
241 const FloatV minError = FLoad(-VECMATH_AOS_EPSILON);
242 const FloatV maxError = FLoad(VECMATH_AOS_EPSILON);
243 return _mm_comigt_ss(c, minError) && _mm_comilt_ss(c, maxError);
246PX_FORCE_INLINE bool allElementsNearEqualVec3V(
const Vec3V a,
const Vec3V b)
248 const Vec3V c = V3Sub(a, b);
249 const Vec3V minError = V3Load(-VECMATH_AOS_EPSILON);
250 const Vec3V maxError = V3Load(VECMATH_AOS_EPSILON);
251 return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError) &&
252 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError) &&
253 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError) &&
254 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError) &&
255 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError) &&
256 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError));
259PX_FORCE_INLINE bool allElementsNearEqualVec4V(
const Vec4V a,
const Vec4V b)
261 const Vec4V c = V4Sub(a, b);
262 const Vec4V minError = V4Load(-VECMATH_AOS_EPSILON);
263 const Vec4V maxError = V4Load(VECMATH_AOS_EPSILON);
264 return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError) &&
265 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError) &&
266 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError) &&
267 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError) &&
268 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError) &&
269 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError) &&
270 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), minError) &&
271 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), maxError));
282 physx::PxUnionCast<PxF32, PxU32>(PX_FPCLASS_SNAN | PX_FPCLASS_QNAN | PX_FPCLASS_NINF | PX_FPCLASS_PINF);
283 const FloatV vBadNum = FLoad(badNumber);
284 const BoolV vMask = BAnd(vBadNum, a);
285 return internalUnitSSE2Simd::FiniteTestEq(vMask, BFFFF()) == 1;
291 physx::PxUnionCast<PxF32, PxU32>(PX_FPCLASS_SNAN | PX_FPCLASS_QNAN | PX_FPCLASS_NINF | PX_FPCLASS_PINF);
292 const Vec3V vBadNum = V3Load(badNumber);
293 const BoolV vMask = BAnd(BAnd(vBadNum, a), BTTTF());
294 return internalUnitSSE2Simd::FiniteTestEq(vMask, BFFFF()) == 1;
308 physx::PxUnionCast<PxF32, PxU32>(PX_FPCLASS_SNAN | PX_FPCLASS_QNAN | PX_FPCLASS_NINF | PX_FPCLASS_PINF);
309 const Vec4V vBadNum = V4Load(badNumber);
310 const BoolV vMask = BAnd(vBadNum, a);
312 return internalUnitSSE2Simd::FiniteTestEq(vMask, BFFFF()) == 1;
317 ASSERT_ISVALIDFLOATV(a);
318 return _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ? true :
false;
323 return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ||
324 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) ||
325 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero()));
330 return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ||
331 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) ||
332 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero()) ||
333 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FZero()));
342 return _mm_load1_ps(&f);
347 return _mm_set_ps(0.0f, f, f, f);
352 return _mm_load1_ps(&f);
357 const PxU32 i = PxU32(-PxI32(f));
358 return _mm_load1_ps(
reinterpret_cast<const float*
>(&i));
363 ASSERT_ISALIGNED16(
const_cast<PxVec3*
>(&f));
365 return _mm_and_ps(
reinterpret_cast<const Vec3V&
>(f), V4LoadA(internalUnitSSE2Simd::gMaskXYZ));
367 return _mm_and_ps((Vec3V&)f, (VecI32V&)internalUnitSSE2Simd::gMaskXYZ);
373 return _mm_set_ps(0.0f, f.z, f.y, f.x);
378 ASSERT_ISALIGNED16(
const_cast<PxVec3*
>(&f));
379 return _mm_set_ps(0.0f, f.z, f.y, f.x);
384 ASSERT_ISALIGNED16(
const_cast<PxF32*
>(f));
386 return _mm_and_ps(V4LoadA(f), V4LoadA(internalUnitSSE2Simd::gMaskXYZ));
388 return _mm_and_ps((Vec3V&)*f, (VecI32V&)internalUnitSSE2Simd::gMaskXYZ);
394 return _mm_set_ps(0.0f, i[2], i[1], i[0]);
409 ASSERT_ISVALIDVEC3V(f);
415 return _mm_set_ps(0.0f, f.z, f.y, f.x);
425 ASSERT_ISVALIDFLOATV(f);
426 return Vec3V_From_Vec4V(Vec4V_From_FloatV(f));
431 ASSERT_ISVALIDVEC3V(f);
432 return Vec3V_From_Vec4V_WUndefined(Vec4V_From_FloatV(f));
437 return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2));
442 V3StoreU(m.col0, out.column0);
443 V3StoreU(m.col1, out.column1);
444 V3StoreU(m.col2, out.column2);
449 ASSERT_ISALIGNED16(
const_cast<PxF32*
>(f));
450 return _mm_load_ps(f);
455 ASSERT_ISALIGNED16(f);
466 ASSERT_ISALIGNED16(f);
467 _mm_store_ps(
reinterpret_cast<PxF32*
>(f), a);
472 ASSERT_ISALIGNED16(u);
473 _mm_store_ps(
reinterpret_cast<float*
>(u), uv);
476PX_FORCE_INLINE VecI32V I4LoadXYZW(
const PxI32& x,
const PxI32& y,
const PxI32& z,
const PxI32& w)
478 return _mm_set_epi32(w, z, y, x);
483 ASSERT_ISALIGNED16(i);
484 _mm_store_ps(
reinterpret_cast<float*
>(i), m128_I2F(iv));
489 return _mm_loadu_ps(f);
494 const PX_ALIGN(16, PxI32) b[4] = { -PxI32(f[0]), -PxI32(f[1]), -PxI32(f[2]), -PxI32(f[3]) };
495 return _mm_load_ps(
reinterpret_cast<const float*
>(&b));
500 ASSERT_ISVALIDFLOATV(a);
506 ASSERT_ISALIGNED16(&f);
509 f = PxVec3(f2[0], f2[1], f2[2]);
516 f = PxVec3(f2[0], f2[1], f2[2]);
521 _mm_store_ss(
reinterpret_cast<PxF32*
>(b2), b);
526 return _mm_load1_ps(
reinterpret_cast<const PxF32*
>(&i));
531 return _mm_loadu_ps(
reinterpret_cast<const PxF32*
>(i));
536 ASSERT_ISALIGNED16(
const_cast<PxU32*
>(i));
537 return _mm_load_ps(
reinterpret_cast<const PxF32*
>(i));
561 return FLoad(PX_EPS_REAL);
571 return FLoad(PX_MAX_REAL);
576 return FLoad(-PX_MAX_REAL);
581 const PxU32
zero = 0;
582 return _mm_load1_ps(
reinterpret_cast<const PxF32*
>(&zero));
588 return _mm_load1_ps(
reinterpret_cast<const PxF32*
>(&one));
594 return _mm_load1_ps(
reinterpret_cast<const PxF32*
>(&two));
599 const PxU32 three = 3;
600 return _mm_load1_ps(
reinterpret_cast<const PxF32*
>(&three));
606 return _mm_load1_ps(
reinterpret_cast<const PxF32*
>(&four));
611 ASSERT_ISVALIDFLOATV(f);
612 return _mm_sub_ps(_mm_setzero_ps(), f);
617 ASSERT_ISVALIDFLOATV(a);
618 ASSERT_ISVALIDFLOATV(b);
629 return _mm_add_ps(a, b);
634 ASSERT_ISVALIDFLOATV(a);
635 ASSERT_ISVALIDFLOATV(b);
636 return _mm_sub_ps(a, b);
641 ASSERT_ISVALIDFLOATV(a);
642 ASSERT_ISVALIDFLOATV(b);
643 return _mm_mul_ps(a, b);
648 ASSERT_ISVALIDFLOATV(a);
649 ASSERT_ISVALIDFLOATV(b);
650 return _mm_div_ps(a, b);
655 ASSERT_ISVALIDFLOATV(a);
656 ASSERT_ISVALIDFLOATV(b);
657 return _mm_mul_ps(a, _mm_rcp_ps(b));
662 ASSERT_ISVALIDFLOATV(a);
663 return _mm_div_ps(FOne(), a);
668 ASSERT_ISVALIDFLOATV(a);
669 return _mm_rcp_ps(a);
674 ASSERT_ISVALIDFLOATV(a);
675 return _mm_div_ps(FOne(), _mm_sqrt_ps(a));
680 ASSERT_ISVALIDFLOATV(a);
681 return _mm_sqrt_ps(a);
686 ASSERT_ISVALIDFLOATV(a);
687 return _mm_rsqrt_ps(a);
690PX_FORCE_INLINE FloatV FScaleAdd(
const FloatV a,
const FloatV b,
const FloatV c)
692 ASSERT_ISVALIDFLOATV(a);
693 ASSERT_ISVALIDFLOATV(b);
694 ASSERT_ISVALIDFLOATV(c);
695 return FAdd(FMul(a, b), c);
698PX_FORCE_INLINE FloatV FNegScaleSub(
const FloatV a,
const FloatV b,
const FloatV c)
700 ASSERT_ISVALIDFLOATV(a);
701 ASSERT_ISVALIDFLOATV(b);
702 ASSERT_ISVALIDFLOATV(c);
703 return FSub(c, FMul(a, b));
708 ASSERT_ISVALIDFLOATV(a);
709 PX_ALIGN(16,
const PxU32) absMask[4] = { 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF };
710 return _mm_and_ps(a, _mm_load_ps(
reinterpret_cast<const PxF32*
>(absMask)));
713PX_FORCE_INLINE FloatV FSel(
const BoolV c,
const FloatV a,
const FloatV b)
715 PX_ASSERT(vecMathTests::allElementsEqualBoolV(c,BTTTT()) ||
716 vecMathTests::allElementsEqualBoolV(c,BFFFF()));
717 ASSERT_ISVALIDFLOATV(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)));
718 return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
723 ASSERT_ISVALIDFLOATV(a);
724 ASSERT_ISVALIDFLOATV(b);
725 return _mm_cmpgt_ps(a, b);
730 ASSERT_ISVALIDFLOATV(a);
731 ASSERT_ISVALIDFLOATV(b);
732 return _mm_cmpge_ps(a, b);
737 ASSERT_ISVALIDFLOATV(a);
738 ASSERT_ISVALIDFLOATV(b);
739 return _mm_cmpeq_ps(a, b);
744 ASSERT_ISVALIDFLOATV(a);
745 ASSERT_ISVALIDFLOATV(b);
746 return _mm_max_ps(a, b);
751 ASSERT_ISVALIDFLOATV(a);
752 ASSERT_ISVALIDFLOATV(b);
753 return _mm_min_ps(a, b);
756PX_FORCE_INLINE FloatV FClamp(
const FloatV a,
const FloatV minV,
const FloatV maxV)
758 ASSERT_ISVALIDFLOATV(minV);
759 ASSERT_ISVALIDFLOATV(maxV);
760 return _mm_max_ps(_mm_min_ps(a, maxV), minV);
765 ASSERT_ISVALIDFLOATV(a);
766 ASSERT_ISVALIDFLOATV(b);
767 return PxU32(_mm_comigt_ss(a, b));
772 ASSERT_ISVALIDFLOATV(a);
773 ASSERT_ISVALIDFLOATV(b);
774 return PxU32(_mm_comige_ss(a, b));
779 ASSERT_ISVALIDFLOATV(a);
780 ASSERT_ISVALIDFLOATV(b);
781 return PxU32(_mm_comieq_ss(a, b));
786 ASSERT_ISVALIDFLOATV(a);
788 return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
791 const FloatV half = FLoad(0.5f);
792 const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31));
793 const FloatV aRound = FSub(FAdd(a, half), signBit);
794 __m128i tmp = _mm_cvttps_epi32(aRound);
795 return _mm_cvtepi32_ps(tmp);
801 ASSERT_ISVALIDFLOATV(a);
804 const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
805 const FloatV twoPi = V4LoadA(g_PXTwoPi.f);
806 const FloatV tmp = FMul(a, recipTwoPi);
807 const FloatV b = FRound(tmp);
808 const FloatV V1 = FNegScaleSub(twoPi, b, a);
812 const FloatV V2 = FMul(V1, V1);
813 const FloatV V3 = FMul(V2, V1);
814 const FloatV V5 = FMul(V3, V2);
815 const FloatV V7 = FMul(V5, V2);
816 const FloatV V9 = FMul(V7, V2);
817 const FloatV V11 = FMul(V9, V2);
818 const FloatV V13 = FMul(V11, V2);
819 const FloatV V15 = FMul(V13, V2);
820 const FloatV V17 = FMul(V15, V2);
821 const FloatV V19 = FMul(V17, V2);
822 const FloatV V21 = FMul(V19, V2);
823 const FloatV V23 = FMul(V21, V2);
825 const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f);
826 const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f);
827 const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f);
829 const FloatV S1 = V4GetY(sinCoefficients0);
830 const FloatV S2 = V4GetZ(sinCoefficients0);
831 const FloatV S3 = V4GetW(sinCoefficients0);
832 const FloatV S4 = V4GetX(sinCoefficients1);
833 const FloatV S5 = V4GetY(sinCoefficients1);
834 const FloatV S6 = V4GetZ(sinCoefficients1);
835 const FloatV S7 = V4GetW(sinCoefficients1);
836 const FloatV S8 = V4GetX(sinCoefficients2);
837 const FloatV S9 = V4GetY(sinCoefficients2);
838 const FloatV S10 = V4GetZ(sinCoefficients2);
839 const FloatV S11 = V4GetW(sinCoefficients2);
842 Result = FScaleAdd(S1, V3, V1);
843 Result = FScaleAdd(S2, V5, Result);
844 Result = FScaleAdd(S3, V7, Result);
845 Result = FScaleAdd(S4, V9, Result);
846 Result = FScaleAdd(S5, V11, Result);
847 Result = FScaleAdd(S6, V13, Result);
848 Result = FScaleAdd(S7, V15, Result);
849 Result = FScaleAdd(S8, V17, Result);
850 Result = FScaleAdd(S9, V19, Result);
851 Result = FScaleAdd(S10, V21, Result);
852 Result = FScaleAdd(S11, V23, Result);
859 ASSERT_ISVALIDFLOATV(a);
862 const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
863 const FloatV twoPi = V4LoadA(g_PXTwoPi.f);
864 const FloatV tmp = FMul(a, recipTwoPi);
865 const FloatV b = FRound(tmp);
866 const FloatV V1 = FNegScaleSub(twoPi, b, a);
870 const FloatV V2 = FMul(V1, V1);
871 const FloatV V4 = FMul(V2, V2);
872 const FloatV V6 = FMul(V4, V2);
873 const FloatV V8 = FMul(V4, V4);
874 const FloatV V10 = FMul(V6, V4);
875 const FloatV V12 = FMul(V6, V6);
876 const FloatV V14 = FMul(V8, V6);
877 const FloatV V16 = FMul(V8, V8);
878 const FloatV V18 = FMul(V10, V8);
879 const FloatV V20 = FMul(V10, V10);
880 const FloatV V22 = FMul(V12, V10);
882 const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f);
883 const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f);
884 const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f);
886 const FloatV C1 = V4GetY(cosCoefficients0);
887 const FloatV C2 = V4GetZ(cosCoefficients0);
888 const FloatV C3 = V4GetW(cosCoefficients0);
889 const FloatV C4 = V4GetX(cosCoefficients1);
890 const FloatV C5 = V4GetY(cosCoefficients1);
891 const FloatV C6 = V4GetZ(cosCoefficients1);
892 const FloatV C7 = V4GetW(cosCoefficients1);
893 const FloatV C8 = V4GetX(cosCoefficients2);
894 const FloatV C9 = V4GetY(cosCoefficients2);
895 const FloatV C10 = V4GetZ(cosCoefficients2);
896 const FloatV C11 = V4GetW(cosCoefficients2);
899 Result = FScaleAdd(C1, V2, V4One());
900 Result = FScaleAdd(C2, V4, Result);
901 Result = FScaleAdd(C3, V6, Result);
902 Result = FScaleAdd(C4, V8, Result);
903 Result = FScaleAdd(C5, V10, Result);
904 Result = FScaleAdd(C6, V12, Result);
905 Result = FScaleAdd(C7, V14, Result);
906 Result = FScaleAdd(C8, V16, Result);
907 Result = FScaleAdd(C9, V18, Result);
908 Result = FScaleAdd(C10, V20, Result);
909 Result = FScaleAdd(C11, V22, Result);
914PX_FORCE_INLINE PxU32 FOutOfBounds(
const FloatV a,
const FloatV min,
const FloatV max)
916 ASSERT_ISVALIDFLOATV(a);
917 ASSERT_ISVALIDFLOATV(min);
918 ASSERT_ISVALIDFLOATV(max);
919 const BoolV c = BOr(FIsGrtr(a, max), FIsGrtr(min, a));
920 return !BAllEqFFFF(c);
923PX_FORCE_INLINE PxU32 FInBounds(
const FloatV a,
const FloatV min,
const FloatV max)
925 ASSERT_ISVALIDFLOATV(a);
926 ASSERT_ISVALIDFLOATV(min);
927 ASSERT_ISVALIDFLOATV(max)
928 const BoolV c = BAnd(FIsGrtrOrEq(a, min), FIsGrtrOrEq(max, a));
929 return BAllEqTTTT(c);
934 ASSERT_ISVALIDFLOATV(a);
935 ASSERT_ISVALIDFLOATV(bounds);
936 return FOutOfBounds(a, FNeg(bounds), bounds);
941 ASSERT_ISVALIDFLOATV(a);
942 ASSERT_ISVALIDFLOATV(bounds);
943 return FInBounds(a, FNeg(bounds), bounds);
952 ASSERT_ISVALIDFLOATV(f);
953 const __m128
zero = FZero();
954 const __m128 fff0 = _mm_move_ss(f, zero);
955 return _mm_shuffle_ps(fff0, fff0, _MM_SHUFFLE(0, 1, 2, 3));
958PX_FORCE_INLINE Vec3V V3Merge(
const FloatVArg x,
const FloatVArg y,
const FloatVArg z)
960 ASSERT_ISVALIDFLOATV(x);
961 ASSERT_ISVALIDFLOATV(y);
962 ASSERT_ISVALIDFLOATV(z);
964 const __m128
zero = FZero();
965 const __m128 xy = _mm_move_ss(x, y);
966 const __m128 z0 = _mm_move_ss(zero, z);
968 return _mm_shuffle_ps(xy, z0, _MM_SHUFFLE(1, 0, 0, 1));
973 const PX_ALIGN(16, PxF32) x[4] = { 1.0f, 0.0f, 0.0f, 0.0f };
974 const __m128 x128 = _mm_load_ps(x);
980 const PX_ALIGN(16, PxF32) y[4] = { 0.0f, 1.0f, 0.0f, 0.0f };
981 const __m128 y128 = _mm_load_ps(y);
987 const PX_ALIGN(16, PxF32) z[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
988 const __m128 z128 = _mm_load_ps(z);
994 ASSERT_ISVALIDVEC3V(f);
995 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
1000 ASSERT_ISVALIDVEC3V(f)
1001 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
1006 ASSERT_ISVALIDVEC3V(f);
1007 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
1012 ASSERT_ISVALIDVEC3V(v);
1013 ASSERT_ISVALIDFLOATV(f);
1014 return V4Sel(BFTTT(), v, f);
1019 ASSERT_ISVALIDVEC3V(v);
1020 ASSERT_ISVALIDFLOATV(f);
1021 return V4Sel(BTFTT(), v, f);
1026 ASSERT_ISVALIDVEC3V(v);
1027 ASSERT_ISVALIDFLOATV(f);
1028 return V4Sel(BTTFT(), v, f);
1031PX_FORCE_INLINE Vec3V V3ColX(
const Vec3V a,
const Vec3V b,
const Vec3V c)
1033 ASSERT_ISVALIDVEC3V(a);
1034 ASSERT_ISVALIDVEC3V(b);
1035 ASSERT_ISVALIDVEC3V(c);
1036 Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 0, 3, 0));
1037 return V3SetY(r, V3GetX(b));
1040PX_FORCE_INLINE Vec3V V3ColY(
const Vec3V a,
const Vec3V b,
const Vec3V c)
1042 ASSERT_ISVALIDVEC3V(a);
1043 ASSERT_ISVALIDVEC3V(b);
1044 ASSERT_ISVALIDVEC3V(c)
1045 Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 1, 3, 1));
1046 return V3SetY(r, V3GetY(b));
1049PX_FORCE_INLINE Vec3V V3ColZ(
const Vec3V a,
const Vec3V b,
const Vec3V c)
1051 ASSERT_ISVALIDVEC3V(a);
1052 ASSERT_ISVALIDVEC3V(b);
1053 ASSERT_ISVALIDVEC3V(c);
1054 Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 2, 3, 2));
1055 return V3SetY(r, V3GetZ(b));
1060 return V3Load(0.0f);
1065 return V3Load(PX_EPS_REAL);
1069 return V3Load(1.0f);
1074 ASSERT_ISVALIDVEC3V(f);
1075 return _mm_sub_ps(_mm_setzero_ps(), f);
1080 ASSERT_ISVALIDVEC3V(a);
1081 ASSERT_ISVALIDVEC3V(b);
1082 return _mm_add_ps(a, b);
1087 ASSERT_ISVALIDVEC3V(a);
1088 ASSERT_ISVALIDVEC3V(b);
1089 return _mm_sub_ps(a, b);
1094 ASSERT_ISVALIDVEC3V(a);
1095 ASSERT_ISVALIDFLOATV(b);
1096 return _mm_mul_ps(a, b);
1101 ASSERT_ISVALIDVEC3V(a);
1102 ASSERT_ISVALIDVEC3V(b);
1103 return _mm_mul_ps(a, b);
1108 ASSERT_ISVALIDVEC3V(a);
1109 ASSERT_ISVALIDFLOATV(b);
1110 return _mm_div_ps(a, b);
1115 ASSERT_ISVALIDVEC3V(a);
1116 ASSERT_ISVALIDVEC3V(b);
1117 return V4ClearW(_mm_div_ps(a, b));
1122 ASSERT_ISVALIDVEC3V(a);
1123 ASSERT_ISVALIDFLOATV(b);
1124 return _mm_mul_ps(a, _mm_rcp_ps(b));
1129 ASSERT_ISVALIDVEC3V(a);
1130 ASSERT_ISVALIDVEC3V(b);
1131 return V4ClearW(_mm_mul_ps(a, _mm_rcp_ps(b)));
1136 ASSERT_ISVALIDVEC3V(a);
1137 const __m128
zero = V3Zero();
1138 const __m128 tttf = BTTTF();
1139 const __m128 recipA = _mm_div_ps(V3One(), a);
1140 return V4Sel(tttf, recipA, zero);
1145 ASSERT_ISVALIDVEC3V(a);
1146 const __m128
zero = V3Zero();
1147 const __m128 tttf = BTTTF();
1148 const __m128 recipA = _mm_rcp_ps(a);
1149 return V4Sel(tttf, recipA, zero);
1154 ASSERT_ISVALIDVEC3V(a);
1155 const __m128
zero = V3Zero();
1156 const __m128 tttf = BTTTF();
1157 const __m128 recipA = _mm_div_ps(V3One(), _mm_sqrt_ps(a));
1158 return V4Sel(tttf, recipA, zero);
1163 ASSERT_ISVALIDVEC3V(a);
1164 const __m128
zero = V3Zero();
1165 const __m128 tttf = BTTTF();
1166 const __m128 recipA = _mm_rsqrt_ps(a);
1167 return V4Sel(tttf, recipA, zero);
1170PX_FORCE_INLINE Vec3V V3ScaleAdd(
const Vec3V a,
const FloatV b,
const Vec3V c)
1172 ASSERT_ISVALIDVEC3V(a);
1173 ASSERT_ISVALIDFLOATV(b);
1174 ASSERT_ISVALIDVEC3V(c);
1175 return V3Add(V3Scale(a, b), c);
1178PX_FORCE_INLINE Vec3V V3NegScaleSub(
const Vec3V a,
const FloatV b,
const Vec3V c)
1180 ASSERT_ISVALIDVEC3V(a);
1181 ASSERT_ISVALIDFLOATV(b);
1182 ASSERT_ISVALIDVEC3V(c);
1183 return V3Sub(c, V3Scale(a, b));
1186PX_FORCE_INLINE Vec3V V3MulAdd(
const Vec3V a,
const Vec3V b,
const Vec3V c)
1188 ASSERT_ISVALIDVEC3V(a);
1189 ASSERT_ISVALIDVEC3V(b);
1190 ASSERT_ISVALIDVEC3V(c);
1191 return V3Add(V3Mul(a, b), c);
1194PX_FORCE_INLINE Vec3V V3NegMulSub(
const Vec3V a,
const Vec3V b,
const Vec3V c)
1196 ASSERT_ISVALIDVEC3V(a);
1197 ASSERT_ISVALIDVEC3V(b);
1198 ASSERT_ISVALIDVEC3V(c);
1199 return V3Sub(c, V3Mul(a, b));
1204 ASSERT_ISVALIDVEC3V(a);
1205 return V3Max(a, V3Neg(a));
1210 ASSERT_ISVALIDVEC3V(a);
1211 ASSERT_ISVALIDVEC3V(b);
1213 return _mm_dp_ps(a, b, 0x7f);
1215 const __m128 t0 = _mm_mul_ps(a, b);
1216 const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1,0,3,2));
1217 const __m128 t2 = _mm_add_ps(t0, t1);
1218 const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2,3,0,1));
1219 return _mm_add_ps(t3, t2);
1228 ASSERT_ISVALIDVEC3V(a);
1229 ASSERT_ISVALIDVEC3V(b);
1230 const __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
1231 const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1));
1232 const __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1233 const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2));
1234 return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2));
1239 ASSERT_ISVALIDVEC3V(a);
1241 v.mR1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
1242 v.mL1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1248 ASSERT_ISVALIDVEC3V(b);
1249 const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1));
1250 const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2));
1251 return _mm_sub_ps(_mm_mul_ps(a.mL1, l2), _mm_mul_ps(a.mR1, r2));
1256 ASSERT_ISVALIDVEC3V(a);
1257 const __m128 r2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1258 const __m128 l2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
1259 return _mm_sub_ps(_mm_mul_ps(b.mR1, r2), _mm_mul_ps(b.mL1, l2));
1264 return _mm_sub_ps(_mm_mul_ps(a.mL1, b.mR1), _mm_mul_ps(a.mR1, b.mL1));
1269 ASSERT_ISVALIDVEC3V(a);
1270 return _mm_sqrt_ps(V3Dot(a, a));
1275 ASSERT_ISVALIDVEC3V(a);
1281 ASSERT_ISVALIDVEC3V(a);
1282 ASSERT_ISFINITELENGTH(a);
1283 return V3ScaleInv(a, _mm_sqrt_ps(V3Dot(a, a)));
1288 ASSERT_ISVALIDVEC3V(a);
1289 ASSERT_ISFINITELENGTH(a);
1290 return V3Scale(a, _mm_rsqrt_ps(V3Dot(a, a)));
1293PX_FORCE_INLINE Vec3V V3NormalizeSafe(
const Vec3V a,
const Vec3V unsafeReturnValue)
1295 ASSERT_ISVALIDVEC3V(a);
1296 const __m128 eps = V4Eps();
1297 const __m128 length = V3Length(a);
1298 const __m128 isGreaterThanZero = FIsGrtr(length, eps);
1299 return V3Sel(isGreaterThanZero, V3ScaleInv(a, length), unsafeReturnValue);
1302PX_FORCE_INLINE Vec3V V3Sel(
const BoolV c,
const Vec3V a,
const Vec3V b)
1304 ASSERT_ISVALIDVEC3V(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)));
1305 return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
1310 ASSERT_ISVALIDVEC3V(a);
1311 ASSERT_ISVALIDVEC3V(b);
1312 return _mm_cmpgt_ps(a, b);
1317 ASSERT_ISVALIDVEC3V(a);
1318 ASSERT_ISVALIDVEC3V(b);
1319 return _mm_cmpge_ps(a, b);
1324 ASSERT_ISVALIDVEC3V(a);
1325 ASSERT_ISVALIDVEC3V(b);
1326 return _mm_cmpeq_ps(a, b);
1331 ASSERT_ISVALIDVEC3V(a);
1332 ASSERT_ISVALIDVEC3V(b);
1333 return _mm_max_ps(a, b);
1338 ASSERT_ISVALIDVEC3V(a);
1339 ASSERT_ISVALIDVEC3V(b);
1340 return _mm_min_ps(a, b);
1345 ASSERT_ISVALIDVEC3V(a);
1346 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
1347 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
1348 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
1350 return _mm_max_ps(_mm_max_ps(shuf1, shuf2), shuf3);
1355 ASSERT_ISVALIDVEC3V(a);
1357 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
1358 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
1359 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
1361 return _mm_min_ps(_mm_min_ps(shuf1, shuf2), shuf3);
1367 ASSERT_ISVALIDVEC3V(a);
1368 const __m128
zero = V3Zero();
1369 const __m128 one = V3One();
1370 const __m128 none = V3Neg(one);
1371 return V3Sel(V3IsGrtrOrEq(a, zero), one, none);
1374PX_FORCE_INLINE Vec3V V3Clamp(
const Vec3V a,
const Vec3V minV,
const Vec3V maxV)
1376 ASSERT_ISVALIDVEC3V(maxV);
1377 ASSERT_ISVALIDVEC3V(minV);
1378 return V3Max(V3Min(a, maxV), minV);
1383 ASSERT_ISVALIDVEC3V(a);
1384 ASSERT_ISVALIDVEC3V(b);
1385 return internalUnitSSE2Simd::BAllTrue3_R(V4IsGrtr(a, b));
1390 ASSERT_ISVALIDVEC3V(a);
1391 ASSERT_ISVALIDVEC3V(b);
1392 return internalUnitSSE2Simd::BAllTrue3_R(V4IsGrtrOrEq(a, b));
1397 ASSERT_ISVALIDVEC3V(a);
1398 ASSERT_ISVALIDVEC3V(b);
1399 return internalUnitSSE2Simd::BAllTrue3_R(V4IsEq(a, b));
1404 ASSERT_ISVALIDVEC3V(a);
1406 return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
1409 const Vec3V half = V3Load(0.5f);
1410 const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31));
1411 const Vec3V aRound = V3Sub(V3Add(a, half), signBit);
1412 __m128i tmp = _mm_cvttps_epi32(aRound);
1413 return _mm_cvtepi32_ps(tmp);
1419 ASSERT_ISVALIDVEC3V(a);
1421 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
1422 const Vec4V twoPi = V4LoadA(g_PXTwoPi.f);
1423 const Vec3V tmp = V3Scale(a, recipTwoPi);
1424 const Vec3V b = V3Round(tmp);
1425 const Vec3V V1 = V3NegScaleSub(b, twoPi, a);
1429 const Vec3V V2 = V3Mul(V1, V1);
1430 const Vec3V V3 = V3Mul(V2, V1);
1431 const Vec3V V5 = V3Mul(V3, V2);
1432 const Vec3V V7 = V3Mul(V5, V2);
1433 const Vec3V V9 = V3Mul(V7, V2);
1434 const Vec3V V11 = V3Mul(V9, V2);
1435 const Vec3V V13 = V3Mul(V11, V2);
1436 const Vec3V V15 = V3Mul(V13, V2);
1437 const Vec3V V17 = V3Mul(V15, V2);
1438 const Vec3V V19 = V3Mul(V17, V2);
1439 const Vec3V V21 = V3Mul(V19, V2);
1440 const Vec3V V23 = V3Mul(V21, V2);
1442 const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f);
1443 const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f);
1444 const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f);
1446 const FloatV S1 = V4GetY(sinCoefficients0);
1447 const FloatV S2 = V4GetZ(sinCoefficients0);
1448 const FloatV S3 = V4GetW(sinCoefficients0);
1449 const FloatV S4 = V4GetX(sinCoefficients1);
1450 const FloatV S5 = V4GetY(sinCoefficients1);
1451 const FloatV S6 = V4GetZ(sinCoefficients1);
1452 const FloatV S7 = V4GetW(sinCoefficients1);
1453 const FloatV S8 = V4GetX(sinCoefficients2);
1454 const FloatV S9 = V4GetY(sinCoefficients2);
1455 const FloatV S10 = V4GetZ(sinCoefficients2);
1456 const FloatV S11 = V4GetW(sinCoefficients2);
1459 Result = V3ScaleAdd(V3, S1, V1);
1460 Result = V3ScaleAdd(V5, S2, Result);
1461 Result = V3ScaleAdd(V7, S3, Result);
1462 Result = V3ScaleAdd(V9, S4, Result);
1463 Result = V3ScaleAdd(V11, S5, Result);
1464 Result = V3ScaleAdd(V13, S6, Result);
1465 Result = V3ScaleAdd(V15, S7, Result);
1466 Result = V3ScaleAdd(V17, S8, Result);
1467 Result = V3ScaleAdd(V19, S9, Result);
1468 Result = V3ScaleAdd(V21, S10, Result);
1469 Result = V3ScaleAdd(V23, S11, Result);
1471 ASSERT_ISVALIDVEC3V(Result);
1477 ASSERT_ISVALIDVEC3V(a);
1480 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
1481 const Vec4V twoPi = V4LoadA(g_PXTwoPi.f);
1482 const Vec3V tmp = V3Scale(a, recipTwoPi);
1483 const Vec3V b = V3Round(tmp);
1484 const Vec3V V1 = V3NegScaleSub(b, twoPi, a);
1488 const Vec3V V2 = V3Mul(V1, V1);
1489 const Vec3V V4 = V3Mul(V2, V2);
1490 const Vec3V V6 = V3Mul(V4, V2);
1491 const Vec3V V8 = V3Mul(V4, V4);
1492 const Vec3V V10 = V3Mul(V6, V4);
1493 const Vec3V V12 = V3Mul(V6, V6);
1494 const Vec3V V14 = V3Mul(V8, V6);
1495 const Vec3V V16 = V3Mul(V8, V8);
1496 const Vec3V V18 = V3Mul(V10, V8);
1497 const Vec3V V20 = V3Mul(V10, V10);
1498 const Vec3V V22 = V3Mul(V12, V10);
1500 const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f);
1501 const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f);
1502 const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f);
1504 const FloatV C1 = V4GetY(cosCoefficients0);
1505 const FloatV C2 = V4GetZ(cosCoefficients0);
1506 const FloatV C3 = V4GetW(cosCoefficients0);
1507 const FloatV C4 = V4GetX(cosCoefficients1);
1508 const FloatV C5 = V4GetY(cosCoefficients1);
1509 const FloatV C6 = V4GetZ(cosCoefficients1);
1510 const FloatV C7 = V4GetW(cosCoefficients1);
1511 const FloatV C8 = V4GetX(cosCoefficients2);
1512 const FloatV C9 = V4GetY(cosCoefficients2);
1513 const FloatV C10 = V4GetZ(cosCoefficients2);
1514 const FloatV C11 = V4GetW(cosCoefficients2);
1517 Result = V3ScaleAdd(V2, C1, V3One());
1518 Result = V3ScaleAdd(V4, C2, Result);
1519 Result = V3ScaleAdd(V6, C3, Result);
1520 Result = V3ScaleAdd(V8, C4, Result);
1521 Result = V3ScaleAdd(V10, C5, Result);
1522 Result = V3ScaleAdd(V12, C6, Result);
1523 Result = V3ScaleAdd(V14, C7, Result);
1524 Result = V3ScaleAdd(V16, C8, Result);
1525 Result = V3ScaleAdd(V18, C9, Result);
1526 Result = V3ScaleAdd(V20, C10, Result);
1527 Result = V3ScaleAdd(V22, C11, Result);
1529 ASSERT_ISVALIDVEC3V(Result);
1535 ASSERT_ISVALIDVEC3V(a);
1536 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 2, 1));
1541 ASSERT_ISVALIDVEC3V(a);
1542 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 1, 0));
1547 ASSERT_ISVALIDVEC3V(a);
1548 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1553 ASSERT_ISVALIDVEC3V(a);
1554 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
1559 ASSERT_ISVALIDVEC3V(a);
1560 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 2, 2));
1565 ASSERT_ISVALIDVEC3V(a);
1566 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 0, 1));
1569PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(
const Vec3V v0,
const Vec3V v1)
1571 ASSERT_ISVALIDVEC3V(v0);
1572 ASSERT_ISVALIDVEC3V(v1);
1573 return _mm_shuffle_ps(v1, v0, _MM_SHUFFLE(3, 1, 2, 3));
1576PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(
const Vec3V v0,
const Vec3V v1)
1578 ASSERT_ISVALIDVEC3V(v0);
1579 ASSERT_ISVALIDVEC3V(v1);
1580 return _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(3, 0, 3, 2));
1583PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(
const Vec3V v0,
const Vec3V v1)
1585 ASSERT_ISVALIDVEC3V(v0);
1586 ASSERT_ISVALIDVEC3V(v1);
1588 Vec3V v2 = V3Zero();
1589 FloatV y1 = V3GetY(v1);
1590 FloatV x0 = V3GetX(v0);
1591 v2 = V3SetX(v2, y1);
1592 return V3SetY(v2, x0);
1597 ASSERT_ISVALIDVEC3V(a);
1599 Vec3V r = _mm_hadd_ps(a, a);
1600 r = _mm_hadd_ps(r, r);
1603 __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
1604 __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
1605 __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
1606 return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3);
1610PX_FORCE_INLINE PxU32 V3OutOfBounds(
const Vec3V a,
const Vec3V min,
const Vec3V max)
1612 ASSERT_ISVALIDVEC3V(a);
1613 ASSERT_ISVALIDVEC3V(min);
1614 ASSERT_ISVALIDVEC3V(max);
1615 const BoolV c = BOr(V3IsGrtr(a, max), V3IsGrtr(min, a));
1616 return !BAllEqFFFF(c);
1619PX_FORCE_INLINE PxU32 V3InBounds(
const Vec3V a,
const Vec3V min,
const Vec3V max)
1621 ASSERT_ISVALIDVEC3V(a);
1622 ASSERT_ISVALIDVEC3V(min);
1623 ASSERT_ISVALIDVEC3V(max);
1624 const BoolV c = BAnd(V3IsGrtrOrEq(a, min), V3IsGrtrOrEq(max, a));
1625 return BAllEqTTTT(c);
1630 ASSERT_ISVALIDVEC3V(a);
1631 ASSERT_ISVALIDVEC3V(bounds);
1632 return V3OutOfBounds(a, V3Neg(bounds), bounds);
1637 ASSERT_ISVALIDVEC3V(a);
1638 ASSERT_ISVALIDVEC3V(bounds)
1639 return V3InBounds(a, V3Neg(bounds), bounds);
1642PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2)
1644 ASSERT_ISVALIDVEC3V(col0);
1645 ASSERT_ISVALIDVEC3V(col1);
1646 ASSERT_ISVALIDVEC3V(col2);
1648 const Vec3V col3 = _mm_setzero_ps();
1649 Vec3V tmp0 = _mm_unpacklo_ps(col0, col1);
1650 Vec3V tmp2 = _mm_unpacklo_ps(col2, col3);
1651 Vec3V tmp1 = _mm_unpackhi_ps(col0, col1);
1652 Vec3V tmp3 = _mm_unpackhi_ps(col2, col3);
1653 col0 = _mm_movelh_ps(tmp0, tmp2);
1654 col1 = _mm_movehl_ps(tmp2, tmp0);
1655 col2 = _mm_movelh_ps(tmp1, tmp3);
1664 ASSERT_ISVALIDFLOATV(f);
1671 ASSERT_ISVALIDFLOATV(floatVArray[0]);
1672 ASSERT_ISVALIDFLOATV(floatVArray[1]);
1673 ASSERT_ISVALIDFLOATV(floatVArray[2]);
1674 ASSERT_ISVALIDFLOATV(floatVArray[3]);
1675 const __m128 xw = _mm_move_ss(floatVArray[1], floatVArray[0]);
1676 const __m128 yz = _mm_move_ss(floatVArray[2], floatVArray[3]);
1677 return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0));
1680PX_FORCE_INLINE Vec4V V4Merge(
const FloatVArg x,
const FloatVArg y,
const FloatVArg z,
const FloatVArg w)
1682 ASSERT_ISVALIDFLOATV(x);
1683 ASSERT_ISVALIDFLOATV(y);
1684 ASSERT_ISVALIDFLOATV(z);
1685 ASSERT_ISVALIDFLOATV(w);
1686 const __m128 xw = _mm_move_ss(y, x);
1687 const __m128 yz = _mm_move_ss(z, w);
1688 return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0));
1691PX_FORCE_INLINE Vec4V V4MergeW(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1693 const Vec4V xz = _mm_unpackhi_ps(x, z);
1694 const Vec4V yw = _mm_unpackhi_ps(y, w);
1695 return _mm_unpackhi_ps(xz, yw);
1698PX_FORCE_INLINE Vec4V V4MergeZ(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1700 const Vec4V xz = _mm_unpackhi_ps(x, z);
1701 const Vec4V yw = _mm_unpackhi_ps(y, w);
1702 return _mm_unpacklo_ps(xz, yw);
1705PX_FORCE_INLINE Vec4V V4MergeY(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1707 const Vec4V xz = _mm_unpacklo_ps(x, z);
1708 const Vec4V yw = _mm_unpacklo_ps(y, w);
1709 return _mm_unpackhi_ps(xz, yw);
1712PX_FORCE_INLINE Vec4V V4MergeX(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1714 const Vec4V xz = _mm_unpacklo_ps(x, z);
1715 const Vec4V yw = _mm_unpacklo_ps(y, w);
1716 return _mm_unpacklo_ps(xz, yw);
1721 return _mm_unpacklo_ps(a, b);
1726 return _mm_unpackhi_ps(a, b);
1731 const PX_ALIGN(16, PxF32) w[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
1732 const __m128 w128 = _mm_load_ps(w);
1738 const PX_ALIGN(16, PxF32) x[4] = { 1.0f, 0.0f, 0.0f, 0.0f };
1739 const __m128 x128 = _mm_load_ps(x);
1745 const PX_ALIGN(16, PxF32) y[4] = { 0.0f, 1.0f, 0.0f, 0.0f };
1746 const __m128 y128 = _mm_load_ps(y);
1752 const PX_ALIGN(16, PxF32) z[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
1753 const __m128 z128 = _mm_load_ps(z);
1759 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
1764 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
1769 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
1774 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
1779 ASSERT_ISVALIDFLOATV(f);
1780 return V4Sel(BTTTF(), v, f);
1785 ASSERT_ISVALIDFLOATV(f);
1786 return V4Sel(BFTTT(), v, f);
1791 ASSERT_ISVALIDFLOATV(f);
1792 return V4Sel(BTFTT(), v, f);
1797 ASSERT_ISVALIDFLOATV(f);
1798 return V4Sel(BTTFT(), v, f);
1804 return _mm_and_ps(v, V4LoadA(internalUnitSSE2Simd::gMaskXYZ));
1806 return _mm_and_ps(v, (VecI32V&)internalUnitSSE2Simd::gMaskXYZ);
1812 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 0, 1));
1817 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 0, 2, 0));
1822 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 3, 1));
1827 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1832 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
1835template <PxU8 x, PxU8 y, PxU8 z, PxU8 w>
1838 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(w, z, y, x));
1843 return V4Load(0.0f);
1848 return V4Load(1.0f);
1853 return V4Load(PX_EPS_REAL);
1858 return _mm_sub_ps(_mm_setzero_ps(), f);
1863 return _mm_add_ps(a, b);
1868 return _mm_sub_ps(a, b);
1873 return _mm_mul_ps(a, b);
1878 return _mm_mul_ps(a, b);
1883 ASSERT_ISVALIDFLOATV(b);
1884 return _mm_div_ps(a, b);
1889 return _mm_div_ps(a, b);
1894 ASSERT_ISVALIDFLOATV(b);
1895 return _mm_mul_ps(a, _mm_rcp_ps(b));
1900 return _mm_mul_ps(a, _mm_rcp_ps(b));
1905 return _mm_div_ps(V4One(), a);
1910 return _mm_rcp_ps(a);
1915 return _mm_div_ps(V4One(), _mm_sqrt_ps(a));
1920 return _mm_rsqrt_ps(a);
1925 return _mm_sqrt_ps(a);
1928PX_FORCE_INLINE Vec4V V4ScaleAdd(
const Vec4V a,
const FloatV b,
const Vec4V c)
1930 ASSERT_ISVALIDFLOATV(b);
1931 return V4Add(V4Scale(a, b), c);
1934PX_FORCE_INLINE Vec4V V4NegScaleSub(
const Vec4V a,
const FloatV b,
const Vec4V c)
1936 ASSERT_ISVALIDFLOATV(b);
1937 return V4Sub(c, V4Scale(a, b));
1940PX_FORCE_INLINE Vec4V V4MulAdd(
const Vec4V a,
const Vec4V b,
const Vec4V c)
1942 return V4Add(V4Mul(a, b), c);
1945PX_FORCE_INLINE Vec4V V4NegMulSub(
const Vec4V a,
const Vec4V b,
const Vec4V c)
1947 return V4Sub(c, V4Mul(a, b));
1952 return V4Max(a, V4Neg(a));
1958 Vec4V r = _mm_hadd_ps(a, a);
1959 r = _mm_hadd_ps(r, r);
1962 const Vec4V xy = V4UnpackXY(a, a);
1963 const Vec4V zw = V4UnpackZW(a, a);
1964 const Vec4V xz_yw = V4Add(xy, zw);
1965 const FloatV xz = V4GetX(xz_yw);
1966 const FloatV yw = V4GetZ(xz_yw);
1967 return FAdd(xz, yw);
1974 return _mm_dp_ps(a, b, 0xff);
1983 const __m128 t0 = _mm_mul_ps(a, b);
1985 const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 0, 3, 2));
1987 const __m128 t2 = _mm_add_ps(t0, t1);
1989 const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2, 3, 0, 1));
1991 return _mm_add_ps(t3, t2);
1998 return _mm_dp_ps(a, b, 0x7f);
2000 const __m128 dot1 = _mm_mul_ps(a, b);
2001 const __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 0, 0, 0));
2002 const __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 1, 1, 1));
2003 const __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 2, 2, 2));
2004 return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3);
2010 const __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
2011 const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1));
2012 const __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
2013 const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2));
2014 return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2));
2019 return _mm_sqrt_ps(V4Dot(a, a));
2029 ASSERT_ISFINITELENGTH(a);
2030 return V4ScaleInv(a, _mm_sqrt_ps(V4Dot(a, a)));
2035 ASSERT_ISFINITELENGTH(a);
2036 return V4ScaleInvFast(a, _mm_sqrt_ps(V4Dot(a, a)));
2039PX_FORCE_INLINE Vec4V V4NormalizeSafe(
const Vec4V a,
const Vec3V unsafeReturnValue)
2041 const __m128 eps = V3Eps();
2042 const __m128 length = V4Length(a);
2043 const __m128 isGreaterThanZero = V4IsGrtr(length, eps);
2044 return V4Sel(isGreaterThanZero, V4ScaleInv(a, length), unsafeReturnValue);
2049 return m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b)));
2052PX_FORCE_INLINE Vec4V V4Sel(
const BoolV c,
const Vec4V a,
const Vec4V b)
2054 return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
2059 return _mm_cmpgt_ps(a, b);
2064 return _mm_cmpge_ps(a, b);
2069 return _mm_cmpeq_ps(a, b);
2074 return _mm_max_ps(a, b);
2079 return _mm_min_ps(a, b);
2084 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3));
2085 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
2086 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1));
2088 return _mm_max_ps(_mm_max_ps(a, shuf1), _mm_max_ps(shuf2, shuf3));
2093 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3));
2094 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
2095 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1));
2097 return _mm_min_ps(_mm_min_ps(a, shuf1), _mm_min_ps(shuf2, shuf3));
2100PX_FORCE_INLINE Vec4V V4Clamp(
const Vec4V a,
const Vec4V minV,
const Vec4V maxV)
2102 return V4Max(V4Min(a, maxV), minV);
2107 return internalUnitSSE2Simd::BAllTrue4_R(V4IsGrtr(a, b));
2112 return internalUnitSSE2Simd::BAllTrue4_R(V4IsGrtrOrEq(a, b));
2117 return internalUnitSSE2Simd::BAllTrue3_R(V4IsGrtrOrEq(a, b));
2122 return internalUnitSSE2Simd::BAllTrue4_R(V4IsEq(a, b));
2127 return internalUnitSSE2Simd::BAnyTrue3_R(V4IsGrtr(a, b));
2133 return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
2136 const Vec4V half = V4Load(0.5f);
2137 const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31));
2138 const Vec4V aRound = V4Sub(V4Add(a, half), signBit);
2139 __m128i tmp = _mm_cvttps_epi32(aRound);
2140 return _mm_cvtepi32_ps(tmp);
2146 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
2147 const Vec4V twoPi = V4LoadA(g_PXTwoPi.f);
2148 const Vec4V tmp = V4Mul(a, recipTwoPi);
2149 const Vec4V b = V4Round(tmp);
2150 const Vec4V V1 = V4NegMulSub(twoPi, b, a);
2154 const Vec4V V2 = V4Mul(V1, V1);
2155 const Vec4V V3 = V4Mul(V2, V1);
2156 const Vec4V V5 = V4Mul(V3, V2);
2157 const Vec4V V7 = V4Mul(V5, V2);
2158 const Vec4V V9 = V4Mul(V7, V2);
2159 const Vec4V V11 = V4Mul(V9, V2);
2160 const Vec4V V13 = V4Mul(V11, V2);
2161 const Vec4V V15 = V4Mul(V13, V2);
2162 const Vec4V V17 = V4Mul(V15, V2);
2163 const Vec4V V19 = V4Mul(V17, V2);
2164 const Vec4V V21 = V4Mul(V19, V2);
2165 const Vec4V V23 = V4Mul(V21, V2);
2167 const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f);
2168 const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f);
2169 const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f);
2171 const FloatV S1 = V4GetY(sinCoefficients0);
2172 const FloatV S2 = V4GetZ(sinCoefficients0);
2173 const FloatV S3 = V4GetW(sinCoefficients0);
2174 const FloatV S4 = V4GetX(sinCoefficients1);
2175 const FloatV S5 = V4GetY(sinCoefficients1);
2176 const FloatV S6 = V4GetZ(sinCoefficients1);
2177 const FloatV S7 = V4GetW(sinCoefficients1);
2178 const FloatV S8 = V4GetX(sinCoefficients2);
2179 const FloatV S9 = V4GetY(sinCoefficients2);
2180 const FloatV S10 = V4GetZ(sinCoefficients2);
2181 const FloatV S11 = V4GetW(sinCoefficients2);
2184 Result = V4MulAdd(S1, V3, V1);
2185 Result = V4MulAdd(S2, V5, Result);
2186 Result = V4MulAdd(S3, V7, Result);
2187 Result = V4MulAdd(S4, V9, Result);
2188 Result = V4MulAdd(S5, V11, Result);
2189 Result = V4MulAdd(S6, V13, Result);
2190 Result = V4MulAdd(S7, V15, Result);
2191 Result = V4MulAdd(S8, V17, Result);
2192 Result = V4MulAdd(S9, V19, Result);
2193 Result = V4MulAdd(S10, V21, Result);
2194 Result = V4MulAdd(S11, V23, Result);
2201 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
2202 const Vec4V twoPi = V4LoadA(g_PXTwoPi.f);
2203 const Vec4V tmp = V4Mul(a, recipTwoPi);
2204 const Vec4V b = V4Round(tmp);
2205 const Vec4V V1 = V4NegMulSub(twoPi, b, a);
2209 const Vec4V V2 = V4Mul(V1, V1);
2210 const Vec4V V4 = V4Mul(V2, V2);
2211 const Vec4V V6 = V4Mul(V4, V2);
2212 const Vec4V V8 = V4Mul(V4, V4);
2213 const Vec4V V10 = V4Mul(V6, V4);
2214 const Vec4V V12 = V4Mul(V6, V6);
2215 const Vec4V V14 = V4Mul(V8, V6);
2216 const Vec4V V16 = V4Mul(V8, V8);
2217 const Vec4V V18 = V4Mul(V10, V8);
2218 const Vec4V V20 = V4Mul(V10, V10);
2219 const Vec4V V22 = V4Mul(V12, V10);
2221 const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f);
2222 const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f);
2223 const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f);
2225 const FloatV C1 = V4GetY(cosCoefficients0);
2226 const FloatV C2 = V4GetZ(cosCoefficients0);
2227 const FloatV C3 = V4GetW(cosCoefficients0);
2228 const FloatV C4 = V4GetX(cosCoefficients1);
2229 const FloatV C5 = V4GetY(cosCoefficients1);
2230 const FloatV C6 = V4GetZ(cosCoefficients1);
2231 const FloatV C7 = V4GetW(cosCoefficients1);
2232 const FloatV C8 = V4GetX(cosCoefficients2);
2233 const FloatV C9 = V4GetY(cosCoefficients2);
2234 const FloatV C10 = V4GetZ(cosCoefficients2);
2235 const FloatV C11 = V4GetW(cosCoefficients2);
2238 Result = V4MulAdd(C1, V2, V4One());
2239 Result = V4MulAdd(C2, V4, Result);
2240 Result = V4MulAdd(C3, V6, Result);
2241 Result = V4MulAdd(C4, V8, Result);
2242 Result = V4MulAdd(C5, V10, Result);
2243 Result = V4MulAdd(C6, V12, Result);
2244 Result = V4MulAdd(C7, V14, Result);
2245 Result = V4MulAdd(C8, V16, Result);
2246 Result = V4MulAdd(C9, V18, Result);
2247 Result = V4MulAdd(C10, V20, Result);
2248 Result = V4MulAdd(C11, V22, Result);
2253PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3)
2255 Vec4V tmp0 = _mm_unpacklo_ps(col0, col1);
2256 Vec4V tmp2 = _mm_unpacklo_ps(col2, col3);
2257 Vec4V tmp1 = _mm_unpackhi_ps(col0, col1);
2258 Vec4V tmp3 = _mm_unpackhi_ps(col2, col3);
2259 col0 = _mm_movelh_ps(tmp0, tmp2);
2260 col1 = _mm_movehl_ps(tmp2, tmp0);
2261 col2 = _mm_movelh_ps(tmp1, tmp3);
2262 col3 = _mm_movehl_ps(tmp3, tmp1);
2271 return _mm_setzero_ps();
2279 return m128_I2F(_mm_set_epi32(-1, 0, 0, 0));
2287 return m128_I2F(_mm_set_epi32(0, -1, 0, 0));
2295 return m128_I2F(_mm_set_epi32(-1, -1, 0, 0));
2303 return m128_I2F(_mm_set_epi32(0, 0, -1, 0));
2311 return m128_I2F(_mm_set_epi32(-1, 0, -1, 0));
2319 return m128_I2F(_mm_set_epi32(0, -1, -1, 0));
2327 return m128_I2F(_mm_set_epi32(-1, -1, -1, 0));
2335 return m128_I2F(_mm_set_epi32(0, 0, 0, -1));
2343 return m128_I2F(_mm_set_epi32(-1, 0, 0, -1));
2351 return m128_I2F(_mm_set_epi32(0, -1, 0, -1));
2359 return m128_I2F(_mm_set_epi32(-1, -1, 0, -1));
2367 return m128_I2F(_mm_set_epi32(0, 0, -1, -1));
2375 return m128_I2F(_mm_set_epi32(-1, 0, -1, -1));
2383 return m128_I2F(_mm_set_epi32(0, -1, -1, -1));
2391 return m128_I2F(_mm_set_epi32(-1, -1, -1, -1));
2399 return m128_I2F(_mm_set_epi32(0, 0, 0, -1));
2407 return m128_I2F(_mm_set_epi32(0, 0, -1, 0));
2415 return m128_I2F(_mm_set_epi32(0, -1, 0, 0));
2423 return m128_I2F(_mm_set_epi32(-1, 0, 0, 0));
2428 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
2433 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
2438 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
2443 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
2448 return V4Sel(BFTTT(), v, f);
2453 return V4Sel(BTFTT(), v, f);
2458 return V4Sel(BTTFT(), v, f);
2463 return V4Sel(BTTTF(), v, f);
2468 return _mm_and_ps(a, b);
2473 const BoolV bAllTrue(BTTTT());
2474 return _mm_xor_ps(a, bAllTrue);
2479 return _mm_andnot_ps(b, a);
2484 return _mm_or_ps(a, b);
2490 _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3)));
2491 return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2492 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2498 _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3)));
2499 return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2500 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2506 _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
2507 return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2508 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2514 _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
2515 return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2516 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2521 const BoolV bTest = m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b)));
2522 return internalUnitSSE2Simd::BAllTrue4_R(bTest);
2527 return PxU32(_mm_movemask_ps(a)==15);
2532 return PxU32(_mm_movemask_ps(a)==0);
2537 return PxU32(_mm_movemask_ps(a));
2546 const FloatV x = V3GetX(b);
2547 const FloatV y = V3GetY(b);
2548 const FloatV z = V3GetZ(b);
2549 const Vec3V v0 = V3Scale(a.col0, x);
2550 const Vec3V v1 = V3Scale(a.col1, y);
2551 const Vec3V v2 = V3Scale(a.col2, z);
2552 const Vec3V v0PlusV1 = V3Add(v0, v1);
2553 return V3Add(v0PlusV1, v2);
2558 const FloatV x = V3Dot(a.col0, b);
2559 const FloatV y = V3Dot(a.col1, b);
2560 const FloatV z = V3Dot(a.col2, b);
2561 return V3Merge(x, y, z);
2564PX_FORCE_INLINE Vec3V M33MulV3AddV3(
const Mat33V& A,
const Vec3V b,
const Vec3V c)
2566 const FloatV x = V3GetX(b);
2567 const FloatV y = V3GetY(b);
2568 const FloatV z = V3GetZ(b);
2569 Vec3V result = V3ScaleAdd(A.col0, x, c);
2570 result = V3ScaleAdd(A.col1, y, result);
2571 return V3ScaleAdd(A.col2, z, result);
2576 return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2));
2581 return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2));
2586 return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b));
2591 const BoolV tfft = BTFFT();
2592 const BoolV tttf = BTTTF();
2593 const FloatV
zero = FZero();
2594 const Vec3V cross01 = V3Cross(a.col0, a.col1);
2595 const Vec3V cross12 = V3Cross(a.col1, a.col2);
2596 const Vec3V cross20 = V3Cross(a.col2, a.col0);
2597 const FloatV dot = V3Dot(cross01, a.col2);
2598 const FloatV invDet = _mm_rcp_ps(dot);
2599 const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01);
2600 const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01);
2601 Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20);
2602 colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0));
2603 const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2));
2604 const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0));
2605 const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd));
2606 const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0));
2607 const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0));
2608 const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd));
2610 return Mat33V(_mm_mul_ps(colInv0, invDet), _mm_mul_ps(colInv1, invDet), _mm_mul_ps(colInv2, invDet));
2615 return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)),
2616 V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)),
2617 V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2)));
2622 return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ());
2627 return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2));
2632 return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2));
2637 return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2));
2642 const BoolV bTFFF = BTFFF();
2643 const BoolV bFTFF = BFTFF();
2644 const BoolV bFFTF = BTFTF();
2646 const Vec3V
zero = V3Zero();
2648 return Mat33V(V3Sel(bTFFF, v, zero), V3Sel(bFTFF, v, zero), V3Sel(bFFTF, v, zero));
2653 const FloatV x = V3Mul(V3UnitX(), d);
2654 const FloatV y = V3Mul(V3UnitY(), d);
2655 const FloatV z = V3Mul(V3UnitZ(), d);
2656 return Mat33V(x, y, z);
2665 const FloatV x = V3GetX(b);
2666 const FloatV y = V3GetY(b);
2667 const FloatV z = V3GetZ(b);
2668 const Vec3V v0 = V3Scale(a.col0, x);
2669 const Vec3V v1 = V3Scale(a.col1, y);
2670 const Vec3V v2 = V3Scale(a.col2, z);
2671 const Vec3V v0PlusV1 = V3Add(v0, v1);
2672 const Vec3V v0PlusV1Plusv2 = V3Add(v0PlusV1, v2);
2673 return V3Add(v0PlusV1Plusv2, a.col3);
2678 const FloatV x = V3GetX(b);
2679 const FloatV y = V3GetY(b);
2680 const FloatV z = V3GetZ(b);
2681 const Vec3V v0 = V3Scale(a.col0, x);
2682 const Vec3V v1 = V3Scale(a.col1, y);
2683 const Vec3V v2 = V3Scale(a.col2, z);
2684 const Vec3V v0PlusV1 = V3Add(v0, v1);
2685 return V3Add(v0PlusV1, v2);
2690 const FloatV x = V3Dot(a.col0, b);
2691 const FloatV y = V3Dot(a.col1, b);
2692 const FloatV z = V3Dot(a.col2, b);
2693 return V3Merge(x, y, z);
2698 return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3));
2703 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
2708 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
2713 return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3));
2718 return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)),
2719 V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)),
2720 V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2)));
2729 const FloatV x = V4GetX(b);
2730 const FloatV y = V4GetY(b);
2731 const FloatV z = V4GetZ(b);
2732 const FloatV w = V4GetW(b);
2734 const Vec4V v0 = V4Scale(a.col0, x);
2735 const Vec4V v1 = V4Scale(a.col1, y);
2736 const Vec4V v2 = V4Scale(a.col2, z);
2737 const Vec4V v3 = V4Scale(a.col3, w);
2738 const Vec4V v0PlusV1 = V4Add(v0, v1);
2739 const Vec4V v0PlusV1Plusv2 = V4Add(v0PlusV1, v2);
2740 return V4Add(v0PlusV1Plusv2, v3);
2745 PX_ALIGN(16, FloatV) dotProdArray[4] = { V4Dot(a.col0, b), V4Dot(a.col1, b), V4Dot(a.col2, b), V4Dot(a.col3, b) };
2746 return V4Merge(dotProdArray);
2751 return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3));
2756 return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3));
2761 const Vec4V v0 = _mm_unpacklo_ps(a.col0, a.col2);
2762 const Vec4V v1 = _mm_unpackhi_ps(a.col0, a.col2);
2763 const Vec4V v2 = _mm_unpacklo_ps(a.col1, a.col3);
2764 const Vec4V v3 = _mm_unpackhi_ps(a.col1, a.col3);
2765 return Mat44V(_mm_unpacklo_ps(v0, v2), _mm_unpackhi_ps(v0, v2), _mm_unpacklo_ps(v1, v3), _mm_unpackhi_ps(v1, v3));
2770 __m128 minor0, minor1, minor2, minor3;
2771 __m128 row0, row1, row2, row3;
2779 row1 = _mm_shuffle_ps(a.col1, a.col1, _MM_SHUFFLE(1, 0, 3, 2));
2781 row3 = _mm_shuffle_ps(a.col3, a.col3, _MM_SHUFFLE(1, 0, 3, 2));
2783 tmp1 = _mm_mul_ps(row2, row3);
2784 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2785 minor0 = _mm_mul_ps(row1, tmp1);
2786 minor1 = _mm_mul_ps(row0, tmp1);
2787 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2788 minor0 = _mm_sub_ps(_mm_mul_ps(row1, tmp1), minor0);
2789 minor1 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor1);
2790 minor1 = _mm_shuffle_ps(minor1, minor1, 0x4E);
2792 tmp1 = _mm_mul_ps(row1, row2);
2793 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2794 minor0 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor0);
2795 minor3 = _mm_mul_ps(row0, tmp1);
2796 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2797 minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row3, tmp1));
2798 minor3 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor3);
2799 minor3 = _mm_shuffle_ps(minor3, minor3, 0x4E);
2801 tmp1 = _mm_mul_ps(_mm_shuffle_ps(row1, row1, 0x4E), row3);
2802 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2803 row2 = _mm_shuffle_ps(row2, row2, 0x4E);
2804 minor0 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor0);
2805 minor2 = _mm_mul_ps(row0, tmp1);
2806 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2807 minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row2, tmp1));
2808 minor2 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor2);
2809 minor2 = _mm_shuffle_ps(minor2, minor2, 0x4E);
2811 tmp1 = _mm_mul_ps(row0, row1);
2812 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2813 minor2 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor2);
2814 minor3 = _mm_sub_ps(_mm_mul_ps(row2, tmp1), minor3);
2815 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2816 minor2 = _mm_sub_ps(_mm_mul_ps(row3, tmp1), minor2);
2817 minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row2, tmp1));
2819 tmp1 = _mm_mul_ps(row0, row3);
2820 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2821 minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row2, tmp1));
2822 minor2 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor2);
2823 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2824 minor1 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor1);
2825 minor2 = _mm_sub_ps(minor2, _mm_mul_ps(row1, tmp1));
2827 tmp1 = _mm_mul_ps(row0, row2);
2828 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2829 minor1 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor1);
2830 minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row1, tmp1));
2831 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2832 minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row3, tmp1));
2833 minor3 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor3);
2835 det = _mm_mul_ps(row0, minor0);
2836 det = _mm_add_ps(_mm_shuffle_ps(det, det, 0x4E), det);
2837 det = _mm_add_ss(_mm_shuffle_ps(det, det, 0xB1), det);
2838 tmp1 = _mm_rcp_ss(det);
2840 det = _mm_sub_ss(_mm_add_ss(tmp1, tmp1), _mm_mul_ss(det, _mm_mul_ss(tmp1, tmp1)));
2841 det = _mm_shuffle_ps(det, det, 0x00);
2843 det = _mm_shuffle_ps(tmp1, tmp1, _MM_SHUFFLE(0, 0, 0, 0));
2846 minor0 = _mm_mul_ps(det, minor0);
2847 minor1 = _mm_mul_ps(det, minor1);
2848 minor2 = _mm_mul_ps(det, minor2);
2849 minor3 = _mm_mul_ps(det, minor3);
2850 Mat44V invTrans(minor0, minor1, minor2, minor3);
2851 return M44Trnsps(invTrans);
2854PX_FORCE_INLINE Vec4V V4LoadXYZW(
const PxF32& x,
const PxF32& y,
const PxF32& z,
const PxF32& w)
2856 return _mm_set_ps(w, z, y, x);
2876PX_FORCE_INLINE VecU32V V4U32Sel(
const BoolV c,
const VecU32V a,
const VecU32V b)
2878 return m128_I2F(_mm_or_si128(_mm_andnot_si128(m128_F2I(c), m128_F2I(b)), _mm_and_si128(m128_F2I(c), m128_F2I(a))));
2883 return m128_I2F(_mm_or_si128(m128_F2I(a), m128_F2I(b)));
2888 return m128_I2F(_mm_xor_si128(m128_F2I(a), m128_F2I(b)));
2893 return m128_I2F(_mm_and_si128(m128_F2I(a), m128_F2I(b)));
2898 return m128_I2F(_mm_andnot_si128(m128_F2I(b), m128_F2I(a)));
2924 return m128_F2I(_mm_load1_ps(
reinterpret_cast<const PxF32*
>(&i)));
2929 return m128_F2I(_mm_loadu_ps(
reinterpret_cast<const PxF32*
>(i)));
2934 return m128_F2I(_mm_load_ps(
reinterpret_cast<const PxF32*
>(i)));
2937PX_FORCE_INLINE VecI32V VecI32V_Add(
const VecI32VArg a,
const VecI32VArg b)
2939 return _mm_add_epi32(a, b);
2942PX_FORCE_INLINE VecI32V VecI32V_Sub(
const VecI32VArg a,
const VecI32VArg b)
2944 return _mm_sub_epi32(a, b);
2947PX_FORCE_INLINE BoolV VecI32V_IsGrtr(
const VecI32VArg a,
const VecI32VArg b)
2949 return m128_I2F(_mm_cmpgt_epi32(a, b));
2952PX_FORCE_INLINE BoolV VecI32V_IsEq(
const VecI32VArg a,
const VecI32VArg b)
2954 return m128_I2F(_mm_cmpeq_epi32(a, b));
2957PX_FORCE_INLINE VecI32V V4I32Sel(
const BoolV c,
const VecI32V a,
const VecI32V b)
2959 return _mm_or_si128(_mm_andnot_si128(m128_F2I(c), b), _mm_and_si128(m128_F2I(c), a));
2964 return _mm_setzero_si128();
2997PX_FORCE_INLINE VecI32V VecI32V_Sel(
const BoolV c,
const VecI32VArg a,
const VecI32VArg b)
2999 return _mm_or_si128(_mm_andnot_si128(m128_F2I(c), b), _mm_and_si128(m128_F2I(c), a));
3005 s.shift = VecI32V_Sel(BTFFF(), shift, VecI32V_Zero());
3009PX_FORCE_INLINE VecI32V VecI32V_LeftShift(
const VecI32VArg a,
const VecShiftVArg count)
3011 return _mm_sll_epi32(a, count.shift);
3014PX_FORCE_INLINE VecI32V VecI32V_RightShift(
const VecI32VArg a,
const VecShiftVArg count)
3016 return _mm_srl_epi32(a, count.shift);
3019PX_FORCE_INLINE VecI32V VecI32V_LeftShift(
const VecI32VArg a,
const PxU32 count)
3021 return _mm_slli_epi32(a, PxI32(count));
3024PX_FORCE_INLINE VecI32V VecI32V_RightShift(
const VecI32VArg a,
const PxU32 count)
3026 return _mm_srai_epi32(a, PxI32(count));
3029PX_FORCE_INLINE VecI32V VecI32V_And(
const VecI32VArg a,
const VecI32VArg b)
3031 return _mm_and_si128(a, b);
3034PX_FORCE_INLINE VecI32V VecI32V_Or(
const VecI32VArg a,
const VecI32VArg b)
3036 return _mm_or_si128(a, b);
3041 return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(0, 0, 0, 0)));
3046 return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(1, 1, 1, 1)));
3051 return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(2, 2, 2, 2)));
3056 return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(3, 3, 3, 3)));
3061 _mm_store_ss(
reinterpret_cast<PxF32*
>(i), m128_I2F(a));
3064PX_FORCE_INLINE VecI32V VecI32V_Merge(
const VecI32VArg x,
const VecI32VArg y,
const VecI32VArg z,
const VecI32VArg w)
3066 const __m128 xw = _mm_move_ss(m128_I2F(y), m128_I2F(x));
3067 const __m128 yz = _mm_move_ss(m128_I2F(z), m128_I2F(w));
3068 return m128_F2I(_mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)));
3122 return V4LoadU(
reinterpret_cast<float*
>(addr));
3127 VecU32V result32(a);
3128 result32 = V4U32Andc(result32, b);
3129 return Vec4V(result32);
3134 return V4IsGrtr(a, b);
3152 result.m128_u16[0] = (a).m128_u16[0] > (b).m128_u16[0];
3153 result.m128_u16[1] = (a).m128_u16[1] > (b).m128_u16[1];
3154 result.m128_u16[2] = (a).m128_u16[2] > (b).m128_u16[2];
3155 result.m128_u16[3] = (a).m128_u16[3] > (b).m128_u16[3];
3156 result.m128_u16[4] = (a).m128_u16[4] > (b).m128_u16[4];
3157 result.m128_u16[5] = (a).m128_u16[5] > (b).m128_u16[5];
3158 result.m128_u16[6] = (a).m128_u16[6] > (b).m128_u16[6];
3159 result.m128_u16[7] = (a).m128_u16[7] > (b).m128_u16[7];
3165 return m128_I2F(_mm_cmpgt_epi16(m128_F2I(a), m128_F2I(b)));
3170 Vec4V result = V4LoadXYZW(PxF32(a.m128_u32[0]), PxF32(a.m128_u32[1]), PxF32(a.m128_u32[2]), PxF32(a.m128_u32[3]));
3176 return _mm_cvtepi32_ps(in);
3181 return _mm_cvttps_epi32(a);
3214BoolV BSplatElement(BoolV a)
3216 float* data =
reinterpret_cast<float*
>(&a);
3217 return V4Load(data[index]);
3224 result.m128_u32[0] = result.m128_u32[1] = result.m128_u32[2] = result.m128_u32[3] = a.m128_u32[index];
3231 float* data =
reinterpret_cast<float*
>(&a);
3232 return V4Load(data[index]);
3238 result.m128_u32[0] = x;
3239 result.m128_u32[1] = y;
3240 result.m128_u32[2] = z;
3241 result.m128_u32[3] = w;
3248 return V4LoadXYZW(PxCeil(a.m128_f32[0]), PxCeil(a.m128_f32[1]), PxCeil(a.m128_f32[2]), PxCeil(a.m128_f32[3]));
3254 return V4LoadXYZW(PxFloor(a.m128_f32[0]), PxFloor(a.m128_f32[1]), PxFloor(a.m128_f32[2]), PxFloor(a.m128_f32[3]));
3257PX_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(
const Vec4V in, PxU32 power)
3259 PX_ASSERT(power == 0 &&
"Non-zero power not supported in convertToU32VSaturate");
3261 PxF32 ffffFFFFasFloat = PxF32(0xFFFF0000);
3264 result.m128_u32[0] = PxU32(PxClamp<PxF32>((a).m128_f32[0], 0.0f, ffffFFFFasFloat));
3265 result.m128_u32[1] = PxU32(PxClamp<PxF32>((a).m128_f32[1], 0.0f, ffffFFFFasFloat));
3266 result.m128_u32[2] = PxU32(PxClamp<PxF32>((a).m128_f32[2], 0.0f, ffffFFFFasFloat));
3267 result.m128_u32[3] = PxU32(PxClamp<PxF32>((a).m128_f32[3], 0.0f, ffffFFFFasFloat));
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
#define PX_ALIGN(alignment, decl)
Definition PxPreprocessor.h:402
GLM_FUNC_DECL GLM_CONSTEXPR genType zero()
Definition constants.inl:6
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39