5 PL_CHECK_SIMD_ALIGNMENT(
this);
7#if PL_ENABLED(PL_MATH_CHECK_FOR_NAN)
15 PL_CHECK_SIMD_ALIGNMENT(
this);
22 PL_CHECK_SIMD_ALIGNMENT(
this);
24 m_v = vcvtq_f32_s32(vmovq_n_s32(i));
29 PL_CHECK_SIMD_ALIGNMENT(
this);
31 m_v = vcvtq_f32_u32(vmovq_n_u32(i));
36 PL_CHECK_SIMD_ALIGNMENT(
this);
46PL_ALWAYS_INLINE plSimdFloat::operator float()
const
48 return vgetq_lane_f32(m_v, 0);
54 return vmovq_n_f32(0.0f);
65 return vaddq_f32(m_v, f.m_v);
70 return vsubq_f32(m_v, f.m_v);
75 return vmulq_f32(m_v, f.m_v);
80 return vdivq_f32(m_v, f.m_v);
85 m_v = vaddq_f32(m_v, f.m_v);
91 m_v = vsubq_f32(m_v, f.m_v);
97 m_v = vmulq_f32(m_v, f.m_v);
103 m_v = vdivq_f32(m_v, f.m_v);
111 return ((*
this >= minusEps) && (*
this <= plusEps));
114PL_ALWAYS_INLINE
bool plSimdFloat::operator==(
const plSimdFloat& f)
const
116 return vgetq_lane_u32(vceqq_f32(m_v, f.m_v), 0) & 1;
119PL_ALWAYS_INLINE
bool plSimdFloat::operator!=(
const plSimdFloat& f)
const
121 return !operator==(f);
124PL_ALWAYS_INLINE
bool plSimdFloat::operator>=(
const plSimdFloat& f)
const
126 return vgetq_lane_u32(vcgeq_f32(m_v, f.m_v), 0) & 1;
129PL_ALWAYS_INLINE
bool plSimdFloat::operator>(
const plSimdFloat& f)
const
131 return vgetq_lane_u32(vcgtq_f32(m_v, f.m_v), 0) & 1;
134PL_ALWAYS_INLINE
bool plSimdFloat::operator<=(
const plSimdFloat& f)
const
136 return vgetq_lane_u32(vcleq_f32(m_v, f.m_v), 0) & 1;
139PL_ALWAYS_INLINE
bool plSimdFloat::operator<(
const plSimdFloat& f)
const
141 return vgetq_lane_u32(vcltq_f32(m_v, f.m_v), 0) & 1;
144PL_ALWAYS_INLINE
bool plSimdFloat::operator==(
float f)
const
149PL_ALWAYS_INLINE
bool plSimdFloat::operator!=(
float f)
const
154PL_ALWAYS_INLINE
bool plSimdFloat::operator>(
float f)
const
159PL_ALWAYS_INLINE
bool plSimdFloat::operator>=(
float f)
const
164PL_ALWAYS_INLINE
bool plSimdFloat::operator<(
float f)
const
169PL_ALWAYS_INLINE
bool plSimdFloat::operator<=(
float f)
const
175PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetReciprocal<plMathAcc::FULL>()
const
177 return vdivq_f32(vmovq_n_f32(1.0f), m_v);
181PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetReciprocal<plMathAcc::BITS_23>()
const
183 float32x4_t x0 = vrecpeq_f32(m_v);
186 float32x4_t x1 = vmulq_f32(vrecpsq_f32(m_v, x0), x0);
187 float32x4_t x2 = vmulq_f32(vrecpsq_f32(m_v, x1), x1);
193PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetReciprocal<plMathAcc::BITS_12>()
const
195 float32x4_t x0 = vrecpeq_f32(m_v);
198 float32x4_t x1 = vmulq_f32(vrecpsq_f32(m_v, x0), x0);
204PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetInvSqrt<plMathAcc::FULL>()
const
206 return vdivq_f32(vmovq_n_f32(1.0f), vsqrtq_f32(m_v));
210PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetInvSqrt<plMathAcc::BITS_23>()
const
212 const float32x4_t x0 = vrsqrteq_f32(m_v);
215 const float32x4_t x1 = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x0, m_v), x0), x0);
216 return vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, m_v), x1), x1);
220PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetInvSqrt<plMathAcc::BITS_12>()
const
222 const float32x4_t x0 = vrsqrteq_f32(m_v);
225 return vmulq_f32(vrsqrtsq_f32(vmulq_f32(x0, m_v), x0), x0);
229PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetSqrt<plMathAcc::FULL>()
const
231 return vsqrtq_f32(m_v);
235PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetSqrt<plMathAcc::BITS_23>()
const
237 return (*
this) * GetInvSqrt<plMathAcc::BITS_23>();
241PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetSqrt<plMathAcc::BITS_12>()
const
243 return (*
this) * GetInvSqrt<plMathAcc::BITS_12>();
248 return vmaxq_f32(m_v, f.m_v);
253 return vminq_f32(m_v, f.m_v);
256PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::Abs()
const
258 return vabsq_f32(m_v);
Float wrapper struct for a safe usage and conversions of angles.
Definition Angle.h:10
constexpr float GetRadian() const
Returns the radian value. (No need for any conversion)
Definition Angle_inl.h:48
plSimdFloat()
Default constructor, leaves the data uninitialized.
Definition FPUFloat_inl.h:3
static plSimdFloat MakeNaN()
Creates an plSimdFloat that is initialized to Not-A-Number (NaN).
Definition FPUFloat_inl.h:42
static plSimdFloat MakeZero()
Creates an plSimdFloat that is initialized to zero.
Definition FPUFloat_inl.h:36
constexpr TYPE NaN()
Returns the value for NaN as the template type. Returns zero, if the type does not support NaN.
Definition Constants_inl.h:58