UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VectorUtility.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
5#include "Chaos/Core.h"
6
7
8template<typename T>
10
11template<>
16
17template<>
22
23template<typename T>
24T TMakeVectorRegister(float X, float Y, float Z, float W);
25
26template<>
28{
29 return MakeVectorRegisterFloat(X, Y, Z, W);
30}
31
32template<>
34{
35 return MakeVectorRegisterDouble(X, Y, Z, W);
36}
37
38template<typename T>
39constexpr T TMakeVectorRegisterConstant(float X, float Y, float Z, float W);
40
41template<>
43{
45}
46
47template<>
52
53template<typename T>
55
56template<>
61
62// Should generate no op
63template<>
68
76{
77#if (!defined(_MSC_VER) || PLATFORM_ENABLE_VECTORINTRINSICS_NEON) && PLATFORM_ENABLE_VECTORINTRINSICS
78 return VectorRegister4Float(V);
79#elif PLATFORM_ENABLE_VECTORINTRINSICS
80 return _mm_castsi128_ps(V);
81#else
83#endif
84}
85
86
94{
95#if (!defined(_MSC_VER) || PLATFORM_ENABLE_VECTORINTRINSICS_NEON) && PLATFORM_ENABLE_VECTORINTRINSICS
96 return VectorRegister4Int(V);
97#elif PLATFORM_ENABLE_VECTORINTRINSICS
98 return _mm_castps_si128(V);
99#else
101#endif
102
103}
104
113{
114#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
115 return vzip1q_f32(A, B);
116#elif PLATFORM_ENABLE_VECTORINTRINSICS
117 return _mm_unpacklo_ps(A, B);
118#else
119 return MakeVectorRegisterFloat(A.V[0], B.V[0], A.V[1], B.V[1]);
120#endif
121}
122
131{
132#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
134 Result.XY = vzip1q_f64(A.XY, B.XY);
135 Result.ZW = vzip2q_f64(A.XY, B.XY);
136 return Result;
137#elif PLATFORM_ENABLE_VECTORINTRINSICS
138 #if UE_PLATFORM_MATH_USE_AVX
140 #else
142 Result.XY = _mm_unpacklo_pd(A.XY, B.XY);
143 Result.ZW = _mm_unpackhi_pd(A.XY, B.XY);
144 return Result;
145 #endif
146#else
147 return MakeVectorRegisterFloat(A.V[0], B.V[0], A.V[1], B.V[1]);
148#endif
149}
150
151
160{
161#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
162 return vzip2q_f32(A, B);
163#elif PLATFORM_ENABLE_VECTORINTRINSICS
164 return _mm_unpackhi_ps(A, B);
165#else
166 return MakeVectorRegisterFloat(A.V[2], B.V[2], A.V[3], B.V[3]);
167#endif
168}
169
178{
179#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
180 return vzip1q_f64(A, B);
181#else
182 return VectorCombineLow(A, B);
183#endif
184}
185
186
187namespace Chaos::Private
188{
198 {
199#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
200 VectorRegister4Float Temp = VectorMultiply(Vec1, Vec2); // Multiply 2 vector
202 sum = vpadd_f32(sum, sum);
203 return vcombine_f32(sum, sum);
204#elif PLATFORM_ENABLE_VECTORINTRINSICS
205 return _mm_dp_ps(Vec1, Vec2, 0xFF);
206#else
207 return VectorDot3(Vec1, Vec2);
208#endif
209 }
210
222
232 {
233#if PLATFORM_ENABLE_VECTORINTRINSICS
234 // YZX
237 // XY, YZ, ZX
238 // This is the only way found to avoid the compiler on XSX using FMA.
239 // By forcing two FMA in a row, the subtract cannot be a FMA at the end.
240 // This allow to have a symmetric and reliable cross product.
243 // XY-YX, YZ-ZY, ZX-XZ
244 A = VectorSubtract(A, B);
245 // YZ-ZY, ZX-XZ, XY-YX
246 return VectorSwizzle(A, 1, 2, 0, 3);
247#else
248 return VectorCross(Vec1, Vec2);
249#endif
250 }
251
261 {
262#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
265 return VectorSwizzle(C, 1, 2, 0, 3);
266#elif PLATFORM_ENABLE_VECTORINTRINSICS
267 // YZX
270 // XY, YZ, ZX
272 // XY-YX, YZ-ZY, ZX-XZ
274 // YZ-ZY, ZX-XZ, XY-YX
275 return VectorSwizzle(A, 1, 2, 0, 3);
276#else
277 return VectorCross(Vec1, Vec2);
278#endif
279 }
280}
281
290{
291#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
293#elif PLATFORM_ENABLE_VECTORINTRINSICS
294 return _mm_andnot_ps(A, B);
295#else
297 uint32(~((uint32*)(A.V))[0] & ((uint32*)(B.V))[0]),
298 uint32(~((uint32*)(A.V))[1] & ((uint32*)(B.V))[1]),
299 uint32(~((uint32*)(A.V))[2] & ((uint32*)(B.V))[2]),
300 uint32(~((uint32*)(A.V))[3] & ((uint32*)(B.V))[3]));
301#endif
302}
303
305{
307#if PLATFORM_ENABLE_VECTORINTRINSICS_NEON
310#elif PLATFORM_ENABLE_VECTORINTRINSICS
311#if !UE_PLATFORM_MATH_USE_AVX
312 Result.XY = _mm_cvtps_pd(_mm_andnot_ps(_mm_cvtpd_ps(A.XY), _mm_cvtpd_ps(B.XY)));
313 Result.ZW = _mm_cvtps_pd(_mm_andnot_ps(_mm_cvtpd_ps(A.ZW), _mm_cvtpd_ps(B.ZW)));
314#else
315 Result = _mm256_andnot_pd(A, B);
316#endif
317#else
319 uint64(~((uint64*)(A.V))[0] & ((uint64*)(B.V))[0]),
320 uint64(~((uint64*)(A.V))[1] & ((uint64*)(B.V))[1]),
321 uint64(~((uint64*)(A.V))[2] & ((uint64*)(B.V))[2]),
322 uint64(~((uint64*)(A.V))[3] & ((uint64*)(B.V))[3]));
323#endif
324 return Result;
325}
326
#define FORCEINLINE
Definition AndroidPlatform.h:140
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
FORCEINLINE VectorRegister4Float VectorSubtract(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:731
#define VectorCastFloatToInt(Vec)
Definition UnrealMathFPU.h:2654
FORCEINLINE VectorRegister4Float VectorDot3(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:880
FORCEINLINE VectorRegister4Float MakeVectorRegister(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:195
FORCEINLINE VectorRegister4Double VectorZeroDouble(void)
Definition UnrealMathFPU.h:336
FORCEINLINE VectorRegister4Float VectorMultiply(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:758
FORCEINLINE constexpr VectorRegister4Float MakeVectorRegisterFloatConstant(float X, float Y, float Z, float W)
Definition UnrealMathFPU.h:297
FORCEINLINE VectorRegister4Float VectorCombineLow(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1757
FORCEINLINE VectorRegister4Float VectorMultiplyAdd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2, const VectorRegister4Float &Vec3)
Definition UnrealMathFPU.h:786
#define VectorCastIntToFloat(Vec)
Definition UnrealMathFPU.h:2653
FORCEINLINE VectorRegister4Double MakeVectorRegisterDouble(uint64 X, uint64 Y, uint64 Z, uint64 W)
Definition UnrealMathFPU.h:185
#define VectorSwizzle(Vec, X, Y, Z, W)
Definition UnrealMathFPU.h:639
FORCEINLINE VectorRegister4Float VectorZeroFloat(void)
Definition UnrealMathFPU.h:331
FORCEINLINE VectorRegister4Float VectorCross(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1216
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloat(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:175
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloatFromDouble(const VectorRegister4Double &Vec4d)
Definition UnrealMathFPU.h:262
#define VectorReplicate(Vec, ElementIndex)
Definition UnrealMathFPU.h:627
FORCEINLINE VectorRegister4Float VectorZero(void)
Definition UnrealMathVectorCommon.h.inl:16
FORCEINLINE constexpr VectorRegister4Double MakeVectorRegisterDoubleConstant(VectorRegister2Double XY, VectorRegister2Double ZW)
Definition UnrealMathVectorConstants.h.inl:17
VectorRegister4Double TVectorZero< VectorRegister4Double >()
Definition VectorUtility.h:18
FORCEINLINE VectorRegister4Int VectorCast4FloatTo4Int(const VectorRegister4Float &V)
Definition VectorUtility.h:93
constexpr VectorRegister4Float TMakeVectorRegisterConstant< VectorRegister4Float >(float X, float Y, float Z, float W)
Definition VectorUtility.h:42
constexpr VectorRegister4Double TMakeVectorRegisterConstant< VectorRegister4Double >(float X, float Y, float Z, float W)
Definition VectorUtility.h:48
VectorRegister4Float TMakeVectorRegister< VectorRegister4Float >(float X, float Y, float Z, float W)
Definition VectorUtility.h:27
FORCEINLINE VectorRegister4Float VectorBitwiseNotAnd(const VectorRegister4Float &A, const VectorRegister4Float &B)
Definition VectorUtility.h:289
VectorRegister4Float TMakeVectorRegisterFloatFromDouble(const T &V)
constexpr T TMakeVectorRegisterConstant(float X, float Y, float Z, float W)
VectorRegister4Float TVectorZero< VectorRegister4Float >()
Definition VectorUtility.h:12
T TVectorZero()
VectorRegister4Double TMakeVectorRegister< VectorRegister4Double >(float X, float Y, float Z, float W)
Definition VectorUtility.h:33
FORCEINLINE VectorRegister4Float VectorUnpackHi(const VectorRegister4Float &A, const VectorRegister4Float &B)
Definition VectorUtility.h:159
FORCEINLINE VectorRegister4Float VectorCast4IntTo4Float(const VectorRegister4Int &V)
Definition VectorUtility.h:75
constexpr VectorRegister4Float TMakeVectorRegisterFloatFromDouble< VectorRegister4Float >(const VectorRegister4Float &V)
Definition VectorUtility.h:64
FORCEINLINE VectorRegister4Float VectorMoveLh(const VectorRegister4Float &A, const VectorRegister4Float &B)
Definition VectorUtility.h:177
VectorRegister4Float TMakeVectorRegisterFloatFromDouble< VectorRegister4Double >(const VectorRegister4Double &V)
Definition VectorUtility.h:57
FORCEINLINE VectorRegister4Float VectorUnpackLo(const VectorRegister4Float &A, const VectorRegister4Float &B)
Definition VectorUtility.h:112
T TMakeVectorRegister(float X, float Y, float Z, float W)
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition BodyInstance.h:90
FORCEINLINE VectorRegister4Float VectorMatrixMultiply(const VectorRegister4Float &Vec, const FMatrix33 &M)
Definition VectorUtility.h:211
FORCEINLINE VectorRegister4Float VectorDot3FastX(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition VectorUtility.h:197
FORCEINLINE VectorRegister4Float VectorCrossNoFMA(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition VectorUtility.h:231
Definition UnrealMathFPU.h:34
Definition UnrealMathFPU.h:42
Definition UnrealMathFPU.h:20
Definition UnrealMathFPU.h:28