29#ifndef PX_WINDOWS_INLINE_AOS_H
30#define PX_WINDOWS_INLINE_AOS_H
32#if !COMPILE_VECTOR_INTRINSICS
33#error Vector intrinsics should not be included when using scalar implementation.
36#include "../PxVecMathSSE.h"
47#define FLOAT_COMPONENTS_EQUAL_THRESHOLD 0.01f
50 const PxF32 x = V4ReadX(a);
51 const PxF32 y = V4ReadY(a);
52 const PxF32 z = V4ReadZ(a);
53 const PxF32 w = V4ReadW(a);
55 return (!(x != y || x != z || x != w));
81 V4StoreA((
const Vec4V&)a, f);
87 return !FAllEq(V4LengthSq(a), FZero());
92 return(0 == ((
size_t)a & 0x0f));
98#define ASSERT_ISVALIDVEC3V(a) PX_ASSERT(isValidVec3V(a))
99#define ASSERT_ISVALIDFLOATV(a) PX_ASSERT(isValidFloatV(a))
100#define ASSERT_ISALIGNED16(a) PX_ASSERT(isAligned16((void*)a))
101#define ASSERT_ISFINITELENGTH(a)
103#define ASSERT_ISVALIDVEC3V(a)
104#define ASSERT_ISVALIDFLOATV(a)
105#define ASSERT_ISALIGNED16(a)
106#define ASSERT_ISFINITELENGTH(a)
116namespace internalWindowsSimd
120 return _mm_castsi128_ps(n);
125 return _mm_castps_si128(n);
130 const PxI32 moveMask = _mm_movemask_ps(a);
131 return PxU32(moveMask == 0xf);
136 const PxI32 moveMask = _mm_movemask_ps(a);
137 return PxU32((moveMask & 0x7) == 0x7);
142 const PxI32 moveMask = _mm_movemask_ps(a);
143 return PxU32(moveMask != 0x0);
148 const PxI32 moveMask = _mm_movemask_ps(a);
149 return PxU32(((moveMask & 0x7) != 0x0));
158 const BoolV one = FOne();
159 const BoolV
zero = FZero();
160 const BoolV a1 = V4Sel(a, one, zero);
161 const BoolV b1 = V4Sel(b, one, zero);
163 _mm_comieq_ss(a1, b1) &&
164 _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))) &&
165 _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))) &&
166 _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)))));
171 ASSERT_ISVALIDFLOATV(a);
172 return _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ? true :
false;
177 return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ||
178 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) ||
179 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero()));
184 return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ||
185 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) ||
186 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero()) ||
187 _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FZero()));
190const PX_ALIGN(16, PxU32 gMaskXYZ[4]) = { 0xffffffff, 0xffffffff, 0xffffffff, 0 };
193namespace vecMathTests
198 const float f = 1.0f;
199 return _mm_load1_ps(&f);
202PX_FORCE_INLINE bool allElementsEqualFloatV(
const FloatV a,
const FloatV b)
204 ASSERT_ISVALIDFLOATV(a);
205 ASSERT_ISVALIDFLOATV(b);
206 return _mm_comieq_ss(a, b) != 0;
209PX_FORCE_INLINE bool allElementsEqualVec3V(
const Vec3V a,
const Vec3V b)
211 return V3AllEq(a, b) != 0;
214PX_FORCE_INLINE bool allElementsEqualVec4V(
const Vec4V a,
const Vec4V b)
216 return V4AllEq(a, b) != 0;
219PX_FORCE_INLINE bool allElementsEqualBoolV(
const BoolV a,
const BoolV b)
221 return internalWindowsSimd::BAllTrue4_R(VecI32V_IsEq(a, b)) != 0;
224PX_FORCE_INLINE bool allElementsEqualVecU32V(
const VecU32V a,
const VecU32V b)
226 return internalWindowsSimd::BAllTrue4_R(V4IsEqU32(a, b)) != 0;
229PX_FORCE_INLINE bool allElementsEqualVecI32V(
const VecI32V a,
const VecI32V b)
231 BoolV c = internalWindowsSimd::m128_I2F(
232 _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
233 return internalWindowsSimd::BAllTrue4_R(c) != 0;
236#define VECMATH_AOS_EPSILON (1e-3f)
237static const FloatV minFError = FLoad(-VECMATH_AOS_EPSILON);
238static const FloatV maxFError = FLoad(VECMATH_AOS_EPSILON);
239static const Vec3V minV3Error = V3Load(-VECMATH_AOS_EPSILON);
240static const Vec3V maxV3Error = V3Load(VECMATH_AOS_EPSILON);
241static const Vec4V minV4Error = V4Load(-VECMATH_AOS_EPSILON);
242static const Vec4V maxV4Error = V4Load(VECMATH_AOS_EPSILON);
244PX_FORCE_INLINE bool allElementsNearEqualFloatV(
const FloatV a,
const FloatV b)
246 ASSERT_ISVALIDFLOATV(a);
247 ASSERT_ISVALIDFLOATV(b);
248 const FloatV c = FSub(a, b);
249 return _mm_comigt_ss(c, minFError) && _mm_comilt_ss(c, maxFError);
252PX_FORCE_INLINE bool allElementsNearEqualVec3V(
const Vec3V a,
const Vec3V b)
254 const Vec3V c = V3Sub(a, b);
255 return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minV3Error) &&
256 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxV3Error) &&
257 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minV3Error) &&
258 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxV3Error) &&
259 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minV3Error) &&
260 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxV3Error));
263PX_FORCE_INLINE bool allElementsNearEqualVec4V(
const Vec4V a,
const Vec4V b)
265 const Vec4V c = V4Sub(a, b);
266 return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minV4Error) &&
267 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxV4Error) &&
268 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minV4Error) &&
269 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxV4Error) &&
270 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minV4Error) &&
271 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxV4Error) &&
272 _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), minV4Error) &&
273 _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), maxV4Error));
293 V4StoreA((Vec4V&)a, f);
325 return _mm_load1_ps(&f);
330 return _mm_set_ps(0.0f, f, f, f);
335 return _mm_load1_ps(&f);
340 const PxU32 i = PxU32(-(PxI32)f);
341 return _mm_load1_ps((
float*)&i);
346 ASSERT_ISALIGNED16(&f);
347 return _mm_and_ps(_mm_load_ps(&f.x),
reinterpret_cast<const Vec4V&
>(internalWindowsSimd::gMaskXYZ));
352 return _mm_set_ps(0.0f, f.z, f.y, f.x);
358 ASSERT_ISALIGNED16(&f);
359 return _mm_load_ps(&f.x);
364 ASSERT_ISALIGNED16(f);
365 return V4ClearW(_mm_load_ps(f));
370 return _mm_set_ps(0.0f, i[2], i[1], i[0]);
395 return Vec3V_From_Vec4V(Vec4V_From_FloatV(f));
400 return Vec3V_From_Vec4V_WUndefined(Vec4V_From_FloatV(f));
405 return _mm_set_ps(0.0f, f.z, f.y, f.x);
410 ASSERT_ISALIGNED16(f);
411 return _mm_load_ps(f);
416 ASSERT_ISALIGNED16(f);
427 ASSERT_ISALIGNED16(f);
428 _mm_store_ps((PxF32*)f, a);
433 ASSERT_ISALIGNED16(u);
434 _mm_store_ps((PxF32*)u, uv);
439 ASSERT_ISALIGNED16(i);
440 _mm_store_ps((PxF32*)i, iv);
445 return _mm_loadu_ps(f);
450 const PX_ALIGN(16, PxU32 b[4]) = { PxU32(-(PxI32)f[0]), PxU32(-(PxI32)f[1]),
451 PxU32(-(PxI32)f[2]), PxU32(-(PxI32)f[3]) };
452 return _mm_load_ps((
float*)&b);
457 ASSERT_ISVALIDFLOATV(a);
463 ASSERT_ISALIGNED16(&f);
466 f = PxVec3(f2[0], f2[1], f2[2]);
471 _mm_store_ss((PxF32*)b2, b);
478 f = PxVec3(f2[0], f2[1], f2[2]);
483 return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2));
488 ASSERT_ISALIGNED16(&out);
489 V3StoreU(m.col0, out.column0);
490 V3StoreU(m.col1, out.column1);
491 V3StoreU(m.col2, out.column2);
500 return _mm_setzero_ps();
515 return FLoad(PX_EPS_REAL);
525 return FLoad(PX_MAX_REAL);
530 return FLoad(-PX_MAX_REAL);
535 const PxU32
zero = 0;
536 return _mm_load1_ps((PxF32*)&zero);
542 return _mm_load1_ps((PxF32*)&one);
548 return _mm_load1_ps((PxF32*)&two);
553 const PxU32 three = 3;
554 return _mm_load1_ps((PxF32*)&three);
559 const PxU32 four = 4;
560 return _mm_load1_ps((PxF32*)&four);
565 ASSERT_ISVALIDFLOATV(f);
566 return _mm_sub_ps(_mm_setzero_ps(), f);
571 ASSERT_ISVALIDFLOATV(a);
572 ASSERT_ISVALIDFLOATV(b);
573 return _mm_add_ps(a, b);
578 ASSERT_ISVALIDFLOATV(a);
579 ASSERT_ISVALIDFLOATV(b);
580 return _mm_sub_ps(a, b);
585 ASSERT_ISVALIDFLOATV(a);
586 ASSERT_ISVALIDFLOATV(b);
587 return _mm_mul_ps(a, b);
592 ASSERT_ISVALIDFLOATV(a);
593 ASSERT_ISVALIDFLOATV(b);
594 return _mm_div_ps(a, b);
599 ASSERT_ISVALIDFLOATV(a);
600 ASSERT_ISVALIDFLOATV(b);
601 return _mm_mul_ps(a, _mm_rcp_ps(b));
606 ASSERT_ISVALIDFLOATV(a);
607 return _mm_div_ps(FOne(), a);
612 return _mm_rcp_ps(a);
617 ASSERT_ISVALIDFLOATV(a);
618 return _mm_div_ps(FOne(), _mm_sqrt_ps(a));
623 ASSERT_ISVALIDFLOATV(a);
624 return _mm_sqrt_ps(a);
629 ASSERT_ISVALIDFLOATV(a);
630 return _mm_rsqrt_ps(a);
633PX_FORCE_INLINE FloatV FScaleAdd(
const FloatV a,
const FloatV b,
const FloatV c)
635 ASSERT_ISVALIDFLOATV(a);
636 ASSERT_ISVALIDFLOATV(b);
637 ASSERT_ISVALIDFLOATV(c);
638 return FAdd(FMul(a, b), c);
641PX_FORCE_INLINE FloatV FNegScaleSub(
const FloatV a,
const FloatV b,
const FloatV c)
643 ASSERT_ISVALIDFLOATV(a);
644 ASSERT_ISVALIDFLOATV(b);
645 ASSERT_ISVALIDFLOATV(c);
646 return FSub(c, FMul(a, b));
651 ASSERT_ISVALIDFLOATV(a);
652 PX_ALIGN(16,
const static PxU32 absMask[4]) = { 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF };
653 return _mm_and_ps(a, _mm_load_ps((PxF32*)absMask));
656PX_FORCE_INLINE FloatV FSel(
const BoolV c,
const FloatV a,
const FloatV b)
658 PX_ASSERT(vecMathTests::allElementsEqualBoolV(c, BTTTT()) ||
659 vecMathTests::allElementsEqualBoolV(c, BFFFF()));
660 ASSERT_ISVALIDFLOATV(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)));
661 return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
666 ASSERT_ISVALIDFLOATV(a);
667 ASSERT_ISVALIDFLOATV(b);
668 return _mm_cmpgt_ps(a, b);
673 ASSERT_ISVALIDFLOATV(a);
674 ASSERT_ISVALIDFLOATV(b);
675 return _mm_cmpge_ps(a, b);
680 ASSERT_ISVALIDFLOATV(a);
681 ASSERT_ISVALIDFLOATV(b);
682 return _mm_cmpeq_ps(a, b);
687 ASSERT_ISVALIDFLOATV(a);
688 ASSERT_ISVALIDFLOATV(b);
689 return _mm_max_ps(a, b);
694 ASSERT_ISVALIDFLOATV(a);
695 ASSERT_ISVALIDFLOATV(b);
696 return _mm_min_ps(a, b);
699PX_FORCE_INLINE FloatV FClamp(
const FloatV a,
const FloatV minV,
const FloatV maxV)
701 ASSERT_ISVALIDFLOATV(minV);
702 ASSERT_ISVALIDFLOATV(maxV);
703 return _mm_max_ps(_mm_min_ps(a, maxV), minV);
708 ASSERT_ISVALIDFLOATV(a);
709 ASSERT_ISVALIDFLOATV(b);
710 return PxU32(_mm_comigt_ss(a, b));
715 ASSERT_ISVALIDFLOATV(a);
716 ASSERT_ISVALIDFLOATV(b);
717 return PxU32(_mm_comige_ss(a, b));
722 ASSERT_ISVALIDFLOATV(a);
723 ASSERT_ISVALIDFLOATV(b);
724 return PxU32(_mm_comieq_ss(a, b));
729 ASSERT_ISVALIDFLOATV(a);
731 const FloatV half = FLoad(0.5f);
732 const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31));
733 const FloatV aRound = FSub(FAdd(a, half), signBit);
734 __m128i tmp = _mm_cvttps_epi32(aRound);
735 return _mm_cvtepi32_ps(tmp);
740 ASSERT_ISVALIDFLOATV(a);
742 const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
743 const FloatV twoPi = V4LoadA(g_PXTwoPi.f);
744 const FloatV tmp = FMul(a, recipTwoPi);
745 const FloatV b = FRound(tmp);
746 const FloatV V1 = FNegScaleSub(twoPi, b, a);
750 const FloatV V2 = FMul(V1, V1);
751 const FloatV V3 = FMul(V2, V1);
752 const FloatV V5 = FMul(V3, V2);
753 const FloatV V7 = FMul(V5, V2);
754 const FloatV V9 = FMul(V7, V2);
755 const FloatV V11 = FMul(V9, V2);
756 const FloatV V13 = FMul(V11, V2);
757 const FloatV V15 = FMul(V13, V2);
758 const FloatV V17 = FMul(V15, V2);
759 const FloatV V19 = FMul(V17, V2);
760 const FloatV V21 = FMul(V19, V2);
761 const FloatV V23 = FMul(V21, V2);
763 const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f);
764 const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f);
765 const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f);
767 const FloatV S1 = V4GetY(sinCoefficients0);
768 const FloatV S2 = V4GetZ(sinCoefficients0);
769 const FloatV S3 = V4GetW(sinCoefficients0);
770 const FloatV S4 = V4GetX(sinCoefficients1);
771 const FloatV S5 = V4GetY(sinCoefficients1);
772 const FloatV S6 = V4GetZ(sinCoefficients1);
773 const FloatV S7 = V4GetW(sinCoefficients1);
774 const FloatV S8 = V4GetX(sinCoefficients2);
775 const FloatV S9 = V4GetY(sinCoefficients2);
776 const FloatV S10 = V4GetZ(sinCoefficients2);
777 const FloatV S11 = V4GetW(sinCoefficients2);
780 Result = FScaleAdd(S1, V3, V1);
781 Result = FScaleAdd(S2, V5, Result);
782 Result = FScaleAdd(S3, V7, Result);
783 Result = FScaleAdd(S4, V9, Result);
784 Result = FScaleAdd(S5, V11, Result);
785 Result = FScaleAdd(S6, V13, Result);
786 Result = FScaleAdd(S7, V15, Result);
787 Result = FScaleAdd(S8, V17, Result);
788 Result = FScaleAdd(S9, V19, Result);
789 Result = FScaleAdd(S10, V21, Result);
790 Result = FScaleAdd(S11, V23, Result);
797 ASSERT_ISVALIDFLOATV(a);
800 const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
801 const FloatV twoPi = V4LoadA(g_PXTwoPi.f);
802 const FloatV tmp = FMul(a, recipTwoPi);
803 const FloatV b = FRound(tmp);
804 const FloatV V1 = FNegScaleSub(twoPi, b, a);
808 const FloatV V2 = FMul(V1, V1);
809 const FloatV V4 = FMul(V2, V2);
810 const FloatV V6 = FMul(V4, V2);
811 const FloatV V8 = FMul(V4, V4);
812 const FloatV V10 = FMul(V6, V4);
813 const FloatV V12 = FMul(V6, V6);
814 const FloatV V14 = FMul(V8, V6);
815 const FloatV V16 = FMul(V8, V8);
816 const FloatV V18 = FMul(V10, V8);
817 const FloatV V20 = FMul(V10, V10);
818 const FloatV V22 = FMul(V12, V10);
820 const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f);
821 const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f);
822 const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f);
824 const FloatV C1 = V4GetY(cosCoefficients0);
825 const FloatV C2 = V4GetZ(cosCoefficients0);
826 const FloatV C3 = V4GetW(cosCoefficients0);
827 const FloatV C4 = V4GetX(cosCoefficients1);
828 const FloatV C5 = V4GetY(cosCoefficients1);
829 const FloatV C6 = V4GetZ(cosCoefficients1);
830 const FloatV C7 = V4GetW(cosCoefficients1);
831 const FloatV C8 = V4GetX(cosCoefficients2);
832 const FloatV C9 = V4GetY(cosCoefficients2);
833 const FloatV C10 = V4GetZ(cosCoefficients2);
834 const FloatV C11 = V4GetW(cosCoefficients2);
837 Result = FScaleAdd(C1, V2, V4One());
838 Result = FScaleAdd(C2, V4, Result);
839 Result = FScaleAdd(C3, V6, Result);
840 Result = FScaleAdd(C4, V8, Result);
841 Result = FScaleAdd(C5, V10, Result);
842 Result = FScaleAdd(C6, V12, Result);
843 Result = FScaleAdd(C7, V14, Result);
844 Result = FScaleAdd(C8, V16, Result);
845 Result = FScaleAdd(C9, V18, Result);
846 Result = FScaleAdd(C10, V20, Result);
847 Result = FScaleAdd(C11, V22, Result);
852PX_FORCE_INLINE PxU32 FOutOfBounds(
const FloatV a,
const FloatV min,
const FloatV max)
854 ASSERT_ISVALIDFLOATV(a);
855 ASSERT_ISVALIDFLOATV(min);
856 ASSERT_ISVALIDFLOATV(max);
857 const BoolV c = BOr(FIsGrtr(a, max), FIsGrtr(min, a));
858 return PxU32(!BAllEqFFFF(c));
861PX_FORCE_INLINE PxU32 FInBounds(
const FloatV a,
const FloatV min,
const FloatV max)
863 ASSERT_ISVALIDFLOATV(a);
864 ASSERT_ISVALIDFLOATV(min);
865 ASSERT_ISVALIDFLOATV(max);
866 const BoolV c = BAnd(FIsGrtrOrEq(a, min), FIsGrtrOrEq(max, a));
867 return BAllEqTTTT(c);
872 ASSERT_ISVALIDFLOATV(a);
873 ASSERT_ISVALIDFLOATV(bounds);
874 return FOutOfBounds(a, FNeg(bounds), bounds);
879 ASSERT_ISVALIDFLOATV(a);
880 ASSERT_ISVALIDFLOATV(bounds);
881 return FInBounds(a, FNeg(bounds), bounds);
890 ASSERT_ISVALIDFLOATV(f);
891 const __m128
zero = V3Zero();
892 const __m128 fff0 = _mm_move_ss(f, zero);
893 return _mm_shuffle_ps(fff0, fff0, _MM_SHUFFLE(0, 1, 2, 3));
896PX_FORCE_INLINE Vec3V V3Merge(
const FloatVArg x,
const FloatVArg y,
const FloatVArg z)
898 ASSERT_ISVALIDFLOATV(x);
899 ASSERT_ISVALIDFLOATV(y);
900 ASSERT_ISVALIDFLOATV(z);
902 const __m128
zero = V3Zero();
903 const __m128 xy = _mm_move_ss(x, y);
904 const __m128 z0 = _mm_move_ss(zero, z);
906 return _mm_shuffle_ps(xy, z0, _MM_SHUFFLE(1, 0, 0, 1));
911 const PX_ALIGN(16, PxF32 x[4]) = { 1.0f, 0.0f, 0.0f, 0.0f };
912 const __m128 x128 = _mm_load_ps(x);
918 const PX_ALIGN(16, PxF32 y[4]) = { 0.0f, 1.0f, 0.0f, 0.0f };
919 const __m128 y128 = _mm_load_ps(y);
925 const PX_ALIGN(16, PxF32 z[4]) = { 0.0f, 0.0f, 1.0f, 0.0f };
926 const __m128 z128 = _mm_load_ps(z);
932 ASSERT_ISVALIDVEC3V(f);
933 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
938 ASSERT_ISVALIDVEC3V(f);
939 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
944 ASSERT_ISVALIDVEC3V(f);
945 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
950 ASSERT_ISVALIDVEC3V(v);
951 ASSERT_ISVALIDFLOATV(f);
952 return V4Sel(BFTTT(), v, f);
957 ASSERT_ISVALIDVEC3V(v);
958 ASSERT_ISVALIDFLOATV(f);
959 return V4Sel(BTFTT(), v, f);
964 ASSERT_ISVALIDVEC3V(v);
965 ASSERT_ISVALIDFLOATV(f);
966 return V4Sel(BTTFT(), v, f);
969PX_FORCE_INLINE Vec3V V3ColX(
const Vec3V a,
const Vec3V b,
const Vec3V c)
971 ASSERT_ISVALIDVEC3V(a);
972 ASSERT_ISVALIDVEC3V(b);
973 ASSERT_ISVALIDVEC3V(c);
974 Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 0, 3, 0));
975 return V3SetY(r, V3GetX(b));
978PX_FORCE_INLINE Vec3V V3ColY(
const Vec3V a,
const Vec3V b,
const Vec3V c)
980 ASSERT_ISVALIDVEC3V(a);
981 ASSERT_ISVALIDVEC3V(b);
982 ASSERT_ISVALIDVEC3V(c);
983 Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 1, 3, 1));
984 return V3SetY(r, V3GetY(b));
987PX_FORCE_INLINE Vec3V V3ColZ(
const Vec3V a,
const Vec3V b,
const Vec3V c)
989 ASSERT_ISVALIDVEC3V(a);
990 ASSERT_ISVALIDVEC3V(b);
991 ASSERT_ISVALIDVEC3V(c);
992 Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 2, 3, 2));
993 return V3SetY(r, V3GetZ(b));
998 return _mm_setzero_ps();
1003 return V3Load(1.0f);
1008 return V3Load(PX_EPS_REAL);
1013 ASSERT_ISVALIDVEC3V(f);
1014 return _mm_sub_ps(_mm_setzero_ps(), f);
1019 ASSERT_ISVALIDVEC3V(a);
1020 ASSERT_ISVALIDVEC3V(b);
1021 return _mm_add_ps(a, b);
1026 ASSERT_ISVALIDVEC3V(a);
1027 ASSERT_ISVALIDVEC3V(b);
1028 return _mm_sub_ps(a, b);
1033 ASSERT_ISVALIDVEC3V(a);
1034 ASSERT_ISVALIDFLOATV(b);
1035 return _mm_mul_ps(a, b);
1040 ASSERT_ISVALIDVEC3V(a);
1041 ASSERT_ISVALIDVEC3V(b);
1042 return _mm_mul_ps(a, b);
1047 ASSERT_ISVALIDVEC3V(a);
1048 ASSERT_ISVALIDFLOATV(b);
1049 return _mm_div_ps(a, b);
1054 ASSERT_ISVALIDVEC3V(a);
1055 ASSERT_ISVALIDVEC3V(b);
1056 return V4ClearW(_mm_div_ps(a, b));
1061 ASSERT_ISVALIDVEC3V(a);
1062 ASSERT_ISVALIDFLOATV(b);
1063 return _mm_mul_ps(a, _mm_rcp_ps(b));
1068 ASSERT_ISVALIDVEC3V(a);
1069 ASSERT_ISVALIDVEC3V(b);
1070 return V4ClearW(_mm_mul_ps(a, _mm_rcp_ps(b)));
1075 ASSERT_ISVALIDVEC3V(a);
1076 const __m128
zero = V3Zero();
1077 const __m128 tttf = BTTTF();
1078 const __m128 recipA = _mm_div_ps(V3One(), a);
1079 return V4Sel(tttf, recipA, zero);
1084 ASSERT_ISVALIDVEC3V(a);
1085 const __m128
zero = V3Zero();
1086 const __m128 tttf = BTTTF();
1087 const __m128 recipA = _mm_rcp_ps(a);
1088 return V4Sel(tttf, recipA, zero);
1093 ASSERT_ISVALIDVEC3V(a);
1094 const __m128
zero = V3Zero();
1095 const __m128 tttf = BTTTF();
1096 const __m128 recipA = _mm_div_ps(V3One(), _mm_sqrt_ps(a));
1097 return V4Sel(tttf, recipA, zero);
1102 ASSERT_ISVALIDVEC3V(a);
1103 const __m128
zero = V3Zero();
1104 const __m128 tttf = BTTTF();
1105 const __m128 recipA = _mm_rsqrt_ps(a);
1106 return V4Sel(tttf, recipA, zero);
1109PX_FORCE_INLINE Vec3V V3ScaleAdd(
const Vec3V a,
const FloatV b,
const Vec3V c)
1111 ASSERT_ISVALIDVEC3V(a);
1112 ASSERT_ISVALIDFLOATV(b);
1113 ASSERT_ISVALIDVEC3V(c);
1114 return V3Add(V3Scale(a, b), c);
1117PX_FORCE_INLINE Vec3V V3NegScaleSub(
const Vec3V a,
const FloatV b,
const Vec3V c)
1119 ASSERT_ISVALIDVEC3V(a);
1120 ASSERT_ISVALIDFLOATV(b);
1121 ASSERT_ISVALIDVEC3V(c);
1122 return V3Sub(c, V3Scale(a, b));
1125PX_FORCE_INLINE Vec3V V3MulAdd(
const Vec3V a,
const Vec3V b,
const Vec3V c)
1127 ASSERT_ISVALIDVEC3V(a);
1128 ASSERT_ISVALIDVEC3V(b);
1129 ASSERT_ISVALIDVEC3V(c);
1130 return V3Add(V3Mul(a, b), c);
1133PX_FORCE_INLINE Vec3V V3NegMulSub(
const Vec3V a,
const Vec3V b,
const Vec3V c)
1135 ASSERT_ISVALIDVEC3V(a);
1136 ASSERT_ISVALIDVEC3V(b);
1137 ASSERT_ISVALIDVEC3V(c);
1138 return V3Sub(c, V3Mul(a, b));
1143 ASSERT_ISVALIDVEC3V(a);
1144 return V3Max(a, V3Neg(a));
1149 ASSERT_ISVALIDVEC3V(a);
1150 ASSERT_ISVALIDVEC3V(b);
1152 const __m128 t0 = _mm_mul_ps(a, b);
1153 const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1,0,3,2));
1154 const __m128 t2 = _mm_add_ps(t0, t1);
1155 const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2,3,0,1));
1156 return _mm_add_ps(t3, t2);
1164 ASSERT_ISVALIDVEC3V(a);
1165 ASSERT_ISVALIDVEC3V(b);
1176 const __m128 b0 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3,0,2,1));
1177 const __m128 a1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3,0,2,1));
1178 __m128 v = _mm_mul_ps(a1, b);
1179 v = _mm_sub_ps(_mm_mul_ps(a, b0), v);
1180 __m128 res = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3,0,2,1));
1181 ASSERT_ISVALIDVEC3V(res);
1188 ASSERT_ISVALIDVEC3V(a);
1190 v.mR1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
1191 v.mL1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1197 ASSERT_ISVALIDVEC3V(b);
1198 const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1));
1199 const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2));
1200 return _mm_sub_ps(_mm_mul_ps(a.mL1, l2), _mm_mul_ps(a.mR1, r2));
1205 ASSERT_ISVALIDVEC3V(a);
1206 const __m128 r2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1207 const __m128 l2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
1208 return _mm_sub_ps(_mm_mul_ps(b.mR1, r2), _mm_mul_ps(b.mL1, l2));
1213 return _mm_sub_ps(_mm_mul_ps(a.mL1, b.mR1), _mm_mul_ps(a.mR1, b.mL1));
1218 ASSERT_ISVALIDVEC3V(a);
1219 return _mm_sqrt_ps(V3Dot(a, a));
1224 ASSERT_ISVALIDVEC3V(a);
1230 ASSERT_ISVALIDVEC3V(a);
1231 ASSERT_ISFINITELENGTH(a);
1232 return V3ScaleInv(a, _mm_sqrt_ps(V3Dot(a, a)));
1237 ASSERT_ISVALIDVEC3V(a);
1238 ASSERT_ISFINITELENGTH(a);
1239 return V3Scale(a, _mm_rsqrt_ps(V3Dot(a, a)));
1242PX_FORCE_INLINE Vec3V V3NormalizeSafe(
const Vec3V a,
const Vec3V unsafeReturnValue)
1244 ASSERT_ISVALIDVEC3V(a);
1245 const __m128 eps = FEps();
1246 const __m128 length = V3Length(a);
1247 const __m128 isGreaterThanZero = FIsGrtr(length, eps);
1248 return V3Sel(isGreaterThanZero, V3ScaleInv(a, length), unsafeReturnValue);
1251PX_FORCE_INLINE Vec3V V3Sel(
const BoolV c,
const Vec3V a,
const Vec3V b)
1253 ASSERT_ISVALIDVEC3V(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)));
1254 return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
1259 ASSERT_ISVALIDVEC3V(a);
1260 ASSERT_ISVALIDVEC3V(b);
1261 return _mm_cmpgt_ps(a, b);
1266 ASSERT_ISVALIDVEC3V(a);
1267 ASSERT_ISVALIDVEC3V(b);
1268 return _mm_cmpge_ps(a, b);
1273 ASSERT_ISVALIDVEC3V(a);
1274 ASSERT_ISVALIDVEC3V(b);
1275 return _mm_cmpeq_ps(a, b);
1280 ASSERT_ISVALIDVEC3V(a);
1281 ASSERT_ISVALIDVEC3V(b);
1282 return _mm_max_ps(a, b);
1287 ASSERT_ISVALIDVEC3V(a);
1288 ASSERT_ISVALIDVEC3V(b);
1289 return _mm_min_ps(a, b);
1294 ASSERT_ISVALIDVEC3V(a);
1295 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
1296 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
1297 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
1298 return _mm_max_ps(_mm_max_ps(shuf1, shuf2), shuf3);
1303 ASSERT_ISVALIDVEC3V(a);
1304 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
1305 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
1306 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
1307 return _mm_min_ps(_mm_min_ps(shuf1, shuf2), shuf3);
1325 ASSERT_ISVALIDVEC3V(a);
1326 const __m128
zero = V3Zero();
1327 const __m128 one = V3One();
1328 const __m128 none = V3Neg(one);
1329 return V3Sel(V3IsGrtrOrEq(a, zero), one, none);
1332PX_FORCE_INLINE Vec3V V3Clamp(
const Vec3V a,
const Vec3V minV,
const Vec3V maxV)
1334 ASSERT_ISVALIDVEC3V(a);
1335 ASSERT_ISVALIDVEC3V(minV);
1336 ASSERT_ISVALIDVEC3V(maxV);
1337 return V3Max(V3Min(a, maxV), minV);
1342 ASSERT_ISVALIDVEC3V(a);
1343 ASSERT_ISVALIDVEC3V(b);
1344 return internalWindowsSimd::BAllTrue3_R(V4IsGrtr(a, b));
1349 ASSERT_ISVALIDVEC3V(a);
1350 ASSERT_ISVALIDVEC3V(b);
1351 return internalWindowsSimd::BAllTrue3_R(V4IsGrtrOrEq(a, b));
1356 ASSERT_ISVALIDVEC3V(a);
1357 ASSERT_ISVALIDVEC3V(b);
1358 return internalWindowsSimd::BAllTrue3_R(V4IsEq(a, b));
1363 ASSERT_ISVALIDVEC3V(a);
1366 const Vec3V half = V3Load(0.5f);
1367 const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31));
1368 const Vec3V aRound = V3Sub(V3Add(a, half), signBit);
1369 __m128i tmp = _mm_cvttps_epi32(aRound);
1370 return _mm_cvtepi32_ps(tmp);
1375 ASSERT_ISVALIDVEC3V(a);
1378 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
1379 const Vec4V twoPi = V4LoadA(g_PXTwoPi.f);
1380 const Vec3V tmp = V3Scale(a, recipTwoPi);
1381 const Vec3V b = V3Round(tmp);
1382 const Vec3V V1 = V3NegScaleSub(b, twoPi, a);
1386 const Vec3V V2 = V3Mul(V1, V1);
1387 const Vec3V V3 = V3Mul(V2, V1);
1388 const Vec3V V5 = V3Mul(V3, V2);
1389 const Vec3V V7 = V3Mul(V5, V2);
1390 const Vec3V V9 = V3Mul(V7, V2);
1391 const Vec3V V11 = V3Mul(V9, V2);
1392 const Vec3V V13 = V3Mul(V11, V2);
1393 const Vec3V V15 = V3Mul(V13, V2);
1394 const Vec3V V17 = V3Mul(V15, V2);
1395 const Vec3V V19 = V3Mul(V17, V2);
1396 const Vec3V V21 = V3Mul(V19, V2);
1397 const Vec3V V23 = V3Mul(V21, V2);
1399 const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f);
1400 const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f);
1401 const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f);
1403 const FloatV S1 = V4GetY(sinCoefficients0);
1404 const FloatV S2 = V4GetZ(sinCoefficients0);
1405 const FloatV S3 = V4GetW(sinCoefficients0);
1406 const FloatV S4 = V4GetX(sinCoefficients1);
1407 const FloatV S5 = V4GetY(sinCoefficients1);
1408 const FloatV S6 = V4GetZ(sinCoefficients1);
1409 const FloatV S7 = V4GetW(sinCoefficients1);
1410 const FloatV S8 = V4GetX(sinCoefficients2);
1411 const FloatV S9 = V4GetY(sinCoefficients2);
1412 const FloatV S10 = V4GetZ(sinCoefficients2);
1413 const FloatV S11 = V4GetW(sinCoefficients2);
1416 Result = V3ScaleAdd(V3, S1, V1);
1417 Result = V3ScaleAdd(V5, S2, Result);
1418 Result = V3ScaleAdd(V7, S3, Result);
1419 Result = V3ScaleAdd(V9, S4, Result);
1420 Result = V3ScaleAdd(V11, S5, Result);
1421 Result = V3ScaleAdd(V13, S6, Result);
1422 Result = V3ScaleAdd(V15, S7, Result);
1423 Result = V3ScaleAdd(V17, S8, Result);
1424 Result = V3ScaleAdd(V19, S9, Result);
1425 Result = V3ScaleAdd(V21, S10, Result);
1426 Result = V3ScaleAdd(V23, S11, Result);
1428 ASSERT_ISVALIDVEC3V(Result);
1434 ASSERT_ISVALIDVEC3V(a);
1437 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
1438 const Vec4V twoPi = V4LoadA(g_PXTwoPi.f);
1439 const Vec3V tmp = V3Scale(a, recipTwoPi);
1440 const Vec3V b = V3Round(tmp);
1441 const Vec3V V1 = V3NegScaleSub(b, twoPi, a);
1445 const Vec3V V2 = V3Mul(V1, V1);
1446 const Vec3V V4 = V3Mul(V2, V2);
1447 const Vec3V V6 = V3Mul(V4, V2);
1448 const Vec3V V8 = V3Mul(V4, V4);
1449 const Vec3V V10 = V3Mul(V6, V4);
1450 const Vec3V V12 = V3Mul(V6, V6);
1451 const Vec3V V14 = V3Mul(V8, V6);
1452 const Vec3V V16 = V3Mul(V8, V8);
1453 const Vec3V V18 = V3Mul(V10, V8);
1454 const Vec3V V20 = V3Mul(V10, V10);
1455 const Vec3V V22 = V3Mul(V12, V10);
1457 const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f);
1458 const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f);
1459 const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f);
1461 const FloatV C1 = V4GetY(cosCoefficients0);
1462 const FloatV C2 = V4GetZ(cosCoefficients0);
1463 const FloatV C3 = V4GetW(cosCoefficients0);
1464 const FloatV C4 = V4GetX(cosCoefficients1);
1465 const FloatV C5 = V4GetY(cosCoefficients1);
1466 const FloatV C6 = V4GetZ(cosCoefficients1);
1467 const FloatV C7 = V4GetW(cosCoefficients1);
1468 const FloatV C8 = V4GetX(cosCoefficients2);
1469 const FloatV C9 = V4GetY(cosCoefficients2);
1470 const FloatV C10 = V4GetZ(cosCoefficients2);
1471 const FloatV C11 = V4GetW(cosCoefficients2);
1474 Result = V3ScaleAdd(V2, C1, V3One());
1475 Result = V3ScaleAdd(V4, C2, Result);
1476 Result = V3ScaleAdd(V6, C3, Result);
1477 Result = V3ScaleAdd(V8, C4, Result);
1478 Result = V3ScaleAdd(V10, C5, Result);
1479 Result = V3ScaleAdd(V12, C6, Result);
1480 Result = V3ScaleAdd(V14, C7, Result);
1481 Result = V3ScaleAdd(V16, C8, Result);
1482 Result = V3ScaleAdd(V18, C9, Result);
1483 Result = V3ScaleAdd(V20, C10, Result);
1484 Result = V3ScaleAdd(V22, C11, Result);
1486 ASSERT_ISVALIDVEC3V(Result);
1492 ASSERT_ISVALIDVEC3V(a);
1493 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 2, 1));
1498 ASSERT_ISVALIDVEC3V(a);
1499 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 1, 0));
1504 ASSERT_ISVALIDVEC3V(a);
1505 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1510 ASSERT_ISVALIDVEC3V(a);
1511 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
1516 ASSERT_ISVALIDVEC3V(a);
1517 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 2, 2));
1522 ASSERT_ISVALIDVEC3V(a);
1523 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 0, 1));
1526PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(
const Vec3V v0,
const Vec3V v1)
1528 ASSERT_ISVALIDVEC3V(v0);
1529 ASSERT_ISVALIDVEC3V(v1);
1530 return _mm_shuffle_ps(v1, v0, _MM_SHUFFLE(3, 1, 2, 3));
1533PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(
const Vec3V v0,
const Vec3V v1)
1535 ASSERT_ISVALIDVEC3V(v0);
1536 ASSERT_ISVALIDVEC3V(v1);
1537 return _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(3, 0, 3, 2));
1540PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(
const Vec3V v0,
const Vec3V v1)
1542 ASSERT_ISVALIDVEC3V(v0);
1543 ASSERT_ISVALIDVEC3V(v1);
1545 Vec3V v2 = V3Zero();
1546 FloatV y1 = V3GetY(v1);
1547 FloatV x0 = V3GetX(v0);
1548 v2 = V3SetX(v2, y1);
1549 return V3SetY(v2, x0);
1554 ASSERT_ISVALIDVEC3V(a);
1555 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
1556 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
1557 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
1558 return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3);
1561PX_FORCE_INLINE PxU32 V3OutOfBounds(
const Vec3V a,
const Vec3V min,
const Vec3V max)
1563 ASSERT_ISVALIDVEC3V(a);
1564 ASSERT_ISVALIDVEC3V(min);
1565 ASSERT_ISVALIDVEC3V(max);
1566 const BoolV c = BOr(V3IsGrtr(a, max), V3IsGrtr(min, a));
1567 return PxU32(!BAllEqFFFF(c));
1570PX_FORCE_INLINE PxU32 V3InBounds(
const Vec3V a,
const Vec3V min,
const Vec3V max)
1572 ASSERT_ISVALIDVEC3V(a);
1573 ASSERT_ISVALIDVEC3V(min);
1574 ASSERT_ISVALIDVEC3V(max);
1575 const BoolV c = BAnd(V3IsGrtrOrEq(a, min), V3IsGrtrOrEq(max, a));
1576 return BAllEqTTTT(c);
1581 ASSERT_ISVALIDVEC3V(a);
1582 ASSERT_ISVALIDVEC3V(bounds);
1583 return V3OutOfBounds(a, V3Neg(bounds), bounds);
1588 ASSERT_ISVALIDVEC3V(a);
1589 ASSERT_ISVALIDVEC3V(bounds);
1590 return V3InBounds(a, V3Neg(bounds), bounds);
1593PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2)
1595 ASSERT_ISVALIDVEC3V(col0);
1596 ASSERT_ISVALIDVEC3V(col1);
1597 ASSERT_ISVALIDVEC3V(col2);
1598 const Vec3V col3 = _mm_setzero_ps();
1599 Vec3V tmp0 = _mm_unpacklo_ps(col0, col1);
1600 Vec3V tmp2 = _mm_unpacklo_ps(col2, col3);
1601 Vec3V tmp1 = _mm_unpackhi_ps(col0, col1);
1602 Vec3V tmp3 = _mm_unpackhi_ps(col2, col3);
1603 col0 = _mm_movelh_ps(tmp0, tmp2);
1604 col1 = _mm_movehl_ps(tmp2, tmp0);
1605 col2 = _mm_movelh_ps(tmp1, tmp3);
1614 ASSERT_ISVALIDFLOATV(f);
1621 ASSERT_ISVALIDFLOATV(floatVArray[0]);
1622 ASSERT_ISVALIDFLOATV(floatVArray[1]);
1623 ASSERT_ISVALIDFLOATV(floatVArray[2]);
1624 ASSERT_ISVALIDFLOATV(floatVArray[3]);
1625 const __m128 xw = _mm_move_ss(floatVArray[1], floatVArray[0]);
1626 const __m128 yz = _mm_move_ss(floatVArray[2], floatVArray[3]);
1627 return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0));
1630PX_FORCE_INLINE Vec4V V4Merge(
const FloatVArg x,
const FloatVArg y,
const FloatVArg z,
const FloatVArg w)
1632 ASSERT_ISVALIDFLOATV(x);
1633 ASSERT_ISVALIDFLOATV(y);
1634 ASSERT_ISVALIDFLOATV(z);
1635 ASSERT_ISVALIDFLOATV(w);
1636 const __m128 xw = _mm_move_ss(y, x);
1637 const __m128 yz = _mm_move_ss(z, w);
1638 return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0));
1641PX_FORCE_INLINE Vec4V V4MergeW(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1643 const Vec4V xz = _mm_unpackhi_ps(x, z);
1644 const Vec4V yw = _mm_unpackhi_ps(y, w);
1645 return _mm_unpackhi_ps(xz, yw);
1648PX_FORCE_INLINE Vec4V V4MergeZ(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1650 const Vec4V xz = _mm_unpackhi_ps(x, z);
1651 const Vec4V yw = _mm_unpackhi_ps(y, w);
1652 return _mm_unpacklo_ps(xz, yw);
1655PX_FORCE_INLINE Vec4V V4MergeY(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1657 const Vec4V xz = _mm_unpacklo_ps(x, z);
1658 const Vec4V yw = _mm_unpacklo_ps(y, w);
1659 return _mm_unpackhi_ps(xz, yw);
1662PX_FORCE_INLINE Vec4V V4MergeX(
const Vec4VArg x,
const Vec4VArg y,
const Vec4VArg z,
const Vec4VArg w)
1664 const Vec4V xz = _mm_unpacklo_ps(x, z);
1665 const Vec4V yw = _mm_unpacklo_ps(y, w);
1666 return _mm_unpacklo_ps(xz, yw);
1671 return _mm_unpacklo_ps(a, b);
1676 return _mm_unpackhi_ps(a, b);
1681 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 0, 1));
1686 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 0, 2, 0));
1691 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 3, 1));
1696 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
1701 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
1704template <PxU8 x, PxU8 y, PxU8 z, PxU8 w>
1707 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(w, z, y, x));
1712 const PX_ALIGN(16, PxF32 w[4]) = { 0.0f, 0.0f, 0.0f, 1.0f };
1713 const __m128 w128 = _mm_load_ps(w);
1719 const PX_ALIGN(16, PxF32 x[4]) = { 1.0f, 0.0f, 0.0f, 0.0f };
1720 const __m128 x128 = _mm_load_ps(x);
1726 const PX_ALIGN(16, PxF32 y[4]) = { 0.0f, 1.0f, 0.0f, 0.0f };
1727 const __m128 y128 = _mm_load_ps(y);
1733 const PX_ALIGN(16, PxF32 z[4]) = { 0.0f, 0.0f, 1.0f, 0.0f };
1734 const __m128 z128 = _mm_load_ps(z);
1740 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
1745 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
1750 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
1755 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
1760 ASSERT_ISVALIDFLOATV(f);
1761 return V4Sel(BTTTF(), v, f);
1766 return _mm_and_ps(v, (VecI32V&)internalWindowsSimd::gMaskXYZ);
1771 ASSERT_ISVALIDFLOATV(f);
1772 return V4Sel(BFTTT(), v, f);
1777 ASSERT_ISVALIDFLOATV(f);
1778 return V4Sel(BTFTT(), v, f);
1783 ASSERT_ISVALIDFLOATV(f);
1784 return V4Sel(BTTFT(), v, f);
1789 return _mm_setzero_ps();
1794 return V4Load(1.0f);
1799 return V4Load(PX_EPS_REAL);
1804 return _mm_sub_ps(_mm_setzero_ps(), f);
1809 return _mm_add_ps(a, b);
1814 return _mm_sub_ps(a, b);
1819 return _mm_mul_ps(a, b);
1824 return _mm_mul_ps(a, b);
1829 ASSERT_ISVALIDFLOATV(b);
1830 return _mm_div_ps(a, b);
1835 return _mm_div_ps(a, b);
1840 ASSERT_ISVALIDFLOATV(b);
1841 return _mm_mul_ps(a, _mm_rcp_ps(b));
1846 return _mm_mul_ps(a, _mm_rcp_ps(b));
1851 return _mm_div_ps(V4One(), a);
1856 return _mm_rcp_ps(a);
1861 return _mm_div_ps(V4One(), _mm_sqrt_ps(a));
1866 return _mm_rsqrt_ps(a);
1871 return _mm_sqrt_ps(a);
1874PX_FORCE_INLINE Vec4V V4ScaleAdd(
const Vec4V a,
const FloatV b,
const Vec4V c)
1876 ASSERT_ISVALIDFLOATV(b);
1877 return V4Add(V4Scale(a, b), c);
1880PX_FORCE_INLINE Vec4V V4NegScaleSub(
const Vec4V a,
const FloatV b,
const Vec4V c)
1882 ASSERT_ISVALIDFLOATV(b);
1883 return V4Sub(c, V4Scale(a, b));
1886PX_FORCE_INLINE Vec4V V4MulAdd(
const Vec4V a,
const Vec4V b,
const Vec4V c)
1888 return V4Add(V4Mul(a, b), c);
1891PX_FORCE_INLINE Vec4V V4NegMulSub(
const Vec4V a,
const Vec4V b,
const Vec4V c)
1893 return V4Sub(c, V4Mul(a, b));
1898 return V4Max(a, V4Neg(a));
1903 const Vec4V xy = V4UnpackXY(a, a);
1904 const Vec4V zw = V4UnpackZW(a, a);
1905 const Vec4V xz_yw = V4Add(xy, zw);
1906 const FloatV xz = V4GetX(xz_yw);
1907 const FloatV yw = V4GetZ(xz_yw);
1908 return FAdd(xz, yw);
1921 const __m128 t0 = _mm_mul_ps(a, b);
1923 const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1,0,3,2));
1925 const __m128 t2 = _mm_add_ps(t0, t1);
1927 const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2,3,0,1));
1929 return _mm_add_ps(t3, t2);
1937 const __m128 dot1 = _mm_mul_ps(a, b);
1938 const __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 0, 0, 0));
1939 const __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 1, 1, 1));
1940 const __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 2, 2, 2));
1941 return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3);
1956 const __m128 b0 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3,0,2,1));
1957 const __m128 a1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3,0,2,1));
1958 __m128 v = _mm_mul_ps(a1, b);
1959 v = _mm_sub_ps(_mm_mul_ps(a, b0), v);
1960 return _mm_shuffle_ps(v, v, _MM_SHUFFLE(3,0,2,1));
1966 return _mm_sqrt_ps(V4Dot(a, a));
1976 ASSERT_ISFINITELENGTH(a);
1977 return V4ScaleInv(a, _mm_sqrt_ps(V4Dot(a, a)));
1982 ASSERT_ISFINITELENGTH(a);
1983 return V4ScaleInvFast(a, _mm_sqrt_ps(V4Dot(a, a)));
1986PX_FORCE_INLINE Vec4V V4NormalizeSafe(
const Vec4V a,
const Vec4V unsafeReturnValue)
1988 const __m128 eps = V3Eps();
1989 const __m128 length = V4Length(a);
1990 const __m128 isGreaterThanZero = V4IsGrtr(length, eps);
1991 return V4Sel(isGreaterThanZero, V4ScaleInv(a, length), unsafeReturnValue);
1994PX_FORCE_INLINE Vec4V V4Sel(
const BoolV c,
const Vec4V a,
const Vec4V b)
1996 return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
2001 return _mm_cmpgt_ps(a, b);
2006 return _mm_cmpge_ps(a, b);
2011 return _mm_cmpeq_ps(a, b);
2016 return internalWindowsSimd::m128_I2F(
2017 _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2022 return _mm_max_ps(a, b);
2027 return _mm_min_ps(a, b);
2032 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3));
2033 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
2034 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1));
2036 return _mm_max_ps(_mm_max_ps(a, shuf1), _mm_max_ps(shuf2, shuf3));
2041 const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3));
2042 const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
2043 const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1));
2045 return _mm_min_ps(_mm_min_ps(a, shuf1), _mm_min_ps(shuf2, shuf3));
2048PX_FORCE_INLINE Vec4V V4Clamp(
const Vec4V a,
const Vec4V minV,
const Vec4V maxV)
2050 return V4Max(V4Min(a, maxV), minV);
2055 return internalWindowsSimd::BAllTrue4_R(V4IsGrtr(a, b));
2060 return internalWindowsSimd::BAllTrue4_R(V4IsGrtrOrEq(a, b));
2065 return internalWindowsSimd::BAllTrue3_R(V4IsGrtrOrEq(a, b));
2070 return internalWindowsSimd::BAllTrue4_R(V4IsEq(a, b));
2075 return internalWindowsSimd::BAnyTrue3_R(V4IsGrtr(a, b));
2081 const Vec4V half = V4Load(0.5f);
2082 const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31));
2083 const Vec4V aRound = V4Sub(V4Add(a, half), signBit);
2084 const __m128i tmp = _mm_cvttps_epi32(aRound);
2085 return _mm_cvtepi32_ps(tmp);
2090 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
2091 const Vec4V twoPi = V4LoadA(g_PXTwoPi.f);
2092 const Vec4V tmp = V4Mul(a, recipTwoPi);
2093 const Vec4V b = V4Round(tmp);
2094 const Vec4V V1 = V4NegMulSub(twoPi, b, a);
2098 const Vec4V V2 = V4Mul(V1, V1);
2099 const Vec4V V3 = V4Mul(V2, V1);
2100 const Vec4V V5 = V4Mul(V3, V2);
2101 const Vec4V V7 = V4Mul(V5, V2);
2102 const Vec4V V9 = V4Mul(V7, V2);
2103 const Vec4V V11 = V4Mul(V9, V2);
2104 const Vec4V V13 = V4Mul(V11, V2);
2105 const Vec4V V15 = V4Mul(V13, V2);
2106 const Vec4V V17 = V4Mul(V15, V2);
2107 const Vec4V V19 = V4Mul(V17, V2);
2108 const Vec4V V21 = V4Mul(V19, V2);
2109 const Vec4V V23 = V4Mul(V21, V2);
2111 const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f);
2112 const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f);
2113 const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f);
2115 const FloatV S1 = V4GetY(sinCoefficients0);
2116 const FloatV S2 = V4GetZ(sinCoefficients0);
2117 const FloatV S3 = V4GetW(sinCoefficients0);
2118 const FloatV S4 = V4GetX(sinCoefficients1);
2119 const FloatV S5 = V4GetY(sinCoefficients1);
2120 const FloatV S6 = V4GetZ(sinCoefficients1);
2121 const FloatV S7 = V4GetW(sinCoefficients1);
2122 const FloatV S8 = V4GetX(sinCoefficients2);
2123 const FloatV S9 = V4GetY(sinCoefficients2);
2124 const FloatV S10 = V4GetZ(sinCoefficients2);
2125 const FloatV S11 = V4GetW(sinCoefficients2);
2128 Result = V4MulAdd(S1, V3, V1);
2129 Result = V4MulAdd(S2, V5, Result);
2130 Result = V4MulAdd(S3, V7, Result);
2131 Result = V4MulAdd(S4, V9, Result);
2132 Result = V4MulAdd(S5, V11, Result);
2133 Result = V4MulAdd(S6, V13, Result);
2134 Result = V4MulAdd(S7, V15, Result);
2135 Result = V4MulAdd(S8, V17, Result);
2136 Result = V4MulAdd(S9, V19, Result);
2137 Result = V4MulAdd(S10, V21, Result);
2138 Result = V4MulAdd(S11, V23, Result);
2145 const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f);
2146 const FloatV twoPi = V4LoadA(g_PXTwoPi.f);
2147 const Vec4V tmp = V4Mul(a, recipTwoPi);
2148 const Vec4V b = V4Round(tmp);
2149 const Vec4V V1 = V4NegMulSub(twoPi, b, a);
2153 const Vec4V V2 = V4Mul(V1, V1);
2154 const Vec4V V4 = V4Mul(V2, V2);
2155 const Vec4V V6 = V4Mul(V4, V2);
2156 const Vec4V V8 = V4Mul(V4, V4);
2157 const Vec4V V10 = V4Mul(V6, V4);
2158 const Vec4V V12 = V4Mul(V6, V6);
2159 const Vec4V V14 = V4Mul(V8, V6);
2160 const Vec4V V16 = V4Mul(V8, V8);
2161 const Vec4V V18 = V4Mul(V10, V8);
2162 const Vec4V V20 = V4Mul(V10, V10);
2163 const Vec4V V22 = V4Mul(V12, V10);
2165 const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f);
2166 const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f);
2167 const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f);
2169 const FloatV C1 = V4GetY(cosCoefficients0);
2170 const FloatV C2 = V4GetZ(cosCoefficients0);
2171 const FloatV C3 = V4GetW(cosCoefficients0);
2172 const FloatV C4 = V4GetX(cosCoefficients1);
2173 const FloatV C5 = V4GetY(cosCoefficients1);
2174 const FloatV C6 = V4GetZ(cosCoefficients1);
2175 const FloatV C7 = V4GetW(cosCoefficients1);
2176 const FloatV C8 = V4GetX(cosCoefficients2);
2177 const FloatV C9 = V4GetY(cosCoefficients2);
2178 const FloatV C10 = V4GetZ(cosCoefficients2);
2179 const FloatV C11 = V4GetW(cosCoefficients2);
2182 Result = V4MulAdd(C1, V2, V4One());
2183 Result = V4MulAdd(C2, V4, Result);
2184 Result = V4MulAdd(C3, V6, Result);
2185 Result = V4MulAdd(C4, V8, Result);
2186 Result = V4MulAdd(C5, V10, Result);
2187 Result = V4MulAdd(C6, V12, Result);
2188 Result = V4MulAdd(C7, V14, Result);
2189 Result = V4MulAdd(C8, V16, Result);
2190 Result = V4MulAdd(C9, V18, Result);
2191 Result = V4MulAdd(C10, V20, Result);
2192 Result = V4MulAdd(C11, V22, Result);
2197PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3)
2199 Vec4V tmp0 = _mm_unpacklo_ps(col0, col1);
2200 Vec4V tmp2 = _mm_unpacklo_ps(col2, col3);
2201 Vec4V tmp1 = _mm_unpackhi_ps(col0, col1);
2202 Vec4V tmp3 = _mm_unpackhi_ps(col2, col3);
2203 col0 = _mm_movelh_ps(tmp0, tmp2);
2204 col1 = _mm_movehl_ps(tmp2, tmp0);
2205 col2 = _mm_movelh_ps(tmp1, tmp3);
2206 col3 = _mm_movehl_ps(tmp3, tmp1);
2215 return _mm_setzero_ps();
2223 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, 0, 0));
2231 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, 0, 0));
2239 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, 0, 0));
2247 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, -1, 0));
2255 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, -1, 0));
2263 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, -1, 0));
2271 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, -1, 0));
2279 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, 0, -1));
2287 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, 0, -1));
2295 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, 0, -1));
2303 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, 0, -1));
2311 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, -1, -1));
2319 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, -1, -1));
2327 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, -1, -1));
2335 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, -1, -1));
2343 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, 0, -1));
2351 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, -1, 0));
2359 return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, 0, 0));
2367 return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, 0, 0));
2372 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
2377 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
2382 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
2387 return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
2392 return V4Sel(BFTTT(), v, f);
2397 return V4Sel(BTFTT(), v, f);
2402 return V4Sel(BTTFT(), v, f);
2407 return V4Sel(BTTTF(), v, f);
2411BoolV BSplatElement(BoolV a)
2413 return internalWindowsSimd::m128_I2F(
2414 _mm_shuffle_epi32(internalWindowsSimd::m128_F2I(a), _MM_SHUFFLE(index, index, index, index)));
2419 return _mm_and_ps(a, b);
2424 const BoolV bAllTrue(BTTTT());
2425 return _mm_xor_ps(a, bAllTrue);
2430 return _mm_andnot_ps(b, a);
2435 return _mm_or_ps(a, b);
2441 _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)));
2442 return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2443 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2449 _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)));
2450 return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2451 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2457 _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)));
2458 return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2459 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2465 _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)));
2466 return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
2467 _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
2472 const BoolV bTest = internalWindowsSimd::m128_I2F(
2473 _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2474 return internalWindowsSimd::BAllTrue4_R(bTest);
2479 return PxU32(_mm_movemask_ps(a)==15);
2484 return PxU32(_mm_movemask_ps(a)==0);
2489 return PxU32(_mm_movemask_ps(a));
2498 const FloatV x = V3GetX(b);
2499 const FloatV y = V3GetY(b);
2500 const FloatV z = V3GetZ(b);
2501 const Vec3V v0 = V3Scale(a.col0, x);
2502 const Vec3V v1 = V3Scale(a.col1, y);
2503 const Vec3V v2 = V3Scale(a.col2, z);
2504 const Vec3V v0PlusV1 = V3Add(v0, v1);
2505 return V3Add(v0PlusV1, v2);
2510 Vec3V v0 = V3Mul(a.col0, b);
2511 Vec3V v1 = V3Mul(a.col1, b);
2512 Vec3V v2 = V3Mul(a.col2, b);
2513 V3Transpose(v0, v1, v2);
2514 return V3Add(V3Add(v0, v1), v2);
2517PX_FORCE_INLINE Vec3V M33MulV3AddV3(
const Mat33V& A,
const Vec3V b,
const Vec3V c)
2519 const FloatV x = V3GetX(b);
2520 const FloatV y = V3GetY(b);
2521 const FloatV z = V3GetZ(b);
2522 Vec3V result = V3ScaleAdd(A.col0, x, c);
2523 result = V3ScaleAdd(A.col1, y, result);
2524 return V3ScaleAdd(A.col2, z, result);
2529 return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2));
2534 return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2));
2539 return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b));
2544 return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2));
2549 return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2));
2554 return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2));
2559 const BoolV tfft = BTFFT();
2560 const BoolV tttf = BTTTF();
2561 const FloatV
zero = V3Zero();
2562 const Vec3V cross01 = V3Cross(a.col0, a.col1);
2563 const Vec3V cross12 = V3Cross(a.col1, a.col2);
2564 const Vec3V cross20 = V3Cross(a.col2, a.col0);
2565 const FloatV dot = V3Dot(cross01, a.col2);
2566 const FloatV invDet = _mm_rcp_ps(dot);
2567 const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01);
2568 const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01);
2569 Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20);
2570 colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0));
2571 const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2));
2572 const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0));
2573 const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd));
2574 const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0));
2575 const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0));
2576 const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd));
2578 return Mat33V(_mm_mul_ps(colInv0, invDet), _mm_mul_ps(colInv1, invDet), _mm_mul_ps(colInv2, invDet));
2583 Vec3V col0 = a.col0, col1 = a.col1, col2 = a.col2;
2584 V3Transpose(col0, col1, col2);
2585 return Mat33V(col0, col1, col2);
2590 return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ());
2595 const FloatV x = V3Mul(V3UnitX(), d);
2596 const FloatV y = V3Mul(V3UnitY(), d);
2597 const FloatV z = V3Mul(V3UnitZ(), d);
2598 return Mat33V(x, y, z);
2607 const FloatV x = V3GetX(b);
2608 const FloatV y = V3GetY(b);
2609 const FloatV z = V3GetZ(b);
2610 const Vec3V v0 = V3Scale(a.col0, x);
2611 const Vec3V v1 = V3Scale(a.col1, y);
2612 const Vec3V v2 = V3Scale(a.col2, z);
2613 const Vec3V v0PlusV1 = V3Add(v0, v1);
2614 const Vec3V v0PlusV1Plusv2 = V3Add(v0PlusV1, v2);
2615 return V3Add(v0PlusV1Plusv2, a.col3);
2620 const FloatV x = V3GetX(b);
2621 const FloatV y = V3GetY(b);
2622 const FloatV z = V3GetZ(b);
2623 const Vec3V v0 = V3Scale(a.col0, x);
2624 const Vec3V v1 = V3Scale(a.col1, y);
2625 const Vec3V v2 = V3Scale(a.col2, z);
2626 const Vec3V v0PlusV1 = V3Add(v0, v1);
2627 return V3Add(v0PlusV1, v2);
2632 Vec3V v0 = V3Mul(a.col0, b);
2633 Vec3V v1 = V3Mul(a.col1, b);
2634 Vec3V v2 = V3Mul(a.col2, b);
2635 V3Transpose(v0, v1, v2);
2636 return V3Add(V3Add(v0, v1), v2);
2641 return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3));
2646 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
2651 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
2656 return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3));
2662 const BoolV tfft = BTFFT();
2663 const BoolV tttf = BTTTF();
2664 const FloatV
zero = V3Zero();
2665 const Vec3V cross01 = V3Cross(a.col0, a.col1);
2666 const Vec3V cross12 = V3Cross(a.col1, a.col2);
2667 const Vec3V cross20 = V3Cross(a.col2, a.col0);
2668 const FloatV dot = V3Dot(cross01, a.col2);
2669 const FloatV invDet = _mm_rcp_ps(dot);
2670 const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01);
2671 const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01);
2672 Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20);
2673 colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0));
2674 const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2));
2675 const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0));
2676 const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd));
2677 const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0));
2678 const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0));
2679 const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd));
2680 aInv.col0 = _mm_mul_ps(colInv0, invDet);
2681 aInv.col1 = _mm_mul_ps(colInv1, invDet);
2682 aInv.col2 = _mm_mul_ps(colInv2, invDet);
2683 aInv.col3 = M34Mul33V3(aInv, V3Neg(a.col3));
2689 Vec3V col0 = a.col0, col1 = a.col1, col2 = a.col2;
2690 V3Transpose(col0, col1, col2);
2691 return Mat33V(col0, col1, col2);
2700 const FloatV x = V4GetX(b);
2701 const FloatV y = V4GetY(b);
2702 const FloatV z = V4GetZ(b);
2703 const FloatV w = V4GetW(b);
2705 const Vec4V v0 = V4Scale(a.col0, x);
2706 const Vec4V v1 = V4Scale(a.col1, y);
2707 const Vec4V v2 = V4Scale(a.col2, z);
2708 const Vec4V v3 = V4Scale(a.col3, w);
2709 const Vec4V v0PlusV1 = V4Add(v0, v1);
2710 const Vec4V v0PlusV1Plusv2 = V4Add(v0PlusV1, v2);
2711 return V4Add(v0PlusV1Plusv2, v3);
2716 Vec4V v0 = V4Mul(a.col0, b);
2717 Vec4V v1 = V4Mul(a.col1, b);
2718 Vec4V v2 = V4Mul(a.col2, b);
2719 Vec4V v3 = V4Mul(a.col3, b);
2720 V4Transpose(v0, v1, v2, v3);
2721 return V4Add(V4Add(v0, v1), V4Add(v2, v3));
2726 return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3));
2731 return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3));
2736 Vec4V col0 = a.col0, col1 = a.col1, col2 = a.col2, col3 = a.col3;
2737 V4Transpose(col0, col1, col2, col3);
2738 return Mat44V(col0, col1, col2, col3);
2743 __m128 minor0, minor1, minor2, minor3;
2744 __m128 row0, row1, row2, row3;
2752 row1 = _mm_shuffle_ps(a.col1, a.col1, _MM_SHUFFLE(1, 0, 3, 2));
2754 row3 = _mm_shuffle_ps(a.col3, a.col3, _MM_SHUFFLE(1, 0, 3, 2));
2756 tmp1 = _mm_mul_ps(row2, row3);
2757 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2758 minor0 = _mm_mul_ps(row1, tmp1);
2759 minor1 = _mm_mul_ps(row0, tmp1);
2760 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2761 minor0 = _mm_sub_ps(_mm_mul_ps(row1, tmp1), minor0);
2762 minor1 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor1);
2763 minor1 = _mm_shuffle_ps(minor1, minor1, 0x4E);
2765 tmp1 = _mm_mul_ps(row1, row2);
2766 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2767 minor0 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor0);
2768 minor3 = _mm_mul_ps(row0, tmp1);
2769 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2770 minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row3, tmp1));
2771 minor3 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor3);
2772 minor3 = _mm_shuffle_ps(minor3, minor3, 0x4E);
2774 tmp1 = _mm_mul_ps(_mm_shuffle_ps(row1, row1, 0x4E), row3);
2775 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2776 row2 = _mm_shuffle_ps(row2, row2, 0x4E);
2777 minor0 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor0);
2778 minor2 = _mm_mul_ps(row0, tmp1);
2779 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2780 minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row2, tmp1));
2781 minor2 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor2);
2782 minor2 = _mm_shuffle_ps(minor2, minor2, 0x4E);
2784 tmp1 = _mm_mul_ps(row0, row1);
2785 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2786 minor2 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor2);
2787 minor3 = _mm_sub_ps(_mm_mul_ps(row2, tmp1), minor3);
2788 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2789 minor2 = _mm_sub_ps(_mm_mul_ps(row3, tmp1), minor2);
2790 minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row2, tmp1));
2792 tmp1 = _mm_mul_ps(row0, row3);
2793 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2794 minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row2, tmp1));
2795 minor2 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor2);
2796 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2797 minor1 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor1);
2798 minor2 = _mm_sub_ps(minor2, _mm_mul_ps(row1, tmp1));
2800 tmp1 = _mm_mul_ps(row0, row2);
2801 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
2802 minor1 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor1);
2803 minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row1, tmp1));
2804 tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
2805 minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row3, tmp1));
2806 minor3 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor3);
2808 det = _mm_mul_ps(row0, minor0);
2809 det = _mm_add_ps(_mm_shuffle_ps(det, det, 0x4E), det);
2810 det = _mm_add_ss(_mm_shuffle_ps(det, det, 0xB1), det);
2811 tmp1 = _mm_rcp_ss(det);
2813 det = _mm_sub_ss(_mm_add_ss(tmp1, tmp1), _mm_mul_ss(det, _mm_mul_ss(tmp1, tmp1)));
2814 det = _mm_shuffle_ps(det, det, 0x00);
2816 det = _mm_shuffle_ps(tmp1, tmp1, _MM_SHUFFLE(0, 0, 0, 0));
2819 minor0 = _mm_mul_ps(det, minor0);
2820 minor1 = _mm_mul_ps(det, minor1);
2821 minor2 = _mm_mul_ps(det, minor2);
2822 minor3 = _mm_mul_ps(det, minor3);
2823 Mat44V invTrans(minor0, minor1, minor2, minor3);
2824 return M44Trnsps(invTrans);
2827PX_FORCE_INLINE Vec4V V4LoadXYZW(
const PxF32& x,
const PxF32& y,
const PxF32& z,
const PxF32& w)
2829 return _mm_set_ps(w, z, y, x);
2832PX_FORCE_INLINE VecU32V V4U32Sel(
const BoolV c,
const VecU32V a,
const VecU32V b)
2834 return internalWindowsSimd::m128_I2F(
2835 _mm_or_si128(_mm_andnot_si128(internalWindowsSimd::m128_F2I(c), internalWindowsSimd::m128_F2I(b)),
2836 _mm_and_si128(internalWindowsSimd::m128_F2I(c), internalWindowsSimd::m128_F2I(a))));
2841 return internalWindowsSimd::m128_I2F(_mm_or_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2846 return internalWindowsSimd::m128_I2F(
2847 _mm_xor_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2852 return internalWindowsSimd::m128_I2F(
2853 _mm_and_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2858 return internalWindowsSimd::m128_I2F(
2859 _mm_andnot_si128(internalWindowsSimd::m128_F2I(b), internalWindowsSimd::m128_F2I(a)));
2864 return _mm_load1_ps((PxF32*)&i);
2869 return _mm_loadu_ps((PxF32*)i);
2874 ASSERT_ISALIGNED16(i);
2875 return _mm_load_ps((PxF32*)i);
2878PX_FORCE_INLINE VecI32V I4LoadXYZW(
const PxI32& x,
const PxI32& y,
const PxI32& z,
const PxI32& w)
2880 return internalWindowsSimd::m128_I2F(_mm_set_epi32(w, z, y, x));
2885 return _mm_load1_ps((PxF32*)&i);
2890 return _mm_loadu_ps((PxF32*)i);
2895 ASSERT_ISALIGNED16(i);
2896 return _mm_load_ps((PxF32*)i);
2899PX_FORCE_INLINE VecI32V VecI32V_Add(
const VecI32VArg a,
const VecI32VArg b)
2901 return internalWindowsSimd::m128_I2F(
2902 _mm_add_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2905PX_FORCE_INLINE VecI32V VecI32V_Sub(
const VecI32VArg a,
const VecI32VArg b)
2907 return internalWindowsSimd::m128_I2F(
2908 _mm_sub_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2911PX_FORCE_INLINE BoolV VecI32V_IsGrtr(
const VecI32VArg a,
const VecI32VArg b)
2913 return internalWindowsSimd::m128_I2F(
2914 _mm_cmpgt_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2917PX_FORCE_INLINE BoolV VecI32V_IsEq(
const VecI32VArg a,
const VecI32VArg b)
2919 return internalWindowsSimd::m128_I2F(
2920 _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
2923PX_FORCE_INLINE VecI32V V4I32Sel(
const BoolV c,
const VecI32V a,
const VecI32V b)
2925 return V4U32Sel(c, a, b);
2963PX_FORCE_INLINE VecI32V VecI32V_Sel(
const BoolV c,
const VecI32VArg a,
const VecI32VArg b)
2965 PX_ASSERT(vecMathTests::allElementsEqualBoolV(c, BTTTT()) ||
2966 vecMathTests::allElementsEqualBoolV(c, BFFFF()));
2967 return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
2972 VecShiftV preparedShift;
2973 preparedShift.shift = _mm_or_ps(_mm_andnot_ps(BTFFF(), VecI32V_Zero()), _mm_and_ps(BTFFF(), shift));
2974 return preparedShift;
2977PX_FORCE_INLINE VecI32V VecI32V_LeftShift(
const VecI32VArg a,
const VecShiftVArg count)
2979 return internalWindowsSimd::m128_I2F(
2980 _mm_sll_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(count.shift)));
2983PX_FORCE_INLINE VecI32V VecI32V_RightShift(
const VecI32VArg a,
const VecShiftVArg count)
2985 return internalWindowsSimd::m128_I2F(
2986 _mm_srl_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(count.shift)));
2989PX_FORCE_INLINE VecI32V VecI32V_LeftShift(
const VecI32VArg a,
const PxU32 count)
2991 return internalWindowsSimd::m128_I2F(
2992 _mm_slli_epi32(internalWindowsSimd::m128_F2I(a), count));
2995PX_FORCE_INLINE VecI32V VecI32V_RightShift(
const VecI32VArg a,
const PxU32 count)
2997 return internalWindowsSimd::m128_I2F(
2998 _mm_srai_epi32(internalWindowsSimd::m128_F2I(a), count));
3001PX_FORCE_INLINE VecI32V VecI32V_And(
const VecI32VArg a,
const VecI32VArg b)
3003 return internalWindowsSimd::m128_I2F(
3004 _mm_and_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
3007PX_FORCE_INLINE VecI32V VecI32V_Or(
const VecI32VArg a,
const VecI32VArg b)
3009 return internalWindowsSimd::m128_I2F(
3010 _mm_or_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
3015 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
3020 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
3025 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
3030 return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3));
3035 _mm_store_ss((PxF32*)i, a);
3048PX_FORCE_INLINE VecI32V VecI32V_Merge(
const VecI32VArg a,
const VecI32VArg b,
const VecI32VArg c,
const VecI32VArg d)
3050 const __m128 xw = _mm_move_ss(b, a);
3051 const __m128 yz = _mm_move_ss(c, d);
3052 return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0));
3062 VecU32V result32(a);
3063 result32 = V4U32Andc(result32, b);
3064 return Vec4V(result32);
3069 return V4IsGrtr(a, b);
3088 result.m128_u16[0] = PxU16((a).m128_u16[0] > (b).m128_u16[0]);
3089 result.m128_u16[1] = PxU16((a).m128_u16[1] > (b).m128_u16[1]);
3090 result.m128_u16[2] = PxU16((a).m128_u16[2] > (b).m128_u16[2]);
3091 result.m128_u16[3] = PxU16((a).m128_u16[3] > (b).m128_u16[3]);
3092 result.m128_u16[4] = PxU16((a).m128_u16[4] > (b).m128_u16[4]);
3093 result.m128_u16[5] = PxU16((a).m128_u16[5] > (b).m128_u16[5]);
3094 result.m128_u16[6] = PxU16((a).m128_u16[6] > (b).m128_u16[6]);
3095 result.m128_u16[7] = PxU16((a).m128_u16[7] > (b).m128_u16[7]);
3101 return internalWindowsSimd::m128_I2F(
3102 _mm_cmpgt_epi16(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b)));
3107 Vec4V result = V4LoadXYZW(PxF32(a.m128_u32[0]), PxF32(a.m128_u32[1]), PxF32(a.m128_u32[2]), PxF32(a.m128_u32[3]));
3113 return _mm_cvtepi32_ps(internalWindowsSimd::m128_F2I(a));
3118 return internalWindowsSimd::m128_I2F(_mm_cvttps_epi32(a));
3144 return internalWindowsSimd::m128_I2F(
3145 _mm_shuffle_epi32(internalWindowsSimd::m128_F2I(a), _MM_SHUFFLE(index, index, index, index)));
3151 return internalWindowsSimd::m128_I2F(
3152 _mm_shuffle_epi32(internalWindowsSimd::m128_F2I(a), _MM_SHUFFLE(index, index, index, index)));
3158 result.m128_u32[0] = x;
3159 result.m128_u32[1] = y;
3160 result.m128_u32[2] = z;
3161 result.m128_u32[3] = w;
3167 return _mm_cvtepi32_ps(internalWindowsSimd::m128_F2I(in));
#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
PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxIsFinite(float f)
returns true if the passed number is a finite floating point number as opposed to INF,...
Definition PxMath.h:326