UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
UnrealMathFPU.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5// HEADER_UNIT_SKIP - Not included directly
6
7#include "HAL/UnrealMemory.h"
8#include <cmath>
9
10/*=============================================================================
11 * Helpers:
12 *============================================================================*/
13
15
19struct alignas(16) VectorRegister4Float
20{
21 float V[4];
22};
23
28{
29 int32 V[4];
30};
31
32
34{
35 double V[2];
36};
37
41struct alignas(16) VectorRegister4Double
42{
43 union
44 {
45 struct
46 {
49 };
50 double V[4];
51 };
52
54
56 {
57 V[0] = InXY.V[0];
58 V[1] = InXY.V[1];
59 V[2] = InZW.V[0];
60 V[3] = InZW.V[1];
61 }
62
66
67 // Construct from a vector of 4 floats
69 {
70 V[0] = FloatVector.V[0];
71 V[1] = FloatVector.V[1];
72 V[2] = FloatVector.V[2];
73 V[3] = FloatVector.V[3];
74 }
75
76 // Assign from a vector of 4 floats
78 {
79 V[0] = From.V[0];
80 V[1] = From.V[1];
81 V[2] = From.V[2];
82 V[3] = From.V[3];
83 return *this;
84 }
85};
86
87// Aliases
92
93// Backwards compatibility
97
98typedef struct
99{
102
103
104// Forward declarations
107void VectorStoreAligned(const VectorRegister4Float& Vec, float* Ptr);
108void VectorStoreAligned(const VectorRegister4Double& Vec, double* Dst);
109
110
111// Helper for conveniently aligning a float array for extraction from VectorRegister4Float
112struct alignas(alignof(VectorRegister4Float)) AlignedFloat4
113{
114 float V[4];
115
120
121 FORCEINLINE float operator[](int32 Index) const { return V[Index]; }
123
128};
129
130
131// Helper for conveniently aligning a double array for extraction from VectorRegister4Double
132struct alignas(alignof(VectorRegister4Double)) AlignedDouble4
133{
134 double V[4];
135
140
141 FORCEINLINE double operator[](int32 Index) const { return V[Index]; }
142 FORCEINLINE double& operator[](int32 Index) { return V[Index]; }
143
148};
149
151#define VectorZeroVectorRegister() VectorZeroDouble()
152#define VectorOneVectorRegister() VectorOneDouble()
153
154
155#define DECLARE_VECTOR_REGISTER(X, Y, Z, W) MakeVectorRegister(X, Y, Z, W)
156
157
159{
161 Result.V[0] = X;
162 Result.V[1] = Y;
163 return Result;
164}
165
176{
178 ((uint32&)Vec.V[0]) = X;
179 ((uint32&)Vec.V[1]) = Y;
180 ((uint32&)Vec.V[2]) = Z;
181 ((uint32&)Vec.V[3]) = W;
182 return Vec;
183}
184
186{
188 ((uint64&)Vec.V[0]) = X;
189 ((uint64&)Vec.V[1]) = Y;
190 ((uint64&)Vec.V[2]) = Z;
191 ((uint64&)Vec.V[3]) = W;
192 return Vec;
193}
194
199
200// Nicer aliases
205
210
221{
223 Vec.V[0] = X;
224 Vec.V[1] = Y;
225 Vec.V[2] = Z;
226 Vec.V[3] = W;
227 return Vec;
228}
229
231{
233 Vec.V[0] = X;
234 Vec.V[1] = Y;
235 Vec.V[2] = Z;
236 Vec.V[3] = W;
237 return Vec;
238}
239
244
246{
247 return MakeVectorRegisterFloat(X, Y, Z, W);
248}
249
250FORCEINLINE VectorRegister4Double MakeVectorRegister(double X, double Y, double Z, double W)
251{
252 return MakeVectorRegisterDouble(X, Y, Z, W);
253}
254
255// Make double register from float register
260
261// Lossy conversion: double->float vector
263{
265 Vec.V[0] = float(Vec4d.V[0]);
266 Vec.V[1] = float(Vec4d.V[1]);
267 Vec.V[2] = float(Vec4d.V[2]);
268 Vec.V[3] = float(Vec4d.V[3]);
269 return Vec;
270}
271
272
283{
285 ((int32&)Vec.V[0]) = X;
286 ((int32&)Vec.V[1]) = Y;
287 ((int32&)Vec.V[2]) = Z;
288 ((int32&)Vec.V[3]) = W;
289 return Vec;
290}
291
296
298{
299 return VectorRegister4Float { X, Y, Z, W };
300}
301
306
308{
310 ((int64&)Vec.V[0]) = X;
311 ((int64&)Vec.V[2]) = Y;
312 return Vec;
313}
314
315/*=============================================================================
316 * Constants:
317 *============================================================================*/
318
320
321
322/*=============================================================================
323 * Intrinsics:
324 *============================================================================*/
325
335
340
350
355
363template <uint32 ComponentIndex>
365{
366 return Vec.V[ComponentIndex];
367}
368
370{
371 return Vec.V[ComponentIndex];
372}
373
374template <uint32 ComponentIndex>
376{
377 return Vec.V[ComponentIndex];
378}
379
381{
382 return Vec.V[ComponentIndex];
383}
384
385#define VectorGetComponent(Vec, ComponentIndex) VectorGetComponentImpl<ComponentIndex>(Vec)
386
387
395{
396 return MakeVectorRegisterFloat(Ptr[0], Ptr[1], Ptr[2], Ptr[3]);
397}
398
400{
401 return MakeVectorRegisterDouble(Ptr[0], Ptr[1], Ptr[2], Ptr[3]);
402}
403
411{
413 Result.val[0] = VectorLoad(Ptr);
414 Result.val[1] = VectorLoad(Ptr + 4);
415 Result.val[2] = VectorLoad(Ptr + 8);
416 Result.val[3] = VectorLoad(Ptr + 12);
417 return Result;
418}
419
420
428{
429 return MakeVectorRegisterDouble(Ptr[0], Ptr[1], Ptr[2], 0.0);
430}
431
432
440{
441 return MakeVectorRegisterDouble(Ptr[0], Ptr[1], Ptr[2], 1.0);
442}
443
444
452{
453 return VectorLoad(Ptr);
454}
455
457{
458 return VectorLoad(Ptr);
459}
460
461
469{
470 return MakeVectorRegisterFloat(Ptr[0], Ptr[0], Ptr[0], Ptr[0]);
471}
472
474{
475 return MakeVectorRegisterDouble(Ptr[0], Ptr[0], Ptr[0], Ptr[0]);
476}
477
478
486{
487 return MakeVectorRegisterFloat(Ptr[0], Ptr[1], Ptr[0], Ptr[1]);
488}
489
491{
492 return MakeVectorRegisterDouble(Ptr[0], Ptr[1], Ptr[0], Ptr[1]);
493}
494
504{
505 return MakeVectorRegister(Ptr1[0], Ptr1[1], Ptr2[0], Ptr2[1]);
506}
508{
509 return MakeVectorRegister(Ptr1[0], Ptr1[1], Ptr2[0], Ptr2[1]);
510}
511
522
527
535{
536 FMemory::Memcpy(Dst, &Vec, 4 * sizeof(float));
537}
538
540{
541 FMemory::Memcpy(Dst, &Vec, 4 * sizeof(double));
542}
543
554
559
567{
568 FMemory::Memcpy(Dst, &(Vec), 4 * sizeof(float));
569}
570
572{
573 FMemory::Memcpy(Dst, &(Vec), 4 * sizeof(double));
574}
575
583{
584 FMemory::Memcpy(Dst, &(Vec), 16 * sizeof(float));
585}
586
587
595{
596 FMemory::Memcpy(Dst, &(Vec), 3 * sizeof(float));
597}
598
600{
601 FMemory::Memcpy(Dst, &(Vec), 3 * sizeof(double));
602}
603
611{
612 FMemory::Memcpy(Dst, &(Vec), 1 * sizeof(float));
613}
614
616{
617 FMemory::Memcpy(Dst, &(Vec), 1 * sizeof(double));
618}
619
627#define VectorReplicate( Vec, ElementIndex ) MakeVectorRegister( (Vec).V[ElementIndex], (Vec).V[ElementIndex], (Vec).V[ElementIndex], (Vec).V[ElementIndex] )
628
639#define VectorSwizzle( Vec, X, Y, Z, W ) MakeVectorRegister( (Vec).V[X], (Vec).V[Y], (Vec).V[Z], (Vec).V[W] )
640
652#define VectorShuffle( Vec1, Vec2, X, Y, Z, W ) MakeVectorRegister( (Vec1).V[X], (Vec1).V[Y], (Vec2).V[Z], (Vec2).V[W] )
653
654
662{
664 Vec2.V[0] = FMath::Abs(Vec.V[0]);
665 Vec2.V[1] = FMath::Abs(Vec.V[1]);
666 Vec2.V[2] = FMath::Abs(Vec.V[2]);
667 Vec2.V[3] = FMath::Abs(Vec.V[3]);
668 return Vec2;
669}
670
672{
674 Vec2.V[0] = FMath::Abs(Vec.V[0]);
675 Vec2.V[1] = FMath::Abs(Vec.V[1]);
676 Vec2.V[2] = FMath::Abs(Vec.V[2]);
677 Vec2.V[3] = FMath::Abs(Vec.V[3]);
678 return Vec2;
679}
680
688{
689 return MakeVectorRegisterFloat(-(Vec).V[0], -(Vec).V[1], -(Vec).V[2], -(Vec).V[3]);
690}
691
693{
694 return MakeVectorRegisterDouble(-(Vec).V[0], -(Vec).V[1], -(Vec).V[2], -(Vec).V[3]);
695}
696
705{
707 Vec.V[0] = Vec1.V[0] + Vec2.V[0];
708 Vec.V[1] = Vec1.V[1] + Vec2.V[1];
709 Vec.V[2] = Vec1.V[2] + Vec2.V[2];
710 Vec.V[3] = Vec1.V[3] + Vec2.V[3];
711 return Vec;
712}
713
715{
717 Vec.V[0] = Vec1.V[0] + Vec2.V[0];
718 Vec.V[1] = Vec1.V[1] + Vec2.V[1];
719 Vec.V[2] = Vec1.V[2] + Vec2.V[2];
720 Vec.V[3] = Vec1.V[3] + Vec2.V[3];
721 return Vec;
722}
723
732{
734 Vec.V[0] = Vec1.V[0] - Vec2.V[0];
735 Vec.V[1] = Vec1.V[1] - Vec2.V[1];
736 Vec.V[2] = Vec1.V[2] - Vec2.V[2];
737 Vec.V[3] = Vec1.V[3] - Vec2.V[3];
738 return Vec;
739}
740
742{
744 Vec.V[0] = Vec1.V[0] - Vec2.V[0];
745 Vec.V[1] = Vec1.V[1] - Vec2.V[1];
746 Vec.V[2] = Vec1.V[2] - Vec2.V[2];
747 Vec.V[3] = Vec1.V[3] - Vec2.V[3];
748 return Vec;
749}
750
759{
761 Vec.V[0] = Vec1.V[0] * Vec2.V[0];
762 Vec.V[1] = Vec1.V[1] * Vec2.V[1];
763 Vec.V[2] = Vec1.V[2] * Vec2.V[2];
764 Vec.V[3] = Vec1.V[3] * Vec2.V[3];
765 return Vec;
766}
767
769{
771 Vec.V[0] = Vec1.V[0] * Vec2.V[0];
772 Vec.V[1] = Vec1.V[1] * Vec2.V[1];
773 Vec.V[2] = Vec1.V[2] * Vec2.V[2];
774 Vec.V[3] = Vec1.V[3] * Vec2.V[3];
775 return Vec;
776}
777
787{
789 Vec.V[0] = Vec1.V[0] * Vec2.V[0] + Vec3.V[0];
790 Vec.V[1] = Vec1.V[1] * Vec2.V[1] + Vec3.V[1];
791 Vec.V[2] = Vec1.V[2] * Vec2.V[2] + Vec3.V[2];
792 Vec.V[3] = Vec1.V[3] * Vec2.V[3] + Vec3.V[3];
793 return Vec;
794}
795
797{
799 Vec.V[0] = Vec1.V[0] * Vec2.V[0] + Vec3.V[0];
800 Vec.V[1] = Vec1.V[1] * Vec2.V[1] + Vec3.V[1];
801 Vec.V[2] = Vec1.V[2] * Vec2.V[2] + Vec3.V[2];
802 Vec.V[3] = Vec1.V[3] * Vec2.V[3] + Vec3.V[3];
803 return Vec;
804}
805
806
819
824
825
826
835{
837 Vec.V[0] = Vec1.V[0] / Vec2.V[0];
838 Vec.V[1] = Vec1.V[1] / Vec2.V[1];
839 Vec.V[2] = Vec1.V[2] / Vec2.V[2];
840 Vec.V[3] = Vec1.V[3] / Vec2.V[3];
841 return Vec;
842}
843
845{
847 Vec.V[0] = Vec1.V[0] / Vec2.V[0];
848 Vec.V[1] = Vec1.V[1] / Vec2.V[1];
849 Vec.V[2] = Vec1.V[2] / Vec2.V[2];
850 Vec.V[3] = Vec1.V[3] / Vec2.V[3];
851 return Vec;
852}
853
862{
863 float D = Vec1.V[0] * Vec2.V[0] + Vec1.V[1] * Vec2.V[1] + Vec1.V[2] * Vec2.V[2];
864 return D;
865}
866
868{
869 double D = Vec1.V[0] * Vec2.V[0] + Vec1.V[1] * Vec2.V[1] + Vec1.V[2] * Vec2.V[2];
870 return D;
871}
872
886
893
902{
903 float D = Vec1.V[0] * Vec2.V[0] + Vec1.V[1] * Vec2.V[1] + Vec1.V[2] * Vec2.V[2] + Vec1.V[3] * Vec2.V[3];
905 return Vec;
906}
907
909{
910 double D = Vec1.V[0] * Vec2.V[0] + Vec1.V[1] * Vec2.V[1] + Vec1.V[2] * Vec2.V[2] + Vec1.V[3] * Vec2.V[3];
912 return Vec;
913}
914
915
924{
926 uint32(Vec1.V[0] == Vec2.V[0] && !std::isunordered(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFF : 0),
927 uint32(Vec1.V[1] == Vec2.V[1] && !std::isunordered(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFF : 0),
928 uint32(Vec1.V[2] == Vec2.V[2] && !std::isunordered(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFF : 0),
929 uint32(Vec1.V[3] == Vec2.V[3] && !std::isunordered(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFF : 0));
930}
931
933{
935 uint64(Vec1.V[0] == Vec2.V[0] && !std::isunordered(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFFFFFFFFFF : 0),
936 uint64(Vec1.V[1] == Vec2.V[1] && !std::isunordered(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFFFFFFFFFF : 0),
937 uint64(Vec1.V[2] == Vec2.V[2] && !std::isunordered(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFFFFFFFFFF : 0),
938 uint64(Vec1.V[3] == Vec2.V[3] && !std::isunordered(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFFFFFFFFFF : 0));
939}
940
949{
951 uint32(Vec1.V[0] != Vec2.V[0] || std::isunordered(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFF : 0),
952 uint32(Vec1.V[1] != Vec2.V[1] || std::isunordered(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFF : 0),
953 uint32(Vec1.V[2] != Vec2.V[2] || std::isunordered(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFF : 0),
954 uint32(Vec1.V[3] != Vec2.V[3] || std::isunordered(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFF : 0));
955}
956
958{
960 uint64(Vec1.V[0] != Vec2.V[0] || std::isunordered(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFFFFFFFFFF : 0),
961 uint64(Vec1.V[1] != Vec2.V[1] || std::isunordered(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFFFFFFFFFF : 0),
962 uint64(Vec1.V[2] != Vec2.V[2] || std::isunordered(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFFFFFFFFFF : 0),
963 uint64(Vec1.V[3] != Vec2.V[3] || std::isunordered(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFFFFFFFFFF : 0));
964}
965
975{
977 uint32(std::isgreater(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFF : 0),
978 uint32(std::isgreater(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFF : 0),
979 uint32(std::isgreater(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFF : 0),
980 uint32(std::isgreater(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFF : 0));
981}
982
984{
986 uint64(std::isgreater(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFFFFFFFFFF : 0),
987 uint64(std::isgreater(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFFFFFFFFFF : 0),
988 uint64(std::isgreater(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFFFFFFFFFF : 0),
989 uint64(std::isgreater(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFFFFFFFFFF : 0));
990}
991
1001{
1003 uint32(std::isgreaterequal(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFF : 0),
1004 uint32(std::isgreaterequal(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFF : 0),
1005 uint32(std::isgreaterequal(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFF : 0),
1006 uint32(std::isgreaterequal(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFF : 0));
1007}
1008
1010{
1012 uint64(std::isgreaterequal(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFFFFFFFFFF : 0),
1013 uint64(std::isgreaterequal(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFFFFFFFFFF : 0),
1014 uint64(std::isgreaterequal(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFFFFFFFFFF : 0),
1015 uint64(std::isgreaterequal(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFFFFFFFFFF : 0));
1016}
1017
1026{
1028 uint32(std::isless(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFF : 0),
1029 uint32(std::isless(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFF : 0),
1030 uint32(std::isless(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFF : 0),
1031 uint32(std::isless(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFF : 0));
1032}
1033
1035{
1037 uint64(std::isless(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFFFFFFFFFF : 0),
1038 uint64(std::isless(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFFFFFFFFFF : 0),
1039 uint64(std::isless(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFFFFFFFFFF : 0),
1040 uint64(std::isless(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFFFFFFFFFF : 0));
1041}
1042
1051{
1053 uint32(std::islessequal(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFF : 0),
1054 uint32(std::islessequal(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFF : 0),
1055 uint32(std::islessequal(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFF : 0),
1056 uint32(std::islessequal(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFF : 0));
1057}
1058
1060{
1062 uint64(std::islessequal(Vec1.V[0], Vec2.V[0]) ? 0xFFFFFFFFFFFFFFFF : 0),
1063 uint64(std::islessequal(Vec1.V[1], Vec2.V[1]) ? 0xFFFFFFFFFFFFFFFF : 0),
1064 uint64(std::islessequal(Vec1.V[2], Vec2.V[2]) ? 0xFFFFFFFFFFFFFFFF : 0),
1065 uint64(std::islessequal(Vec1.V[3], Vec2.V[3]) ? 0xFFFFFFFFFFFFFFFF : 0));
1066}
1067
1068
1076{
1077 uint32* V1 = (uint32*)(&(Vec1.V[0]));
1078
1079 return ((V1[0] >> 31)) |
1080 ((V1[1] >> 30) & 2) |
1081 ((V1[2] >> 29) & 4) |
1082 ((V1[3] >> 28) & 8);
1083}
1084
1086{
1087 uint64* V1 = (uint64*)(&(Vec1.V[0]));
1088
1089 return ((V1[0] >> 63)) |
1090 ((V1[1] >> 62) & 2) |
1091 ((V1[2] >> 61) & 4) |
1092 ((V1[3] >> 60) & 8);
1093}
1094
1106{
1107 uint32* V1 = (uint32*)(&(Vec1.V[0]));
1108 uint32* V2 = (uint32*)(&(Vec2.V[0]));
1109 uint32* M = (uint32*)(&(Mask.V[0]));
1110
1112 V2[0] ^ (M[0] & (V2[0] ^ V1[0])),
1113 V2[1] ^ (M[1] & (V2[1] ^ V1[1])),
1114 V2[2] ^ (M[2] & (V2[2] ^ V1[2])),
1115 V2[3] ^ (M[3] & (V2[3] ^ V1[3]))
1116 );
1117}
1118
1120{
1121 uint64* V1 = (uint64*)(&(Vec1.V[0]));
1122 uint64* V2 = (uint64*)(&(Vec2.V[0]));
1123 uint64* M = (uint64*)(&(Mask.V[0]));
1124
1126 V2[0] ^ (M[0] & (V2[0] ^ V1[0])),
1127 V2[1] ^ (M[1] & (V2[1] ^ V1[1])),
1128 V2[2] ^ (M[2] & (V2[2] ^ V1[2])),
1129 V2[3] ^ (M[3] & (V2[3] ^ V1[3]))
1130 );
1131}
1132
1141{
1143 uint32(((uint32*)(Vec1.V))[0] | ((uint32*)(Vec2.V))[0]),
1144 uint32(((uint32*)(Vec1.V))[1] | ((uint32*)(Vec2.V))[1]),
1145 uint32(((uint32*)(Vec1.V))[2] | ((uint32*)(Vec2.V))[2]),
1146 uint32(((uint32*)(Vec1.V))[3] | ((uint32*)(Vec2.V))[3]));
1147}
1148
1150{
1152 uint64(((uint64*)(Vec1.V))[0] | ((uint64*)(Vec2.V))[0]),
1153 uint64(((uint64*)(Vec1.V))[1] | ((uint64*)(Vec2.V))[1]),
1154 uint64(((uint64*)(Vec1.V))[2] | ((uint64*)(Vec2.V))[2]),
1155 uint64(((uint64*)(Vec1.V))[3] | ((uint64*)(Vec2.V))[3]));
1156}
1157
1166{
1168 uint32(((uint32*)(Vec1.V))[0] & ((uint32*)(Vec2.V))[0]),
1169 uint32(((uint32*)(Vec1.V))[1] & ((uint32*)(Vec2.V))[1]),
1170 uint32(((uint32*)(Vec1.V))[2] & ((uint32*)(Vec2.V))[2]),
1171 uint32(((uint32*)(Vec1.V))[3] & ((uint32*)(Vec2.V))[3]));
1172}
1173
1175{
1177 uint64(((uint64*)(Vec1.V))[0] & ((uint64*)(Vec2.V))[0]),
1178 uint64(((uint64*)(Vec1.V))[1] & ((uint64*)(Vec2.V))[1]),
1179 uint64(((uint64*)(Vec1.V))[2] & ((uint64*)(Vec2.V))[2]),
1180 uint64(((uint64*)(Vec1.V))[3] & ((uint64*)(Vec2.V))[3]));
1181}
1182
1191{
1193 uint32(((uint32*)(Vec1.V))[0] ^ ((uint32*)(Vec2.V))[0]),
1194 uint32(((uint32*)(Vec1.V))[1] ^ ((uint32*)(Vec2.V))[1]),
1195 uint32(((uint32*)(Vec1.V))[2] ^ ((uint32*)(Vec2.V))[2]),
1196 uint32(((uint32*)(Vec1.V))[3] ^ ((uint32*)(Vec2.V))[3]));
1197}
1198
1200{
1202 uint64(((uint64*)(Vec1.V))[0] ^ ((uint64*)(Vec2.V))[0]),
1203 uint64(((uint64*)(Vec1.V))[1] ^ ((uint64*)(Vec2.V))[1]),
1204 uint64(((uint64*)(Vec1.V))[2] ^ ((uint64*)(Vec2.V))[2]),
1205 uint64(((uint64*)(Vec1.V))[3] ^ ((uint64*)(Vec2.V))[3]));
1206}
1207
1208
1217{
1219 Vec.V[0] = Vec1.V[1] * Vec2.V[2] - Vec1.V[2] * Vec2.V[1];
1220 Vec.V[1] = Vec1.V[2] * Vec2.V[0] - Vec1.V[0] * Vec2.V[2];
1221 Vec.V[2] = Vec1.V[0] * Vec2.V[1] - Vec1.V[1] * Vec2.V[0];
1222 Vec.V[3] = 0.0f;
1223 return Vec;
1224}
1225
1227{
1229 Vec.V[0] = Vec1.V[1] * Vec2.V[2] - Vec1.V[2] * Vec2.V[1];
1230 Vec.V[1] = Vec1.V[2] * Vec2.V[0] - Vec1.V[0] * Vec2.V[2];
1231 Vec.V[2] = Vec1.V[0] * Vec2.V[1] - Vec1.V[1] * Vec2.V[0];
1232 Vec.V[3] = 0.0;
1233 return Vec;
1234}
1235
1244{
1246 Vec.V[0] = FMath::Pow(Base.V[0], Exponent.V[0]);
1247 Vec.V[1] = FMath::Pow(Base.V[1], Exponent.V[1]);
1248 Vec.V[2] = FMath::Pow(Base.V[2], Exponent.V[2]);
1249 Vec.V[3] = FMath::Pow(Base.V[3], Exponent.V[3]);
1250 return Vec;
1251}
1252
1254{
1256 Vec.V[0] = FMath::Pow(Base.V[0], Exponent.V[0]);
1257 Vec.V[1] = FMath::Pow(Base.V[1], Exponent.V[1]);
1258 Vec.V[2] = FMath::Pow(Base.V[2], Exponent.V[2]);
1259 Vec.V[3] = FMath::Pow(Base.V[3], Exponent.V[3]);
1260 return Vec;
1261}
1262
1264{
1265 return MakeVectorRegisterFloat(FMath::Sqrt(Vec.V[0]), FMath::Sqrt(Vec.V[1]), FMath::Sqrt(Vec.V[2]), FMath::Sqrt(Vec.V[3]));
1266}
1267
1269{
1270 return MakeVectorRegisterDouble(FMath::Sqrt(Vec.V[0]), FMath::Sqrt(Vec.V[1]), FMath::Sqrt(Vec.V[2]), FMath::Sqrt(Vec.V[3]));
1271}
1272
1280{
1281 return MakeVectorRegisterFloat(1.0f / FMath::Sqrt(Vec.V[0]), 1.0f / FMath::Sqrt(Vec.V[1]), 1.0f / FMath::Sqrt(Vec.V[2]), 1.0f / FMath::Sqrt(Vec.V[3]));
1282}
1283
1285{
1286 return MakeVectorRegisterDouble(1.0 / FMath::Sqrt(Vec.V[0]), 1.0 / FMath::Sqrt(Vec.V[1]), 1.0 / FMath::Sqrt(Vec.V[2]), 1.0 / FMath::Sqrt(Vec.V[3]));
1287}
1288
1296{
1297 return MakeVectorRegisterFloat(FMath::InvSqrtEst(Vec.V[0]), FMath::InvSqrtEst(Vec.V[1]), FMath::InvSqrtEst(Vec.V[2]), FMath::InvSqrtEst(Vec.V[3]));
1298}
1299
1301{
1302 return MakeVectorRegisterDouble(FMath::InvSqrtEst(Vec.V[0]), FMath::InvSqrtEst(Vec.V[1]), FMath::InvSqrtEst(Vec.V[2]), FMath::InvSqrtEst(Vec.V[3]));
1303}
1304
1315
1320
1331
1336
1344{
1346 float rlen = 1.0f / FMath::Sqrt(Len.V[0]);
1347
1348 VectorRegister4Float Result;
1349 Result.V[0] = rlen;
1350 Result.V[1] = rlen;
1351 Result.V[2] = rlen;
1352 Result.V[3] = rlen;
1353 return Result;
1354}
1355
1357{
1359 double rlen = 1.0 / FMath::Sqrt(Len.V[0]);
1360
1361 VectorRegister4Double Result;
1362 Result.V[0] = rlen;
1363 Result.V[1] = rlen;
1364 Result.V[2] = rlen;
1365 Result.V[3] = rlen;
1366 return Result;
1367}
1368
1379
1384
1392{
1393 return MakeVectorRegisterFloat((Vec).V[0], (Vec).V[1], (Vec).V[2], 0.0f);
1394}
1395
1397{
1398 return MakeVectorRegisterDouble((Vec).V[0], (Vec).V[1], (Vec).V[2], 0.0);
1399}
1400
1408{
1409 return MakeVectorRegisterFloat((Vec).V[0], (Vec).V[1], (Vec).V[2], 1.0f);
1410}
1411
1413{
1414 return MakeVectorRegisterDouble((Vec).V[0], (Vec).V[1], (Vec).V[2], 1.0);
1415}
1416
1417
1418// 40% faster version of the Quaternion multiplication.
1419#define USE_FAST_QUAT_MUL 1
1420
1432{
1433 typedef float Float4[4];
1434 const Float4& A = *((const Float4*) Quat1);
1435 const Float4& B = *((const Float4*) Quat2);
1436 Float4 & R = *((Float4*) Result);
1437
1438#if USE_FAST_QUAT_MUL
1439 const float T0 = (A[2] - A[1]) * (B[1] - B[2]);
1440 const float T1 = (A[3] + A[0]) * (B[3] + B[0]);
1441 const float T2 = (A[3] - A[0]) * (B[1] + B[2]);
1442 const float T3 = (A[1] + A[2]) * (B[3] - B[0]);
1443 const float T4 = (A[2] - A[0]) * (B[0] - B[1]);
1444 const float T5 = (A[2] + A[0]) * (B[0] + B[1]);
1445 const float T6 = (A[3] + A[1]) * (B[3] - B[2]);
1446 const float T7 = (A[3] - A[1]) * (B[3] + B[2]);
1447 const float T8 = T5 + T6 + T7;
1448 const float T9 = 0.5f * (T4 + T8);
1449
1450 R[0] = T1 + T9 - T8;
1451 R[1] = T2 + T9 - T7;
1452 R[2] = T3 + T9 - T6;
1453 R[3] = T0 + T9 - T5;
1454#else
1455 // store intermediate results in temporaries
1456 const float TX = A[3]*B[0] + A[0]*B[3] + A[1]*B[2] - A[2]*B[1];
1457 const float TY = A[3]*B[1] - A[0]*B[2] + A[1]*B[3] + A[2]*B[0];
1458 const float TZ = A[3]*B[2] + A[0]*B[1] - A[1]*B[0] + A[2]*B[3];
1459 const float TW = A[3]*B[3] - A[0]*B[0] - A[1]*B[1] - A[2]*B[2];
1460
1461 // copy intermediate result to *this
1462 R[0] = TX;
1463 R[1] = TY;
1464 R[2] = TZ;
1465 R[3] = TW;
1466#endif
1467}
1468
1470{
1471 typedef double Double4[4];
1472 const Double4& A = *((const Double4*)Quat1);
1473 const Double4& B = *((const Double4*)Quat2);
1474 Double4& R = *((Double4*)Result);
1475
1476#if USE_FAST_QUAT_MUL
1477 const double T0 = (A[2] - A[1]) * (B[1] - B[2]);
1478 const double T1 = (A[3] + A[0]) * (B[3] + B[0]);
1479 const double T2 = (A[3] - A[0]) * (B[1] + B[2]);
1480 const double T3 = (A[1] + A[2]) * (B[3] - B[0]);
1481 const double T4 = (A[2] - A[0]) * (B[0] - B[1]);
1482 const double T5 = (A[2] + A[0]) * (B[0] + B[1]);
1483 const double T6 = (A[3] + A[1]) * (B[3] - B[2]);
1484 const double T7 = (A[3] - A[1]) * (B[3] + B[2]);
1485 const double T8 = T5 + T6 + T7;
1486 const double T9 = 0.5 * (T4 + T8);
1487
1488 R[0] = T1 + T9 - T8;
1489 R[1] = T2 + T9 - T7;
1490 R[2] = T3 + T9 - T6;
1491 R[3] = T0 + T9 - T5;
1492#else
1493 // store intermediate results in temporaries
1494 const double TX = A[3] * B[0] + A[0] * B[3] + A[1] * B[2] - A[2] * B[1];
1495 const double TY = A[3] * B[1] - A[0] * B[2] + A[1] * B[3] + A[2] * B[0];
1496 const double TZ = A[3] * B[2] + A[0] * B[1] - A[1] * B[0] + A[2] * B[3];
1497 const double TW = A[3] * B[3] - A[0] * B[0] - A[1] * B[1] - A[2] * B[2];
1498
1499 // copy intermediate result to *this
1500 R[0] = TX;
1501 R[1] = TY;
1502 R[2] = TZ;
1503 R[3] = TW;
1504#endif
1505}
1506
1523
1530
1539{
1540 typedef double Double4x4[4][4];
1541 const Double4x4& A = *((const Double4x4*)Matrix1);
1542 const Double4x4& B = *((const Double4x4*)Matrix2);
1543 Double4x4 Temp;
1544 Temp[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0] + A[0][2] * B[2][0] + A[0][3] * B[3][0];
1545 Temp[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1] + A[0][2] * B[2][1] + A[0][3] * B[3][1];
1546 Temp[0][2] = A[0][0] * B[0][2] + A[0][1] * B[1][2] + A[0][2] * B[2][2] + A[0][3] * B[3][2];
1547 Temp[0][3] = A[0][0] * B[0][3] + A[0][1] * B[1][3] + A[0][2] * B[2][3] + A[0][3] * B[3][3];
1548
1549 Temp[1][0] = A[1][0] * B[0][0] + A[1][1] * B[1][0] + A[1][2] * B[2][0] + A[1][3] * B[3][0];
1550 Temp[1][1] = A[1][0] * B[0][1] + A[1][1] * B[1][1] + A[1][2] * B[2][1] + A[1][3] * B[3][1];
1551 Temp[1][2] = A[1][0] * B[0][2] + A[1][1] * B[1][2] + A[1][2] * B[2][2] + A[1][3] * B[3][2];
1552 Temp[1][3] = A[1][0] * B[0][3] + A[1][1] * B[1][3] + A[1][2] * B[2][3] + A[1][3] * B[3][3];
1553
1554 Temp[2][0] = A[2][0] * B[0][0] + A[2][1] * B[1][0] + A[2][2] * B[2][0] + A[2][3] * B[3][0];
1555 Temp[2][1] = A[2][0] * B[0][1] + A[2][1] * B[1][1] + A[2][2] * B[2][1] + A[2][3] * B[3][1];
1556 Temp[2][2] = A[2][0] * B[0][2] + A[2][1] * B[1][2] + A[2][2] * B[2][2] + A[2][3] * B[3][2];
1557 Temp[2][3] = A[2][0] * B[0][3] + A[2][1] * B[1][3] + A[2][2] * B[2][3] + A[2][3] * B[3][3];
1558
1559 Temp[3][0] = A[3][0] * B[0][0] + A[3][1] * B[1][0] + A[3][2] * B[2][0] + A[3][3] * B[3][0];
1560 Temp[3][1] = A[3][0] * B[0][1] + A[3][1] * B[1][1] + A[3][2] * B[2][1] + A[3][3] * B[3][1];
1561 Temp[3][2] = A[3][0] * B[0][2] + A[3][1] * B[1][2] + A[3][2] * B[2][2] + A[3][3] * B[3][2];
1562 Temp[3][3] = A[3][0] * B[0][3] + A[3][1] * B[1][3] + A[3][2] * B[2][3] + A[3][3] * B[3][3];
1563 memcpy(Result, &Temp, 16 * sizeof(double));
1564}
1565
1567{
1568 typedef float Float4x4[4][4];
1569 const Float4x4& A = *((const Float4x4*)Matrix1);
1570 const Float4x4& B = *((const Float4x4*)Matrix2);
1571 Float4x4 Temp;
1572 Temp[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0] + A[0][2] * B[2][0] + A[0][3] * B[3][0];
1573 Temp[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1] + A[0][2] * B[2][1] + A[0][3] * B[3][1];
1574 Temp[0][2] = A[0][0] * B[0][2] + A[0][1] * B[1][2] + A[0][2] * B[2][2] + A[0][3] * B[3][2];
1575 Temp[0][3] = A[0][0] * B[0][3] + A[0][1] * B[1][3] + A[0][2] * B[2][3] + A[0][3] * B[3][3];
1576
1577 Temp[1][0] = A[1][0] * B[0][0] + A[1][1] * B[1][0] + A[1][2] * B[2][0] + A[1][3] * B[3][0];
1578 Temp[1][1] = A[1][0] * B[0][1] + A[1][1] * B[1][1] + A[1][2] * B[2][1] + A[1][3] * B[3][1];
1579 Temp[1][2] = A[1][0] * B[0][2] + A[1][1] * B[1][2] + A[1][2] * B[2][2] + A[1][3] * B[3][2];
1580 Temp[1][3] = A[1][0] * B[0][3] + A[1][1] * B[1][3] + A[1][2] * B[2][3] + A[1][3] * B[3][3];
1581
1582 Temp[2][0] = A[2][0] * B[0][0] + A[2][1] * B[1][0] + A[2][2] * B[2][0] + A[2][3] * B[3][0];
1583 Temp[2][1] = A[2][0] * B[0][1] + A[2][1] * B[1][1] + A[2][2] * B[2][1] + A[2][3] * B[3][1];
1584 Temp[2][2] = A[2][0] * B[0][2] + A[2][1] * B[1][2] + A[2][2] * B[2][2] + A[2][3] * B[3][2];
1585 Temp[2][3] = A[2][0] * B[0][3] + A[2][1] * B[1][3] + A[2][2] * B[2][3] + A[2][3] * B[3][3];
1586
1587 Temp[3][0] = A[3][0] * B[0][0] + A[3][1] * B[1][0] + A[3][2] * B[2][0] + A[3][3] * B[3][0];
1588 Temp[3][1] = A[3][0] * B[0][1] + A[3][1] * B[1][1] + A[3][2] * B[2][1] + A[3][3] * B[3][1];
1589 Temp[3][2] = A[3][0] * B[0][2] + A[3][1] * B[1][2] + A[3][2] * B[2][2] + A[3][3] * B[3][2];
1590 Temp[3][3] = A[3][0] * B[0][3] + A[3][1] * B[1][3] + A[3][2] * B[2][3] + A[3][3] * B[3][3];
1591 memcpy(Result, &Temp, 16 * sizeof(float));
1592}
1593
1594
1611
1620{
1621 typedef float Float4x4[4][4];
1622 VectorRegister4Float Result;
1623 const Float4x4& M = *((const Float4x4*)MatrixM);
1624
1625 Result.V[0] = VecP.V[0] * M[0][0] + VecP.V[1] * M[1][0] + VecP.V[2] * M[2][0] + VecP.V[3] * M[3][0];
1626 Result.V[1] = VecP.V[0] * M[0][1] + VecP.V[1] * M[1][1] + VecP.V[2] * M[2][1] + VecP.V[3] * M[3][1];
1627 Result.V[2] = VecP.V[0] * M[0][2] + VecP.V[1] * M[1][2] + VecP.V[2] * M[2][2] + VecP.V[3] * M[3][2];
1628 Result.V[3] = VecP.V[0] * M[0][3] + VecP.V[1] * M[1][3] + VecP.V[2] * M[2][3] + VecP.V[3] * M[3][3];
1629
1630 return Result;
1631}
1632
1634{
1635 typedef double Double4x4[4][4];
1636 VectorRegister4Double Tmp, Result;
1638 const Double4x4& M = *((const Double4x4*)MatrixM);
1639
1640 Result.V[0] = Tmp.V[0] * M[0][0] + Tmp.V[1] * M[1][0] + Tmp.V[2] * M[2][0] + Tmp.V[3] * M[3][0];
1641 Result.V[1] = Tmp.V[0] * M[0][1] + Tmp.V[1] * M[1][1] + Tmp.V[2] * M[2][1] + Tmp.V[3] * M[3][1];
1642 Result.V[2] = Tmp.V[0] * M[0][2] + Tmp.V[1] * M[1][2] + Tmp.V[2] * M[2][2] + Tmp.V[3] * M[3][2];
1643 Result.V[3] = Tmp.V[0] * M[0][3] + Tmp.V[1] * M[1][3] + Tmp.V[2] * M[2][3] + Tmp.V[3] * M[3][3];
1644
1645 // TODO: this will be a lossy conversion.
1646 return MakeVectorRegisterFloatFromDouble(Result);
1647}
1648
1650{
1651 typedef double Double4x4[4][4];
1652 VectorRegister4Double Result;
1653 const Double4x4& M = *((const Double4x4*)MatrixM);
1654
1655 Result.V[0] = VecP.V[0] * M[0][0] + VecP.V[1] * M[1][0] + VecP.V[2] * M[2][0] + VecP.V[3] * M[3][0];
1656 Result.V[1] = VecP.V[0] * M[0][1] + VecP.V[1] * M[1][1] + VecP.V[2] * M[2][1] + VecP.V[3] * M[3][1];
1657 Result.V[2] = VecP.V[0] * M[0][2] + VecP.V[1] * M[1][2] + VecP.V[2] * M[2][2] + VecP.V[3] * M[3][2];
1658 Result.V[3] = VecP.V[0] * M[0][3] + VecP.V[1] * M[1][3] + VecP.V[2] * M[2][3] + VecP.V[3] * M[3][3];
1659
1660 return Result;
1661}
1662
1664{
1665 typedef float Float4x4[4][4];
1666 typedef double Double4x4[4][4];
1667 VectorRegister4Double Result;
1668 const Float4x4& M = *((const Float4x4*)MatrixM);
1669
1670 Result.V[0] = VecP.V[0] * M[0][0] + VecP.V[1] * M[1][0] + VecP.V[2] * M[2][0] + VecP.V[3] * M[3][0];
1671 Result.V[1] = VecP.V[0] * M[0][1] + VecP.V[1] * M[1][1] + VecP.V[2] * M[2][1] + VecP.V[3] * M[3][1];
1672 Result.V[2] = VecP.V[0] * M[0][2] + VecP.V[1] * M[1][2] + VecP.V[2] * M[2][2] + VecP.V[3] * M[3][2];
1673 Result.V[3] = VecP.V[0] * M[0][3] + VecP.V[1] * M[1][3] + VecP.V[2] * M[2][3] + VecP.V[3] * M[3][3];
1674
1675 return Result;
1676}
1677
1678
1687{
1689 Vec.V[0] = FMath::Min(Vec1.V[0], Vec2.V[0]);
1690 Vec.V[1] = FMath::Min(Vec1.V[1], Vec2.V[1]);
1691 Vec.V[2] = FMath::Min(Vec1.V[2], Vec2.V[2]);
1692 Vec.V[3] = FMath::Min(Vec1.V[3], Vec2.V[3]);
1693 return Vec;
1694}
1695
1697{
1699 Vec.V[0] = FMath::Min(Vec1.V[0], Vec2.V[0]);
1700 Vec.V[1] = FMath::Min(Vec1.V[1], Vec2.V[1]);
1701 Vec.V[2] = FMath::Min(Vec1.V[2], Vec2.V[2]);
1702 Vec.V[3] = FMath::Min(Vec1.V[3], Vec2.V[3]);
1703 return Vec;
1704}
1705
1714{
1716 Vec.V[0] = FMath::Max(Vec1.V[0], Vec2.V[0]);
1717 Vec.V[1] = FMath::Max(Vec1.V[1], Vec2.V[1]);
1718 Vec.V[2] = FMath::Max(Vec1.V[2], Vec2.V[2]);
1719 Vec.V[3] = FMath::Max(Vec1.V[3], Vec2.V[3]);
1720 return Vec;
1721}
1722
1724{
1726 Vec.V[0] = FMath::Max(Vec1.V[0], Vec2.V[0]);
1727 Vec.V[1] = FMath::Max(Vec1.V[1], Vec2.V[1]);
1728 Vec.V[2] = FMath::Max(Vec1.V[2], Vec2.V[2]);
1729 Vec.V[3] = FMath::Max(Vec1.V[3], Vec2.V[3]);
1730 return Vec;
1731}
1732
1744
1749
1761
1766
1767
1778{
1779 OutEvens = MakeVectorRegister(Lo.V[0], Lo.V[2], Hi.V[0], Hi.V[2]);
1780 OutOdds = MakeVectorRegister(Lo.V[1], Lo.V[3], Hi.V[1], Hi.V[3]);
1781}
1782
1784{
1785 OutEvens = MakeVectorRegister(Lo.V[0], Lo.V[2], Hi.V[0], Hi.V[2]);
1786 OutOdds = MakeVectorRegister(Lo.V[1], Lo.V[3], Hi.V[1], Hi.V[3]);
1787}
1788
1789
1801
1806
1814#define VectorLoadByte4( Ptr ) MakeVectorRegisterFloat( float(((const uint8*)(Ptr))[0]), float(((const uint8*)(Ptr))[1]), float(((const uint8*)(Ptr))[2]), float(((const uint8*)(Ptr))[3]) )
1815
1823#define VectorLoadSignedByte4( Ptr ) MakeVectorRegisterFloat( float(((const int8*)(Ptr))[0]), float(((const int8*)(Ptr))[1]), float(((const int8*)(Ptr))[2]), float(((const int8*)(Ptr))[3]) )
1824
1825
1833#define VectorLoadByte4Reverse( Ptr ) MakeVectorRegisterFloat( float(((const uint8*)(Ptr))[3]), float(((const uint8*)(Ptr))[2]), float(((const uint8*)(Ptr))[1]), float(((const uint8*)(Ptr))[0]) )
1834
1843{
1844 uint8 *BytePtr = (uint8*) Ptr;
1845 BytePtr[0] = uint8( Vec.V[0] );
1846 BytePtr[1] = uint8( Vec.V[1] );
1847 BytePtr[2] = uint8( Vec.V[2] );
1848 BytePtr[3] = uint8( Vec.V[3] );
1849}
1850
1859{
1860 int8 *BytePtr = (int8*)Ptr;
1861 BytePtr[0] = int8(Vec.V[0]);
1862 BytePtr[1] = int8(Vec.V[1]);
1863 BytePtr[2] = int8(Vec.V[2]);
1864 BytePtr[3] = int8(Vec.V[3]);
1865}
1866
1867
1876{
1877 float V[4];
1878 uint32 E = *(uint32*)Ptr;
1879
1880 V[0] = float((E >> 00) & 0x3FF) / 1023.0f;
1881 V[1] = float((E >> 10) & 0x3FF) / 1023.0f;
1882 V[2] = float((E >> 20) & 0x3FF) / 1023.0f;
1883 V[3] = float((E >> 30) & 0x3) / 3.0f;
1884
1885 return MakeVectorRegisterFloat(V[0], V[1], V[2], V[3]);
1886}
1887
1896{
1898 Tmp = VectorMax(Vec, MakeVectorRegisterFloat(0.0f, 0.0f, 0.0f, 0.0f));
1899 Tmp = VectorMin(Tmp, MakeVectorRegisterFloat(1.0f, 1.0f, 1.0f, 1.0f));
1900 Tmp = VectorMultiply(Tmp, MakeVectorRegisterFloat(1023.0f, 1023.0f, 1023.0f, 3.0f));
1901
1902 uint32* Out = (uint32*)Ptr;
1903 *Out =
1904 (uint32(Tmp.V[0]) & 0x3FF) << 00 |
1905 (uint32(Tmp.V[1]) & 0x3FF) << 10 |
1906 (uint32(Tmp.V[2]) & 0x3FF) << 20 |
1907 (uint32(Tmp.V[3]) & 0x003) << 30;
1908}
1909
1918{
1919 // Note: Bitwise OR:ing all results together to avoid branching.
1920 return (Vec1.V[0] > Vec2.V[0]) | (Vec1.V[1] > Vec2.V[1]) | (Vec1.V[2] > Vec2.V[2]) | (Vec1.V[3] > Vec2.V[3]);
1921}
1922
1924{
1925 // Note: Bitwise OR:ing all results together to avoid branching.
1926 return (Vec1.V[0] > Vec2.V[0]) | (Vec1.V[1] > Vec2.V[1]) | (Vec1.V[2] > Vec2.V[2]) | (Vec1.V[3] > Vec2.V[3]);
1927}
1928
1933#define VectorResetFloatRegisters()
1934
1940#define VectorGetControlRegister() 0
1941
1947#define VectorSetControlRegister(ControlStatus)
1948
1952#define VECTOR_ROUND_TOWARD_ZERO 0
1953
1957#define VECTOR_DENORMALS_FLUSH_TO_ZERO 0
1958
1959// Returns true if the vector contains a component that is either NAN or +/-infinite.
1961{
1962 return !FMath::IsFinite(Vec.V[0]) || !FMath::IsFinite(Vec.V[1]) || !FMath::IsFinite(Vec.V[2]) || !FMath::IsFinite(Vec.V[3]);
1963}
1964
1966{
1967 return !FMath::IsFinite(Vec.V[0]) || !FMath::IsFinite(Vec.V[1]) || !FMath::IsFinite(Vec.V[2]) || !FMath::IsFinite(Vec.V[3]);
1968}
1969
1970
1972{
1973 return MakeVectorRegisterFloat(FMath::Exp(Vec.V[0]), FMath::Exp(Vec.V[1]), FMath::Exp(Vec.V[2]), FMath::Exp(Vec.V[3]));
1974}
1975
1977{
1978 return MakeVectorRegisterDouble(FMath::Exp(Vec.V[0]), FMath::Exp(Vec.V[1]), FMath::Exp(Vec.V[2]), FMath::Exp(Vec.V[3]));
1979}
1980
1981
1983{
1984 return MakeVectorRegisterFloat(FMath::Exp2(Vec.V[0]), FMath::Exp2(Vec.V[1]), FMath::Exp2(Vec.V[2]), FMath::Exp2(Vec.V[3]));
1985}
1986
1988{
1989 return MakeVectorRegisterDouble(FMath::Exp2(Vec.V[0]), FMath::Exp2(Vec.V[1]), FMath::Exp2(Vec.V[2]), FMath::Exp2(Vec.V[3]));
1990}
1991
1992
1994{
1995 return MakeVectorRegisterFloat(FMath::Loge(Vec.V[0]), FMath::Loge(Vec.V[1]), FMath::Loge(Vec.V[2]), FMath::Loge(Vec.V[3]));
1996}
1997
1999{
2000 return MakeVectorRegisterDouble(FMath::Loge(Vec.V[0]), FMath::Loge(Vec.V[1]), FMath::Loge(Vec.V[2]), FMath::Loge(Vec.V[3]));
2001}
2002
2003
2008
2013
2014
2016{
2017 return MakeVectorRegisterFloat(FMath::Sin(Vec.V[0]), FMath::Sin(Vec.V[1]), FMath::Sin(Vec.V[2]), FMath::Sin(Vec.V[3]));
2018}
2019
2021{
2022 return MakeVectorRegisterDouble(FMath::Sin(Vec.V[0]), FMath::Sin(Vec.V[1]), FMath::Sin(Vec.V[2]), FMath::Sin(Vec.V[3]));
2023}
2024
2025
2026
2028{
2029 return MakeVectorRegisterFloat(FMath::Cos(Vec.V[0]), FMath::Cos(Vec.V[1]), FMath::Cos(Vec.V[2]), FMath::Cos(Vec.V[3]));
2030}
2031
2033{
2034 return MakeVectorRegisterDouble(FMath::Cos(Vec.V[0]), FMath::Cos(Vec.V[1]), FMath::Cos(Vec.V[2]), FMath::Cos(Vec.V[3]));
2035}
2036
2037
2038
2040{
2041 return MakeVectorRegisterFloat(FMath::Tan(Vec.V[0]), FMath::Tan(Vec.V[1]), FMath::Tan(Vec.V[2]), FMath::Tan(Vec.V[3]));
2042}
2043
2045{
2046 return MakeVectorRegisterDouble(FMath::Tan(Vec.V[0]), FMath::Tan(Vec.V[1]), FMath::Tan(Vec.V[2]), FMath::Tan(Vec.V[3]));
2047}
2048
2049
2051{
2052 return MakeVectorRegisterFloat(FMath::Asin(Vec.V[0]), FMath::Asin(Vec.V[1]), FMath::Asin(Vec.V[2]), FMath::Asin(Vec.V[3]));
2053}
2054
2056{
2057 return MakeVectorRegisterDouble(FMath::Asin(Vec.V[0]), FMath::Asin(Vec.V[1]), FMath::Asin(Vec.V[2]), FMath::Asin(Vec.V[3]));
2058}
2059
2060
2062{
2063 return MakeVectorRegisterFloat(FMath::Acos(Vec.V[0]), FMath::Acos(Vec.V[1]), FMath::Acos(Vec.V[2]), FMath::Acos(Vec.V[3]));
2064}
2065
2067{
2068 return MakeVectorRegisterDouble(FMath::Acos(Vec.V[0]), FMath::Acos(Vec.V[1]), FMath::Acos(Vec.V[2]), FMath::Acos(Vec.V[3]));
2069}
2070
2071
2073{
2074 return MakeVectorRegisterFloat(FMath::Atan(Vec.V[0]), FMath::Atan(Vec.V[1]), FMath::Atan(Vec.V[2]), FMath::Atan(Vec.V[3]));
2075}
2076
2078{
2079 return MakeVectorRegisterDouble(FMath::Atan(Vec.V[0]), FMath::Atan(Vec.V[1]), FMath::Atan(Vec.V[2]), FMath::Atan(Vec.V[3]));
2080}
2081
2082
2084{
2086 FMath::Atan2(Y.V[0], X.V[0]),
2087 FMath::Atan2(Y.V[1], X.V[1]),
2088 FMath::Atan2(Y.V[2], X.V[2]),
2089 FMath::Atan2(Y.V[3], X.V[3]));
2090}
2091
2093{
2095 FMath::Atan2(Y.V[0], X.V[0]),
2096 FMath::Atan2(Y.V[1], X.V[1]),
2097 FMath::Atan2(Y.V[2], X.V[2]),
2098 FMath::Atan2(Y.V[3], X.V[3]));
2099}
2100
2101
2110{
2111 union { VectorRegister4Float v; float f[4]; } VecSin, VecCos, VecAngles;
2112 VecAngles.v = *VAngles;
2113
2114 FMath::SinCos(&VecSin.f[0], &VecCos.f[0], VecAngles.f[0]);
2115 FMath::SinCos(&VecSin.f[1], &VecCos.f[1], VecAngles.f[1]);
2116 FMath::SinCos(&VecSin.f[2], &VecCos.f[2], VecAngles.f[2]);
2117 FMath::SinCos(&VecSin.f[3], &VecCos.f[3], VecAngles.f[3]);
2118
2119 *VSinAngles = VecSin.v;
2120 *VCosAngles = VecCos.v;
2121}
2122
2124{
2125 // TODO: No FMath::SinCos<double> function exists yet, but need to revisit if one is added
2126 *VSinAngles = VectorSin(*VAngles);
2127 *VCosAngles = VectorCos(*VAngles);
2128}
2129
2130
2132{
2133 return MakeVectorRegisterFloat(FMath::CeilToFloat(Vec.V[0]), FMath::CeilToFloat(Vec.V[1]), FMath::CeilToFloat(Vec.V[2]), FMath::CeilToFloat(Vec.V[3]));
2134}
2135
2137{
2138 return MakeVectorRegisterDouble(FMath::CeilToDouble(Vec.V[0]), FMath::CeilToDouble(Vec.V[1]), FMath::CeilToDouble(Vec.V[2]), FMath::CeilToDouble(Vec.V[3]));
2139}
2140
2141
2143{
2144 return MakeVectorRegisterFloat(FMath::FloorToFloat(Vec.V[0]), FMath::FloorToFloat(Vec.V[1]), FMath::FloorToFloat(Vec.V[2]), FMath::FloorToFloat(Vec.V[3]));
2145}
2146
2148{
2149 return MakeVectorRegisterDouble(FMath::FloorToDouble(Vec.V[0]), FMath::FloorToDouble(Vec.V[1]), FMath::FloorToDouble(Vec.V[2]), FMath::FloorToDouble(Vec.V[3]));
2150}
2151
2152
2154{
2155 return MakeVectorRegisterFloat(FMath::TruncToFloat(Vec.V[0]), FMath::TruncToFloat(Vec.V[1]), FMath::TruncToFloat(Vec.V[2]), FMath::TruncToFloat(Vec.V[3]));
2156}
2157
2159{
2160 return MakeVectorRegisterDouble(FMath::TruncToDouble(Vec.V[0]), FMath::TruncToDouble(Vec.V[1]), FMath::TruncToDouble(Vec.V[2]), FMath::TruncToDouble(Vec.V[3]));
2161}
2162
2163
2165{
2166 return MakeVectorRegisterFloat(FMath::RoundToFloat(Vec.V[0]), FMath::RoundToFloat(Vec.V[1]), FMath::RoundToFloat(Vec.V[2]), FMath::RoundToFloat(Vec.V[3]));
2167}
2168
2170{
2171 return MakeVectorRegisterDouble(FMath::RoundToDouble(Vec.V[0]), FMath::RoundToDouble(Vec.V[1]), FMath::RoundToDouble(Vec.V[2]), FMath::RoundToDouble(Vec.V[3]));
2172}
2173
2174
2183
2184
2186{
2188 FMath::Fmod(X.V[0], Y.V[0]),
2189 FMath::Fmod(X.V[1], Y.V[1]),
2190 FMath::Fmod(X.V[2], Y.V[2]),
2191 FMath::Fmod(X.V[3], Y.V[3]));
2192}
2193
2195{
2197 FMath::Fmod(X.V[0], Y.V[0]),
2198 FMath::Fmod(X.V[1], Y.V[1]),
2199 FMath::Fmod(X.V[2], Y.V[2]),
2200 FMath::Fmod(X.V[3], Y.V[3]));
2201}
2202
2203
2205{
2207 (float)(Vec.V[0] >= 0.0f ? 1.0f : -1.0f),
2208 (float)(Vec.V[1] >= 0.0f ? 1.0f : -1.0f),
2209 (float)(Vec.V[2] >= 0.0f ? 1.0f : -1.0f),
2210 (float)(Vec.V[3] >= 0.0f ? 1.0f : -1.0f));
2211}
2212
2214{
2216 (double)(Vec.V[0] >= 0.0 ? 1.0 : -1.0),
2217 (double)(Vec.V[1] >= 0.0 ? 1.0 : -1.0),
2218 (double)(Vec.V[2] >= 0.0 ? 1.0 : -1.0),
2219 (double)(Vec.V[3] >= 0.0 ? 1.0 : -1.0));
2220}
2221
2222
2224{
2226 (float)(Vec.V[0] >= 0.0f ? 1.0f : 0.0f),
2227 (float)(Vec.V[1] >= 0.0f ? 1.0f : 0.0f),
2228 (float)(Vec.V[2] >= 0.0f ? 1.0f : 0.0f),
2229 (float)(Vec.V[3] >= 0.0f ? 1.0f : 0.0f));
2230}
2231
2233{
2235 (double)(Vec.V[0] >= 0.0 ? 1.0 : 0.0),
2236 (double)(Vec.V[1] >= 0.0 ? 1.0 : 0.0),
2237 (double)(Vec.V[2] >= 0.0 ? 1.0 : 0.0),
2238 (double)(Vec.V[3] >= 0.0 ? 1.0 : 0.0));
2239}
2240
2249{
2250 float V[4];
2251 uint16* E = (uint16*)Ptr;
2252
2253 V[0] = float(E[0]);
2254 V[1] = float(E[1]);
2255 V[2] = float(E[2]);
2256 V[3] = float(E[3]);
2257
2258 return MakeVectorRegisterFloat(V[0], V[1], V[2], V[3]);
2259}
2260
2269{
2270 float V[4];
2271 int16* E = (int16*)Ptr;
2272
2273 V[0] = float(E[0]);
2274 V[1] = float(E[1]);
2275 V[2] = float(E[2]);
2276 V[3] = float(E[3]);
2277
2278 return MakeVectorRegisterFloat(V[0], V[1], V[2], V[3]);
2279}
2280
2289{
2291 Tmp = VectorMax(Vec, MakeVectorRegisterFloat(0.0f, 0.0f, 0.0f, 0.0f));
2292 Tmp = VectorMin(Tmp, MakeVectorRegisterFloat(1.0f, 1.0f, 1.0f, 1.0f));
2293 Tmp = VectorMultiplyAdd(Tmp, MakeVectorRegisterFloat(65535.0f, 65535.0f, 65535.0f, 65535.0f), MakeVectorRegisterFloat(0.5f, 0.5f, 0.5f, 0.5f));
2294 Tmp = VectorTruncate(Tmp);
2295
2296 uint16* Out = (uint16*)Ptr;
2297 Out[0] = (uint16)Tmp.V[0];
2298 Out[1] = (uint16)Tmp.V[0];
2299 Out[2] = (uint16)Tmp.V[0];
2300 Out[3] = (uint16)Tmp.V[0];
2301}
2302
2304//Integer ops
2305
2306//Bitwise
2309{
2310 return MakeVectorRegisterInt(
2311 A.V[0] & B.V[0],
2312 A.V[1] & B.V[1],
2313 A.V[2] & B.V[2],
2314 A.V[3] & B.V[3]);
2315}
2316
2319{
2320 return MakeVectorRegisterInt(
2321 A.V[0] | B.V[0],
2322 A.V[1] | B.V[1],
2323 A.V[2] | B.V[2],
2324 A.V[3] | B.V[3]);
2325}
2328{
2329 return MakeVectorRegisterInt(
2330 A.V[0] ^ B.V[0],
2331 A.V[1] ^ B.V[1],
2332 A.V[2] ^ B.V[2],
2333 A.V[3] ^ B.V[3]);
2334}
2335
2338{
2339 return MakeVectorRegisterInt(
2340 (~A.V[0]) & B.V[0],
2341 (~A.V[1]) & B.V[1],
2342 (~A.V[2]) & B.V[2],
2343 (~A.V[3]) & B.V[3]);
2344}
2347{
2348 return MakeVectorRegisterInt(
2349 ~A.V[0],
2350 ~A.V[1],
2351 ~A.V[2],
2352 ~A.V[3]);
2353}
2354
2355//Comparison
2357{
2358 return MakeVectorRegisterInt(
2359 A.V[0] == B.V[0] ? 0xFFFFFFFF : 0,
2360 A.V[1] == B.V[1] ? 0xFFFFFFFF : 0,
2361 A.V[2] == B.V[2] ? 0xFFFFFFFF : 0,
2362 A.V[3] == B.V[3] ? 0xFFFFFFFF : 0);
2363}
2364
2366{
2367 return MakeVectorRegisterInt(
2368 A.V[0] != B.V[0] ? 0xFFFFFFFF : 0,
2369 A.V[1] != B.V[1] ? 0xFFFFFFFF : 0,
2370 A.V[2] != B.V[2] ? 0xFFFFFFFF : 0,
2371 A.V[3] != B.V[3] ? 0xFFFFFFFF : 0);
2372}
2373
2375{
2376 return MakeVectorRegisterInt(
2377 A.V[0] > B.V[0] ? 0xFFFFFFFF : 0,
2378 A.V[1] > B.V[1] ? 0xFFFFFFFF : 0,
2379 A.V[2] > B.V[2] ? 0xFFFFFFFF : 0,
2380 A.V[3] > B.V[3] ? 0xFFFFFFFF : 0);
2381}
2382
2384{
2385 return MakeVectorRegisterInt(
2386 A.V[0] < B.V[0] ? 0xFFFFFFFF : 0,
2387 A.V[1] < B.V[1] ? 0xFFFFFFFF : 0,
2388 A.V[2] < B.V[2] ? 0xFFFFFFFF : 0,
2389 A.V[3] < B.V[3] ? 0xFFFFFFFF : 0);
2390}
2391
2393{
2394 return MakeVectorRegisterInt(
2395 A.V[0] >= B.V[0] ? 0xFFFFFFFF : 0,
2396 A.V[1] >= B.V[1] ? 0xFFFFFFFF : 0,
2397 A.V[2] >= B.V[2] ? 0xFFFFFFFF : 0,
2398 A.V[3] >= B.V[3] ? 0xFFFFFFFF : 0);
2399}
2400
2402{
2403 return MakeVectorRegisterInt(
2404 A.V[0] <= B.V[0] ? 0xFFFFFFFF : 0,
2405 A.V[1] <= B.V[1] ? 0xFFFFFFFF : 0,
2406 A.V[2] <= B.V[2] ? 0xFFFFFFFF : 0,
2407 A.V[3] <= B.V[3] ? 0xFFFFFFFF : 0);
2408}
2409
2410
2415
2416//Arithmetic
2418{
2419 return MakeVectorRegisterInt(
2420 A.V[0] + B.V[0],
2421 A.V[1] + B.V[1],
2422 A.V[2] + B.V[2],
2423 A.V[3] + B.V[3]);
2424}
2425
2427{
2428 return MakeVectorRegisterInt(
2429 A.V[0] - B.V[0],
2430 A.V[1] - B.V[1],
2431 A.V[2] - B.V[2],
2432 A.V[3] - B.V[3]);
2433}
2434
2436{
2437 return MakeVectorRegisterInt(
2438 A.V[0] * B.V[0],
2439 A.V[1] * B.V[1],
2440 A.V[2] * B.V[2],
2441 A.V[3] * B.V[3]);
2442}
2443
2445{
2446 return MakeVectorRegisterInt(
2447 -A.V[0],
2448 -A.V[1],
2449 -A.V[2],
2450 -A.V[3]);
2451}
2452
2454{
2455 return MakeVectorRegisterInt(
2456 FMath::Min(A.V[0] , B.V[0]),
2457 FMath::Min(A.V[1] , B.V[1]),
2458 FMath::Min(A.V[2] , B.V[2]),
2459 FMath::Min(A.V[3] , B.V[3]));
2460}
2461
2463{
2464 return MakeVectorRegisterInt(
2465 FMath::Max(A.V[0], B.V[0]),
2466 FMath::Max(A.V[1], B.V[1]),
2467 FMath::Max(A.V[2], B.V[2]),
2468 FMath::Max(A.V[3], B.V[3]));
2469}
2470
2472{
2473 return MakeVectorRegisterInt(
2474 FMath::Abs(A.V[0]),
2475 FMath::Abs(A.V[1]),
2476 FMath::Abs(A.V[2]),
2477 FMath::Abs(A.V[3]));
2478}
2479
2480#define VectorIntSign(A) VectorIntSelect( VectorIntCompareGE(A, GlobalVectorConstants::IntZero), GlobalVectorConstants::IntOne, GlobalVectorConstants::IntMinusOne )
2481
2483{
2485 (float)A.V[0],
2486 (float)A.V[1],
2487 (float)A.V[2],
2488 (float)A.V[3]);
2489}
2490
2492{
2493 return MakeVectorRegisterInt(
2494 (int32)A.V[0],
2495 (int32)A.V[1],
2496 (int32)A.V[2],
2497 (int32)A.V[3]);
2498}
2499
2500// TODO: LWC: potential loss of data
2502{
2503 return MakeVectorRegisterInt(
2504 (int32)A.V[0],
2505 (int32)A.V[1],
2506 (int32)A.V[2],
2507 (int32)A.V[3]);
2508}
2509
2514
2516{
2517 const int8* VecPtr = (const int8*)&Vec;
2518 const uint8* MaskPtr = (const uint8*)&Mask;
2519
2521 int8* OutPtr = (int8*)&OutVec;
2522
2523 constexpr uint32 NumBytes = sizeof(VectorRegister4Int);
2524
2525 // We use 0x10 here to denote zero fill which is compatible with both SSE, which uses >= 0x80,
2526 // and Neon, which uses >= number of source bytes
2527 constexpr uint32 ZeroFill = NumBytes;
2528
2529 for (uint32 Index = 0; Index < NumBytes; ++Index)
2530 {
2531 uint32 M = MaskPtr[Index];
2532 OutPtr[Index] = (M < ZeroFill) ? VecPtr[M] : 0;
2533 }
2534
2535 return OutVec;
2536}
2537
2538//Loads and stores
2539
2546FORCEINLINE void VectorIntStore(const VectorRegister4Int& A, const void* Ptr)
2547{
2548 int32* IntPtr = (int32*)Ptr;
2549 IntPtr[0] = A.V[0];
2550 IntPtr[1] = A.V[1];
2551 IntPtr[2] = A.V[2];
2552 IntPtr[3] = A.V[3];
2553}
2554
2563{
2564 int32* IntPtr = (int32*)Ptr;
2565 return MakeVectorRegisterInt(
2566 IntPtr[0],
2567 IntPtr[1],
2568 IntPtr[2],
2569 IntPtr[3]);
2570}
2571
2579{
2580 int32* IntPtr = (int32*)Ptr;
2581 IntPtr[0] = A.V[0];
2582 IntPtr[1] = A.V[1];
2583 IntPtr[2] = A.V[2];
2584 IntPtr[3] = A.V[3];
2585}
2586
2594{
2595 int32* IntPtr = (int32*)Ptr;
2596 return MakeVectorRegisterInt(
2597 IntPtr[0],
2598 IntPtr[1],
2599 IntPtr[2],
2600 IntPtr[3]);
2601}
2602
2610{
2611 int32 IntSplat = *(int32*)Ptr;
2612
2613 return MakeVectorRegisterInt(
2614 IntSplat,
2615 IntSplat,
2616 IntSplat,
2617 IntSplat);
2618}
2619
2628{
2629 int64* IntPtr = (int64*)Ptr;
2631 IntPtr[0],
2632 IntPtr[1]);
2633}
2634
2643{
2644 double* DoublePtr = (double*)Ptr;
2646 DoublePtr[0],
2647 DoublePtr[1]);
2648}
2649
2650#define VectorSetZero() MakeVectorRegisterFloat(0.f, 0.f, 0.f, 0.f)
2651#define VectorSet1(F) VectorSetFloat1(F)
2652#define VectorIntSet1(F) MakeVectorRegisterInt(F, F, F, F)
2653#define VectorCastIntToFloat(Vec) VectorLoad((float*)(Vec.V))
2654#define VectorCastFloatToInt(Vec) VectorIntLoad(Vec.V)
2655#define VectorCastDoubleToInt(Vec) VectorInt64Load(Vec.V)
2656#define VectorCastIntToDouble(Vec) VectorDoubleLoad(Vec.V)
2657#define VectorShuffleImmediate(Vec, I0, I1, I2, I3) VectorShuffle(Vec, Vec, I3, I2, I1, I0) // ShuffleImmediate shuffle is reversed from our logical shuffle.
2658#define VectorShiftLeftImm(Vec, ImmAmt) static_assert(false, "Unimplemented") // TODO: implement
2659#define VectorShiftRightImmArithmetic(Vec, ImmAmt) static_assert(false, "Unimplemented") // TODO: implement
2660#define VectorShiftRightImmLogical(Vec, ImmAmt) static_assert(false, "Unimplemented") // TODO: implement
2661#define VectorIntExpandLow16To32(V0) static_assert(false, "Unimplemented") // TODO: implement
#define FORCEINLINE
Definition AndroidPlatform.h:140
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
FPlatformTypes::int8 int8
An 8-bit signed integer.
Definition Platform.h:1121
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define RESTRICT
Definition Platform.h:706
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define X(Name, Desc)
Definition FormatStringSan.h:47
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
FORCEINLINE VectorRegister4Int MakeVectorRegisterInt(int32 X, int32 Y, int32 Z, int32 W)
Definition UnrealMathFPU.h:282
FORCEINLINE VectorRegister4Float VectorTan(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2039
FORCEINLINE VectorRegister4Float VectorSubtract(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:731
FORCEINLINE VectorRegister4Int VectorIntSubtract(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2426
FORCEINLINE void VectorDeinterleave(VectorRegister4Float &RESTRICT OutEvens, VectorRegister4Float &RESTRICT OutOdds, const VectorRegister4Float &RESTRICT Lo, const VectorRegister4Float &RESTRICT Hi)
Definition UnrealMathFPU.h:1777
FORCEINLINE VectorRegister4Double VectorLoadFloat3(const double *Ptr)
Definition UnrealMathFPU.h:427
FORCEINLINE VectorRegister4Int VectorIntCompareLE(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2401
FORCEINLINE VectorRegister4Float VectorATan2(const VectorRegister4Float &Y, const VectorRegister4Float &X)
Definition UnrealMathFPU.h:2083
FORCEINLINE uint32 VectorAnyGreaterThan(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1917
FORCEINLINE VectorRegister4Float VectorSqrt(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1263
FORCEINLINE VectorRegister4Int VectorIntAbs(const VectorRegister4Int &A)
Definition UnrealMathFPU.h:2471
FORCEINLINE VectorRegister4Float VectorReciprocalSqrt(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1279
FORCEINLINE VectorRegister4Int VectorIntXor(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2327
FORCEINLINE bool VectorMatrixInverse(FMatrix44d *DstMatrix, const FMatrix44d *SrcMatrix)
Definition UnrealMathFPU.h:1603
FORCEINLINE VectorRegister4Float VectorLoadSRGBA16N(void *Ptr)
Definition UnrealMathFPU.h:2268
FORCEINLINE VectorRegister4Int VectorIntMin(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2453
FORCEINLINE VectorRegister4Float VectorDot3(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:880
FORCEINLINE VectorRegister4Float VectorMin(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1686
FORCEINLINE VectorRegister4Int VectorIntAndNot(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2337
FORCEINLINE float VectorGetComponentImpl(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:364
FORCEINLINE VectorRegister4x4Float VectorLoad16(const float *Ptr)
Definition UnrealMathFPU.h:410
FORCEINLINE VectorRegister4Float VectorDot4(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:901
FORCEINLINE VectorRegister4Float MakeVectorRegister(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:195
FORCEINLINE void VectorSinCos(VectorRegister4Float *RESTRICT VSinAngles, VectorRegister4Float *RESTRICT VCosAngles, const VectorRegister4Float *RESTRICT VAngles)
Definition UnrealMathFPU.h:2109
FORCEINLINE VectorRegister4Float VectorLoadURGB10A2N(void *Ptr)
Definition UnrealMathFPU.h:1875
FORCEINLINE VectorRegister2Double VectorDoubleLoad(const void *Ptr)
Definition UnrealMathFPU.h:2642
FORCEINLINE void VectorStoreSignedByte4(const VectorRegister4Float &Vec, void *Ptr)
Definition UnrealMathFPU.h:1858
FORCEINLINE VectorRegister4Float VectorSet_W1(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1407
FORCEINLINE void VectorIntStoreAligned(const VectorRegister4Int &A, const void *Ptr)
Definition UnrealMathFPU.h:2578
FORCEINLINE VectorRegister4Int VectorIntCompareNEQ(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2365
FORCEINLINE VectorRegister4Float VectorSetFloat1(float F)
Definition UnrealMathFPU.h:518
FORCEINLINE VectorRegister4Float VectorLog2(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2004
FORCEINLINE void VectorQuaternionMultiply(VectorRegister4Float *RESTRICT Result, const VectorRegister4Float *RESTRICT Quat1, const VectorRegister4Float *RESTRICT Quat2)
Definition UnrealMathFPU.h:1431
FORCEINLINE VectorRegister4Float VectorLoadURGBA16N(void *Ptr)
Definition UnrealMathFPU.h:2248
#define VectorShuffle(Vec1, Vec2, X, Y, Z, W)
Definition UnrealMathFPU.h:652
VectorRegister4Double VectorRegister4d
Definition UnrealMathFPU.h:90
FORCEINLINE VectorRegister4Int VectorIntLoad1(const void *Ptr)
Definition UnrealMathFPU.h:2609
FORCEINLINE VectorRegister4Float VectorTruncate(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2153
FORCEINLINE VectorRegister4Double VectorZeroDouble(void)
Definition UnrealMathFPU.h:336
FORCEINLINE VectorRegister4Float VectorDivide(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:834
FORCEINLINE VectorRegister4Float VectorMultiply(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:758
AlignedDouble4 AlignedRegister4
Definition UnrealMathFPU.h:150
FORCEINLINE VectorRegister4Float VectorMax(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1713
FORCEINLINE VectorRegister4Float VectorBitwiseAnd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1165
FORCEINLINE VectorRegister4Float VectorLoadFloat1(const float *Ptr)
Definition UnrealMathFPU.h:468
FORCEINLINE VectorRegister4Float VectorReciprocalLen(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1343
FORCEINLINE constexpr VectorRegister4Float MakeVectorRegisterFloatConstant(float X, float Y, float Z, float W)
Definition UnrealMathFPU.h:297
FORCEINLINE VectorRegister4Int VectorIntCompareGE(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2392
FORCEINLINE VectorRegister4Int VectorIntNegate(const VectorRegister4Int &A)
Definition UnrealMathFPU.h:2444
FORCEINLINE VectorRegister4Int VectorIntLoad(const void *Ptr)
Definition UnrealMathFPU.h:2562
FORCEINLINE VectorRegister4Float VectorCos(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2027
FORCEINLINE VectorRegister4Int VectorInt64Load(const void *Ptr)
Definition UnrealMathFPU.h:2627
FORCEINLINE VectorRegister4Float VectorLoadFloat2(const float *Ptr)
Definition UnrealMathFPU.h:485
FORCEINLINE VectorRegister4Int VectorIntSelect(const VectorRegister4Int &Mask, const VectorRegister4Int &Vec1, const VectorRegister4Int &Vec2)
Definition UnrealMathFPU.h:2411
FORCEINLINE VectorRegister4Float VectorRound(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2164
FORCEINLINE void VectorStoreByte4(const VectorRegister4Float &Vec, void *Ptr)
Definition UnrealMathFPU.h:1842
FORCEINLINE VectorRegister4Float VectorCombineLow(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1757
VectorRegister4Double VectorRegister4
Definition UnrealMathFPU.h:94
FORCEINLINE void VectorStore16(const VectorRegister4x4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:582
FORCEINLINE VectorRegister4Float VectorReciprocalSqrtEstimate(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1295
FORCEINLINE VectorRegister4Int VectorIntOr(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2318
FORCEINLINE VectorRegister4Double VectorLoadDouble1(const double *Ptr)
Definition UnrealMathFPU.h:473
FORCEINLINE void VectorMatrixMultiply(FMatrix44d *Result, const FMatrix44d *Matrix1, const FMatrix44d *Matrix2)
Definition UnrealMathFPU.h:1538
VectorRegister4Float VectorLoadAligned(const float *Ptr)
Definition UnrealMathFPU.h:451
FORCEINLINE VectorRegister4Float VectorMultiplyAdd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2, const VectorRegister4Float &Vec3)
Definition UnrealMathFPU.h:786
VectorRegister4Int VectorRegister4i
Definition UnrealMathFPU.h:88
FORCEINLINE VectorRegister4Float VectorSelect(const VectorRegister4Float &Mask, const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1105
FORCEINLINE VectorRegister4Int VectorIntNot(const VectorRegister4Int &A)
Definition UnrealMathFPU.h:2346
FORCEINLINE VectorRegister4Float VectorExp(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1971
FORCEINLINE VectorRegister4Float VectorCompareGT(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:974
FORCEINLINE VectorRegister4Int VectorRoundToIntHalfToEven(const VectorRegister4Float &A)
Definition UnrealMathFPU.h:2175
FORCEINLINE VectorRegister4Double MakeVectorRegisterDoubleMask(uint64 X, uint64 Y, uint64 Z, uint64 W)
Definition UnrealMathFPU.h:206
FORCEINLINE VectorRegister4Float VectorExp2(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1982
FORCEINLINE VectorRegister4Float VectorASin(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2050
FORCEINLINE VectorRegister4Int VectorIntCompareEQ(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2356
FORCEINLINE VectorRegister4Float VectorLoadTwoPairsFloat(const float *Ptr1, const float *Ptr2)
Definition UnrealMathFPU.h:503
FORCEINLINE VectorRegister4Double VectorOneDouble(void)
Definition UnrealMathFPU.h:351
FORCEINLINE VectorRegister4Float VectorReciprocalLenEstimate(const VectorRegister4Float &Vector)
Definition UnrealMathFPU.h:1375
FORCEINLINE void VectorStore(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:566
FORCEINLINE VectorRegister4Float VectorTransformVector(const VectorRegister4Float &VecP, const FMatrix44f *MatrixM)
Definition UnrealMathFPU.h:1619
FORCEINLINE VectorRegister4Float VectorCompareGE(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1000
FORCEINLINE VectorRegister4Float VectorMod(const VectorRegister4Float &X, const VectorRegister4Float &Y)
Definition UnrealMathFPU.h:2185
FORCEINLINE VectorRegister4Int MakeVectorRegisterInt64(int64 X, int64 Y)
Definition UnrealMathFPU.h:307
FORCEINLINE VectorRegister4Float VectorCombineHigh(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1740
FORCEINLINE VectorRegister4Float VectorCompareLT(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1025
FORCEINLINE VectorRegister4Double MakeVectorRegisterDouble(uint64 X, uint64 Y, uint64 Z, uint64 W)
Definition UnrealMathFPU.h:185
VectorRegister4 VectorRegister
Definition UnrealMathFPU.h:95
FORCEINLINE void VectorStoreAlignedStreamed(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:550
FORCEINLINE float VectorGetComponentDynamic(const VectorRegister4Float &Vec, uint32 ComponentIndex)
Definition UnrealMathFPU.h:369
FORCEINLINE VectorRegister4Float VectorLog(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1993
FORCEINLINE VectorRegister4Float VectorSet_W0(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1391
FORCEINLINE constexpr VectorRegister4Int MakeVectorRegisterIntConstant(int32 X, int32 Y, int32 Z, int32 W)
Definition UnrealMathFPU.h:292
FORCEINLINE int32 VectorMaskBits(const VectorRegister4Float &Vec1)
Definition UnrealMathFPU.h:1075
FORCEINLINE VectorRegister4Float VectorNegate(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:687
FORCEINLINE VectorRegister4Float VectorNegateMultiplyAdd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2, const VectorRegister4Float &Vec3)
Definition UnrealMathFPU.h:815
FORCEINLINE VectorRegister4Float VectorReciprocal(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1311
FORCEINLINE VectorRegister4Float VectorSin(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2015
FORCEINLINE constexpr VectorRegister2Double MakeVectorRegister2DoubleConstant(double X, double Y)
Definition UnrealMathFPU.h:302
FORCEINLINE void VectorStoreURGBA16N(const VectorRegister4Float &Vec, void *Ptr)
Definition UnrealMathFPU.h:2288
FORCEINLINE VectorRegister4Int VectorShuffleByte4(const VectorRegister4Int &Vec, const VectorRegister4Int &Mask)
Definition UnrealMathFPU.h:2515
FORCEINLINE VectorRegister4Float VectorAbs(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:661
FORCEINLINE VectorRegister4Float VectorACos(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2061
FORCEINLINE VectorRegister4Float VectorAdd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:704
FORCEINLINE VectorRegister4Int VectorDoubleToInt(const VectorRegister4Double &A)
Definition UnrealMathFPU.h:2510
FORCEINLINE VectorRegister4Float VectorFloor(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2142
FORCEINLINE float VectorDot3Scalar(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:861
VectorRegister4Int VectorRegisterInt
Definition UnrealMathFPU.h:96
void VectorStoreAligned(const VectorRegister4Float &Vec, float *Ptr)
Definition UnrealMathFPU.h:534
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloatMask(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:201
FORCEINLINE VectorRegister4Float VectorBitwiseXor(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1190
FORCEINLINE VectorRegister4Float VectorCeil(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2131
FORCEINLINE VectorRegister4Double VectorLoadFloat3_W1(const double *Ptr)
Definition UnrealMathFPU.h:439
FORCEINLINE VectorRegister4Float VectorQuaternionMultiply2(const VectorRegister4Float &Quat1, const VectorRegister4Float &Quat2)
Definition UnrealMathFPU.h:1517
FORCEINLINE void VectorIntStore(const VectorRegister4Int &A, const void *Ptr)
Definition UnrealMathFPU.h:2546
FORCEINLINE VectorRegister4Float VectorIntToFloat(const VectorRegister4Int &A)
Definition UnrealMathFPU.h:2482
FORCEINLINE VectorRegister4Int VectorIntMax(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2462
FORCEINLINE VectorRegister4Float VectorOneFloat(void)
Definition UnrealMathFPU.h:346
FORCEINLINE VectorRegister4Float VectorZeroFloat(void)
Definition UnrealMathFPU.h:331
FORCEINLINE VectorRegister4Float VectorATan(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2072
FORCEINLINE VectorRegister4Int VectorIntLoadAligned(const void *Ptr)
Definition UnrealMathFPU.h:2593
FORCEINLINE VectorRegister4Float VectorLoad(const float *Ptr)
Definition UnrealMathFPU.h:394
FORCEINLINE VectorRegister4Float VectorCross(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1216
FORCEINLINE VectorRegister4Float VectorBitwiseOr(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1140
FORCEINLINE VectorRegister4Int VectorFloatToInt(const VectorRegister4Float &A)
Definition UnrealMathFPU.h:2491
bool VectorContainsNaNOrInfinite(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1960
FORCEINLINE VectorRegister4Float VectorStep(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2223
VectorRegister4Float VectorRegister4f
Definition UnrealMathFPU.h:89
FORCEINLINE VectorRegister4Float VectorPow(const VectorRegister4Float &Base, const VectorRegister4Float &Exponent)
Definition UnrealMathFPU.h:1243
FORCEINLINE VectorRegister4Int VectorIntMultiply(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2435
FORCEINLINE VectorRegister4Int VectorIntAdd(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2417
FORCEINLINE void VectorStoreFloat3(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:594
FORCEINLINE VectorRegister4Float VectorReciprocalEstimate(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1327
FORCEINLINE VectorRegister4Float VectorCompareLE(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1050
FORCEINLINE VectorRegister4Float VectorCompareEQ(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:923
FORCEINLINE void VectorStoreFloat1(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:610
FORCEINLINE VectorRegister4Int VectorIntCompareLT(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2383
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloat(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:175
FORCEINLINE VectorRegister4Int VectorIntAnd(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2308
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloatFromDouble(const VectorRegister4Double &Vec4d)
Definition UnrealMathFPU.h:262
FORCEINLINE VectorRegister2Double MakeVectorRegister2Double(double X, double Y)
Definition UnrealMathFPU.h:158
VectorRegister2Double VectorRegister2d
Definition UnrealMathFPU.h:91
FORCEINLINE VectorRegister4Int VectorIntCompareGT(const VectorRegister4Int &A, const VectorRegister4Int &B)
Definition UnrealMathFPU.h:2374
FORCEINLINE VectorRegister4Float VectorSign(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:2204
FORCEINLINE VectorRegister4Float VectorCompareNE(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:948
FORCEINLINE VectorRegister4Float VectorMergeVecXYZ_VecW(const VectorRegister4Float &VecXYZ, const VectorRegister4Float &VecW)
Definition UnrealMathFPU.h:1797
FORCEINLINE void VectorStoreURGB10A2N(const VectorRegister4Float &Vec, void *Ptr)
Definition UnrealMathFPU.h:1895
memcpy(InputBufferBase, BinkBlocksData, BinkBlocksSize)
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
constexpr VectorRegister4Float FloatZero
Definition UnrealMathVectorConstants.h.inl:41
constexpr VectorRegister4Float FloatOne
Definition UnrealMathVectorConstants.h.inl:40
constexpr VectorRegister4Double DoubleOne
Definition UnrealMathVectorConstants.h.inl:58
constexpr VectorRegister4Double DoubleZero
Definition UnrealMathVectorConstants.h.inl:59
float v
Definition radaudio_mdct.cpp:62
U16 Index
Definition radfft.cpp:71
Definition UnrealMathFPU.h:133
FORCEINLINE double operator[](int32 Index) const
Definition UnrealMathFPU.h:141
FORCEINLINE AlignedDouble4(const VectorRegister4Double &Vec)
Definition UnrealMathFPU.h:136
FORCEINLINE double & operator[](int32 Index)
Definition UnrealMathFPU.h:142
double V[4]
Definition UnrealMathFPU.h:134
FORCEINLINE VectorRegister4Double ToVectorRegister() const
Definition UnrealMathFPU.h:144
Definition UnrealMathFPU.h:113
FORCEINLINE AlignedFloat4(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:116
FORCEINLINE float & operator[](int32 Index)
Definition UnrealMathFPU.h:122
float V[4]
Definition UnrealMathFPU.h:114
FORCEINLINE float operator[](int32 Index) const
Definition UnrealMathFPU.h:121
FORCEINLINE VectorRegister4Float ToVectorRegister() const
Definition UnrealMathFPU.h:124
static constexpr void SinCos(std::decay_t< T > *ScalarSin, std::decay_t< T > *ScalarCos, T Value)
Definition UnrealMathUtility.h:753
static CORE_API bool MatrixInverse(FMatrix44f *DstMatrix, const FMatrix44f *SrcMatrix)
Definition UnrealMath.cpp:928
static CORE_API float RoundHalfToEven(float F)
Definition UnrealMath.cpp:2997
static float Log2(float Value)
Definition UnrealMathUtility.h:722
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition UnrealMathFPU.h:34
double V[2]
Definition UnrealMathFPU.h:35
Definition UnrealMathFPU.h:42
VectorRegister4Double()=default
VectorRegister2Double XY
Definition UnrealMathFPU.h:47
FORCEINLINE VectorRegister4Double & operator=(const VectorRegister4Float &From)
Definition UnrealMathFPU.h:77
FORCEINLINE VectorRegister4Double(const VectorRegister2Double &InXY, const VectorRegister2Double &InZW)
Definition UnrealMathFPU.h:55
VectorRegister2Double ZW
Definition UnrealMathFPU.h:48
FORCEINLINE constexpr VectorRegister4Double(VectorRegister2Double InXY, VectorRegister2Double InZW, VectorRegisterConstInit)
Definition UnrealMathFPU.h:63
FORCEINLINE VectorRegister4Double(const VectorRegister4Float &FloatVector)
Definition UnrealMathFPU.h:68
double V[4]
Definition UnrealMathFPU.h:50
Definition UnrealMathFPU.h:20
float V[4]
Definition UnrealMathFPU.h:21
Definition UnrealMathFPU.h:28
int32 V[4]
Definition UnrealMathFPU.h:29
Definition UnrealMathFPU.h:99
Definition UnrealMathFPU.h:14