28#ifndef OZZ_OZZ_BASE_MATHS_SIMD_MATH_H_
29#define OZZ_OZZ_BASE_MATHS_SIMD_MATH_H_
31#include "ozz/base/maths/internal/simd_math_config.h"
32#include "ozz/base/platform.h"
38OZZ_BASE_DLL
const char* SimdImplementationName();
40namespace simd_float4 {
42OZZ_INLINE SimdFloat4
zero();
45OZZ_INLINE SimdFloat4 one();
49OZZ_INLINE SimdFloat4 x_axis();
53OZZ_INLINE SimdFloat4 y_axis();
57OZZ_INLINE SimdFloat4 z_axis();
61OZZ_INLINE SimdFloat4 w_axis();
68OZZ_INLINE SimdFloat4 Load(
float _x,
float _y,
float _z,
float _w);
75OZZ_INLINE SimdFloat4 LoadX(
float _x);
82OZZ_INLINE SimdFloat4 Load1(
float _x);
90OZZ_INLINE SimdFloat4 LoadPtr(
const float* _f);
98OZZ_INLINE SimdFloat4 LoadPtrU(
const float* _f);
107OZZ_INLINE SimdFloat4 LoadXPtrU(
const float* _f);
115OZZ_INLINE SimdFloat4 Load1PtrU(
const float* _f);
124OZZ_INLINE SimdFloat4 Load2PtrU(
const float* _f);
133OZZ_INLINE SimdFloat4 Load3PtrU(
const float* _f);
136OZZ_INLINE SimdFloat4 FromInt(_SimdInt4 _i);
140OZZ_INLINE
float GetX(_SimdFloat4 _v);
143OZZ_INLINE
float GetY(_SimdFloat4 _v);
146OZZ_INLINE
float GetZ(_SimdFloat4 _v);
149OZZ_INLINE
float GetW(_SimdFloat4 _v);
152OZZ_INLINE SimdFloat4 SetX(_SimdFloat4 _v, _SimdFloat4 _f);
155OZZ_INLINE SimdFloat4 SetY(_SimdFloat4 _v, _SimdFloat4 _f);
158OZZ_INLINE SimdFloat4 SetZ(_SimdFloat4 _v, _SimdFloat4 _f);
161OZZ_INLINE SimdFloat4 SetW(_SimdFloat4 _v, _SimdFloat4 _f);
165OZZ_INLINE SimdFloat4 SetI(_SimdFloat4 _v, _SimdFloat4 _f,
int _i);
173OZZ_INLINE
void StorePtr(_SimdFloat4 _v,
float* _f);
178OZZ_INLINE
void Store1Ptr(_SimdFloat4 _v,
float* _f);
184OZZ_INLINE
void Store2Ptr(_SimdFloat4 _v,
float* _f);
191OZZ_INLINE
void Store3Ptr(_SimdFloat4 _v,
float* _f);
199OZZ_INLINE
void StorePtrU(_SimdFloat4 _v,
float* _f);
204OZZ_INLINE
void Store1PtrU(_SimdFloat4 _v,
float* _f);
210OZZ_INLINE
void Store2PtrU(_SimdFloat4 _v,
float* _f);
217OZZ_INLINE
void Store3PtrU(_SimdFloat4 _v,
float* _f);
220OZZ_INLINE SimdFloat4 SplatX(_SimdFloat4 _v);
223OZZ_INLINE SimdFloat4 SplatY(_SimdFloat4 _v);
226OZZ_INLINE SimdFloat4 SplatZ(_SimdFloat4 _v);
229OZZ_INLINE SimdFloat4 SplatW(_SimdFloat4 _v);
233template <
size_t _X,
size_t _Y,
size_t _Z,
size_t _W>
234OZZ_INLINE SimdFloat4 Swizzle(_SimdFloat4 _v);
238OZZ_INLINE
void Transpose4x1(
const SimdFloat4 _in[4], SimdFloat4 _out[1]);
242OZZ_INLINE
void Transpose1x4(
const SimdFloat4 _in[1], SimdFloat4 _out[4]);
246OZZ_INLINE
void Transpose4x2(
const SimdFloat4 _in[4], SimdFloat4 _out[2]);
250OZZ_INLINE
void Transpose2x4(
const SimdFloat4 _in[2], SimdFloat4 _out[4]);
254OZZ_INLINE
void Transpose4x3(
const SimdFloat4 _in[4], SimdFloat4 _out[3]);
258OZZ_INLINE
void Transpose3x4(
const SimdFloat4 _in[3], SimdFloat4 _out[4]);
261OZZ_INLINE
void Transpose4x4(
const SimdFloat4 _in[4], SimdFloat4 _out[4]);
264OZZ_INLINE
void Transpose16x16(
const SimdFloat4 _in[16], SimdFloat4 _out[16]);
268OZZ_INLINE SimdFloat4 MAdd(_SimdFloat4 _a, _SimdFloat4 _b, _SimdFloat4 _c);
272OZZ_INLINE SimdFloat4 MSub(_SimdFloat4 _a, _SimdFloat4 _b, _SimdFloat4 _c);
276OZZ_INLINE SimdFloat4 NMAdd(_SimdFloat4 _a, _SimdFloat4 _b, _SimdFloat4 _c);
280OZZ_INLINE SimdFloat4 NMSub(_SimdFloat4 _a, _SimdFloat4 _b, _SimdFloat4 _c);
289OZZ_INLINE SimdFloat4 DivX(_SimdFloat4 _a, _SimdFloat4 _b);
298OZZ_INLINE SimdFloat4 HAdd2(_SimdFloat4 _v);
307OZZ_INLINE SimdFloat4 HAdd3(_SimdFloat4 _v);
316OZZ_INLINE SimdFloat4 HAdd4(_SimdFloat4 _v);
325OZZ_INLINE SimdFloat4 Dot2(_SimdFloat4 _a, _SimdFloat4 _b);
334OZZ_INLINE SimdFloat4 Dot3(_SimdFloat4 _a, _SimdFloat4 _b);
343OZZ_INLINE SimdFloat4 Dot4(_SimdFloat4 _a, _SimdFloat4 _b);
352OZZ_INLINE SimdFloat4 Cross3(_SimdFloat4 _a, _SimdFloat4 _b);
355OZZ_INLINE SimdFloat4 RcpEst(_SimdFloat4 _v);
359OZZ_INLINE SimdFloat4 RcpEstNR(_SimdFloat4 _v);
364OZZ_INLINE SimdFloat4 RcpEstX(_SimdFloat4 _v);
369OZZ_INLINE SimdFloat4 RcpEstXNR(_SimdFloat4 _v);
372OZZ_INLINE SimdFloat4 Sqrt(_SimdFloat4 _v);
377OZZ_INLINE SimdFloat4 SqrtX(_SimdFloat4 _v);
380OZZ_INLINE SimdFloat4 RSqrtEst(_SimdFloat4 _v);
384OZZ_INLINE SimdFloat4 RSqrtEstNR(_SimdFloat4 _v);
389OZZ_INLINE SimdFloat4 RSqrtEstX(_SimdFloat4 _v);
394OZZ_INLINE SimdFloat4 RSqrtEstXNR(_SimdFloat4 _v);
397OZZ_INLINE SimdFloat4 Abs(_SimdFloat4 _v);
400OZZ_INLINE SimdInt4 Sign(_SimdFloat4 _v);
403OZZ_INLINE SimdFloat4 Min(_SimdFloat4 _a, _SimdFloat4 _b);
406OZZ_INLINE SimdFloat4 Max(_SimdFloat4 _a, _SimdFloat4 _b);
409OZZ_INLINE SimdFloat4 Min(_SimdFloat4 _v);
412OZZ_INLINE SimdFloat4 Max0(_SimdFloat4 _v);
416OZZ_INLINE SimdFloat4 Clamp(_SimdFloat4 _a, _SimdFloat4 _v, _SimdFloat4 _b);
421OZZ_INLINE SimdFloat4 Length2(_SimdFloat4 _v);
425OZZ_INLINE SimdFloat4 Length3(_SimdFloat4 _v);
429OZZ_INLINE SimdFloat4 Length4(_SimdFloat4 _v);
434OZZ_INLINE SimdFloat4 Length2Sqr(_SimdFloat4 _v);
439OZZ_INLINE SimdFloat4 Length3Sqr(_SimdFloat4 _v);
444OZZ_INLINE SimdFloat4 Length4Sqr(_SimdFloat4 _v);
449OZZ_INLINE SimdFloat4 Normalize2(_SimdFloat4 _v);
454OZZ_INLINE SimdFloat4 Normalize3(_SimdFloat4 _v);
457OZZ_INLINE SimdFloat4 Normalize4(_SimdFloat4 _v);
462OZZ_INLINE SimdFloat4 NormalizeEst2(_SimdFloat4 _v);
467OZZ_INLINE SimdFloat4 NormalizeEst3(_SimdFloat4 _v);
470OZZ_INLINE SimdFloat4 NormalizeEst4(_SimdFloat4 _v);
475OZZ_INLINE SimdInt4 IsNormalized2(_SimdFloat4 _v);
480OZZ_INLINE SimdInt4 IsNormalized3(_SimdFloat4 _v);
485OZZ_INLINE SimdInt4 IsNormalized4(_SimdFloat4 _v);
492OZZ_INLINE SimdInt4 IsNormalizedEst2(_SimdFloat4 _v);
499OZZ_INLINE SimdInt4 IsNormalizedEst3(_SimdFloat4 _v);
506OZZ_INLINE SimdInt4 IsNormalizedEst4(_SimdFloat4 _v);
511OZZ_INLINE SimdFloat4 NormalizeSafe2(_SimdFloat4 _v, _SimdFloat4 _safe);
516OZZ_INLINE SimdFloat4 NormalizeSafe3(_SimdFloat4 _v, _SimdFloat4 _safe);
520OZZ_INLINE SimdFloat4 NormalizeSafe4(_SimdFloat4 _v, _SimdFloat4 _safe);
525OZZ_INLINE SimdFloat4 NormalizeSafeEst2(_SimdFloat4 _v, _SimdFloat4 _safe);
530OZZ_INLINE SimdFloat4 NormalizeSafeEst3(_SimdFloat4 _v, _SimdFloat4 _safe);
534OZZ_INLINE SimdFloat4 NormalizeSafeEst4(_SimdFloat4 _v, _SimdFloat4 _safe);
538OZZ_INLINE SimdFloat4 Lerp(_SimdFloat4 _a, _SimdFloat4 _b, _SimdFloat4 _alpha);
541OZZ_INLINE SimdFloat4 Cos(_SimdFloat4 _v);
546OZZ_INLINE SimdFloat4 CosX(_SimdFloat4 _v);
549OZZ_INLINE SimdFloat4 ACos(_SimdFloat4 _v);
554OZZ_INLINE SimdFloat4 ACosX(_SimdFloat4 _v);
557OZZ_INLINE SimdFloat4 Sin(_SimdFloat4 _v);
562OZZ_INLINE SimdFloat4 SinX(_SimdFloat4 _v);
565OZZ_INLINE SimdFloat4 ASin(_SimdFloat4 _v);
570OZZ_INLINE SimdFloat4 ASinX(_SimdFloat4 _v);
573OZZ_INLINE SimdFloat4 Tan(_SimdFloat4 _v);
578OZZ_INLINE SimdFloat4 TanX(_SimdFloat4 _v);
581OZZ_INLINE SimdFloat4 ATan(_SimdFloat4 _v);
586OZZ_INLINE SimdFloat4 ATanX(_SimdFloat4 _v);
591OZZ_INLINE SimdFloat4 Select(_SimdInt4 _b, _SimdFloat4 _true,
595OZZ_INLINE SimdInt4 CmpEq(_SimdFloat4 _a, _SimdFloat4 _b);
598OZZ_INLINE SimdInt4 CmpNe(_SimdFloat4 _a, _SimdFloat4 _b);
601OZZ_INLINE SimdInt4 CmpLt(_SimdFloat4 _a, _SimdFloat4 _b);
604OZZ_INLINE SimdInt4 CmpLe(_SimdFloat4 _a, _SimdFloat4 _b);
607OZZ_INLINE SimdInt4 CmpGt(_SimdFloat4 _a, _SimdFloat4 _b);
610OZZ_INLINE SimdInt4 CmpGe(_SimdFloat4 _a, _SimdFloat4 _b);
614OZZ_INLINE SimdFloat4 And(_SimdFloat4 _a, _SimdFloat4 _b);
618OZZ_INLINE SimdFloat4 Or(_SimdFloat4 _a, _SimdFloat4 _b);
622OZZ_INLINE SimdFloat4 Xor(_SimdFloat4 _a, _SimdFloat4 _b);
626OZZ_INLINE SimdFloat4 And(_SimdFloat4 _a, _SimdInt4 _b);
630OZZ_INLINE SimdFloat4 AndNot(_SimdFloat4 _a, _SimdInt4 _b);
634OZZ_INLINE SimdFloat4 Or(_SimdFloat4 _a, _SimdInt4 _b);
638OZZ_INLINE SimdFloat4 Xor(_SimdFloat4 _a, _SimdInt4 _b);
642OZZ_INLINE SimdInt4
zero();
645OZZ_INLINE SimdInt4 one();
649OZZ_INLINE SimdInt4 x_axis();
653OZZ_INLINE SimdInt4 y_axis();
657OZZ_INLINE SimdInt4 z_axis();
661OZZ_INLINE SimdInt4 w_axis();
664OZZ_INLINE SimdInt4 all_true();
667OZZ_INLINE SimdInt4 all_false();
670OZZ_INLINE SimdInt4 mask_sign();
673OZZ_INLINE SimdInt4 mask_not_sign();
676OZZ_INLINE SimdInt4 mask_sign_xyz();
679OZZ_INLINE SimdInt4 mask_sign_w();
682OZZ_INLINE SimdInt4 mask_ffff();
685OZZ_INLINE SimdInt4 mask_0000();
689OZZ_INLINE SimdInt4 mask_fff0();
693OZZ_INLINE SimdInt4 mask_f000();
697OZZ_INLINE SimdInt4 mask_0f00();
701OZZ_INLINE SimdInt4 mask_00f0();
705OZZ_INLINE SimdInt4 mask_000f();
712OZZ_INLINE SimdInt4 Load(
int _x,
int _y,
int _z,
int _w);
720OZZ_INLINE SimdInt4 Load(
bool _x,
bool _y,
bool _z,
bool _w);
728OZZ_INLINE SimdInt4 LoadX(
bool _x);
736OZZ_INLINE SimdInt4 Load1(
bool _x);
744OZZ_INLINE SimdInt4 LoadPtr(
const int* _i);
753OZZ_INLINE SimdInt4 LoadXPtr(
const int* _i);
761OZZ_INLINE SimdInt4 Load1Ptr(
const int* _i);
770OZZ_INLINE SimdInt4 Load2Ptr(
const int* _i);
779OZZ_INLINE SimdInt4 Load3Ptr(
const int* _i);
787OZZ_INLINE SimdInt4 LoadPtrU(
const int* _i);
796OZZ_INLINE SimdInt4 LoadXPtrU(
const int* _i);
804OZZ_INLINE SimdInt4 Load1PtrU(
const int* _i);
813OZZ_INLINE SimdInt4 Load2PtrU(
const int* _i);
822OZZ_INLINE SimdInt4 Load3PtrU(
const int* _i);
825OZZ_INLINE SimdInt4 FromFloatRound(_SimdFloat4 _f);
828OZZ_INLINE SimdInt4 FromFloatTrunc(_SimdFloat4 _f);
832OZZ_INLINE
int GetX(_SimdInt4 _v);
835OZZ_INLINE
int GetY(_SimdInt4 _v);
838OZZ_INLINE
int GetZ(_SimdInt4 _v);
841OZZ_INLINE
int GetW(_SimdInt4 _v);
844OZZ_INLINE SimdInt4 SetX(_SimdInt4 _v, _SimdInt4 _i);
847OZZ_INLINE SimdInt4 SetY(_SimdInt4 _v, _SimdInt4 _i);
850OZZ_INLINE SimdInt4 SetZ(_SimdInt4 _v, _SimdInt4 _i);
853OZZ_INLINE SimdInt4 SetW(_SimdInt4 _v, _SimdInt4 _i);
857OZZ_INLINE SimdInt4 SetI(_SimdInt4 _v, _SimdInt4 _i,
int _ith);
865OZZ_INLINE
void StorePtr(_SimdInt4 _v,
int* _i);
870OZZ_INLINE
void Store1Ptr(_SimdInt4 _v,
int* _i);
876OZZ_INLINE
void Store2Ptr(_SimdInt4 _v,
int* _i);
883OZZ_INLINE
void Store3Ptr(_SimdInt4 _v,
int* _i);
891OZZ_INLINE
void StorePtrU(_SimdInt4 _v,
int* _i);
896OZZ_INLINE
void Store1PtrU(_SimdInt4 _v,
int* _i);
902OZZ_INLINE
void Store2PtrU(_SimdInt4 _v,
int* _i);
909OZZ_INLINE
void Store3PtrU(_SimdInt4 _v,
int* _i);
912OZZ_INLINE SimdInt4 SplatX(_SimdInt4 _v);
915OZZ_INLINE SimdInt4 SplatY(_SimdInt4 _v);
918OZZ_INLINE SimdInt4 SplatZ(_SimdInt4 _v);
921OZZ_INLINE SimdInt4 SplatW(_SimdInt4 _v);
925template <
size_t _X,
size_t _Y,
size_t _Z,
size_t _W>
926OZZ_INLINE SimdInt4 Swizzle(_SimdInt4 _v);
930OZZ_INLINE
int MoveMask(_SimdInt4 _v);
933OZZ_INLINE
bool AreAllTrue(_SimdInt4 _v);
936OZZ_INLINE
bool AreAllTrue3(_SimdInt4 _v);
939OZZ_INLINE
bool AreAllTrue2(_SimdInt4 _v);
942OZZ_INLINE
bool AreAllTrue1(_SimdInt4 _v);
945OZZ_INLINE
bool AreAllFalse(_SimdInt4 _v);
948OZZ_INLINE
bool AreAllFalse3(_SimdInt4 _v);
951OZZ_INLINE
bool AreAllFalse2(_SimdInt4 _v);
954OZZ_INLINE
bool AreAllFalse1(_SimdInt4 _v);
963OZZ_INLINE SimdInt4 HAdd2(_SimdInt4 _v);
972OZZ_INLINE SimdInt4 HAdd3(_SimdInt4 _v);
981OZZ_INLINE SimdInt4 HAdd4(_SimdInt4 _v);
984OZZ_INLINE SimdInt4 Abs(_SimdInt4 _v);
987OZZ_INLINE SimdInt4 Sign(_SimdInt4 _v);
990OZZ_INLINE SimdInt4 Min(_SimdInt4 _a, _SimdInt4 _b);
993OZZ_INLINE SimdInt4 Max(_SimdInt4 _a, _SimdInt4 _b);
996OZZ_INLINE SimdInt4 Min0(_SimdInt4 _v);
999OZZ_INLINE SimdInt4 Max0(_SimdInt4 _v);
1003OZZ_INLINE SimdInt4 Clamp(_SimdInt4 _a, _SimdInt4 _v, _SimdInt4 _b);
1008OZZ_INLINE SimdInt4 Select(_SimdInt4 _b, _SimdInt4 _true, _SimdInt4 _false);
1012OZZ_INLINE SimdInt4 And(_SimdInt4 _a, _SimdInt4 _b);
1016OZZ_INLINE SimdInt4 AndNot(_SimdInt4 _a, _SimdInt4 _b);
1020OZZ_INLINE SimdInt4 Or(_SimdInt4 _a, _SimdInt4 _b);
1024OZZ_INLINE SimdInt4 Xor(_SimdInt4 _a, _SimdInt4 _b);
1028OZZ_INLINE SimdInt4 Not(_SimdInt4 _v);
1032OZZ_INLINE SimdInt4 ShiftL(_SimdInt4 _v,
int _bits);
1036OZZ_INLINE SimdInt4 ShiftR(_SimdInt4 _v,
int _bits);
1040OZZ_INLINE SimdInt4 ShiftRu(_SimdInt4 _v,
int _bits);
1043OZZ_INLINE SimdInt4 CmpEq(_SimdInt4 _a, _SimdInt4 _b);
1046OZZ_INLINE SimdInt4 CmpNe(_SimdInt4 _a, _SimdInt4 _b);
1049OZZ_INLINE SimdInt4 CmpLt(_SimdInt4 _a, _SimdInt4 _b);
1052OZZ_INLINE SimdInt4 CmpLe(_SimdInt4 _a, _SimdInt4 _b);
1055OZZ_INLINE SimdInt4 CmpGt(_SimdInt4 _a, _SimdInt4 _b);
1058OZZ_INLINE SimdInt4 CmpGe(_SimdInt4 _a, _SimdInt4 _b);
1071 static OZZ_INLINE
Float4x4 identity();
1181#if !defined(OZZ_DISABLE_SSE_NATIVE_OPERATORS)
1206OZZ_INLINE uint16_t FloatToHalf(
float _f);
1209OZZ_INLINE
float HalfToFloat(uint16_t _h);
1212OZZ_INLINE SimdInt4 FloatToHalf(_SimdFloat4 _f);
1215OZZ_INLINE SimdFloat4 HalfToFloat(_SimdInt4 _h);
1219#if defined(OZZ_SIMD_SSEx)
1220#include "ozz/base/maths/internal/simd_math_sse-inl.h"
1221#elif defined(OZZ_SIMD_REF)
1222#include "ozz/base/maths/internal/simd_math_ref-inl.h"
1224#error No simd_math implementation detected
GLM_FUNC_DECL GLM_CONSTEXPR genType zero()
Definition constants.inl:6
Definition simd_math_config.h:121
Definition simd_math_config.h:129
Definition simd_math.h:1066