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 __m128 v = _mm_cvtsi32_ss(_mm_setzero_ps(), i);
25 m_v = _mm_shuffle_ps(v, v, PL_TO_SHUFFLE(plSwizzle::XXXX));
30 PL_CHECK_SIMD_ALIGNMENT(
this);
32#if PL_ENABLED(PL_PLATFORM_64BIT)
33 __m128 v = _mm_cvtsi64_ss(_mm_setzero_ps(), i);
35 __m128 v = _mm_cvtsi32_ss(_mm_setzero_ps(), i);
37 m_v = _mm_shuffle_ps(v, v, PL_TO_SHUFFLE(plSwizzle::XXXX));
42 PL_CHECK_SIMD_ALIGNMENT(
this);
52PL_ALWAYS_INLINE plSimdFloat::operator float()
const
55 _mm_store_ss(&f, m_v);
62 return _mm_setzero_ps();
73 return _mm_add_ps(m_v, f.m_v);
78 return _mm_sub_ps(m_v, f.m_v);
83 return _mm_mul_ps(m_v, f.m_v);
88 return _mm_div_ps(m_v, f.m_v);
93 m_v = _mm_add_ps(m_v, f.m_v);
99 m_v = _mm_sub_ps(m_v, f.m_v);
105 m_v = _mm_mul_ps(m_v, f.m_v);
111 m_v = _mm_div_ps(m_v, f.m_v);
119 return ((*
this >= minusEps) && (*
this <= plusEps));
122PL_ALWAYS_INLINE
bool plSimdFloat::operator==(
const plSimdFloat& f)
const
124 return _mm_comieq_ss(m_v, f.m_v) == 1;
127PL_ALWAYS_INLINE
bool plSimdFloat::operator!=(
const plSimdFloat& f)
const
129 return _mm_comineq_ss(m_v, f.m_v) == 1;
132PL_ALWAYS_INLINE
bool plSimdFloat::operator>=(
const plSimdFloat& f)
const
134 return _mm_comige_ss(m_v, f.m_v) == 1;
137PL_ALWAYS_INLINE
bool plSimdFloat::operator>(
const plSimdFloat& f)
const
139 return _mm_comigt_ss(m_v, f.m_v) == 1;
142PL_ALWAYS_INLINE
bool plSimdFloat::operator<=(
const plSimdFloat& f)
const
144 return _mm_comile_ss(m_v, f.m_v) == 1;
147PL_ALWAYS_INLINE
bool plSimdFloat::operator<(
const plSimdFloat& f)
const
149 return _mm_comilt_ss(m_v, f.m_v) == 1;
152PL_ALWAYS_INLINE
bool plSimdFloat::operator==(
float f)
const
157PL_ALWAYS_INLINE
bool plSimdFloat::operator!=(
float f)
const
162PL_ALWAYS_INLINE
bool plSimdFloat::operator>(
float f)
const
167PL_ALWAYS_INLINE
bool plSimdFloat::operator>=(
float f)
const
172PL_ALWAYS_INLINE
bool plSimdFloat::operator<(
float f)
const
177PL_ALWAYS_INLINE
bool plSimdFloat::operator<=(
float f)
const
183PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetReciprocal<plMathAcc::FULL>()
const
185 return _mm_div_ps(_mm_set1_ps(1.0f), m_v);
189PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetReciprocal<plMathAcc::BITS_23>()
const
191 __m128 x0 = _mm_rcp_ps(m_v);
194 __m128 x1 = _mm_mul_ps(x0, _mm_sub_ps(_mm_set1_ps(2.0f), _mm_mul_ps(m_v, x0)));
200PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetReciprocal<plMathAcc::BITS_12>()
const
202 return _mm_rcp_ps(m_v);
206PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetInvSqrt<plMathAcc::FULL>()
const
208 return _mm_div_ps(_mm_set1_ps(1.0f), _mm_sqrt_ps(m_v));
212PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetInvSqrt<plMathAcc::BITS_23>()
const
214 const __m128 x0 = _mm_rsqrt_ps(m_v);
217 return _mm_mul_ps(_mm_mul_ps(_mm_set1_ps(0.5f), x0), _mm_sub_ps(_mm_set1_ps(3.0f), _mm_mul_ps(_mm_mul_ps(m_v, x0), x0)));
221PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetInvSqrt<plMathAcc::BITS_12>()
const
223 return _mm_rsqrt_ps(m_v);
227PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetSqrt<plMathAcc::FULL>()
const
229 return _mm_sqrt_ps(m_v);
233PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetSqrt<plMathAcc::BITS_23>()
const
235 return (*
this) * GetInvSqrt<plMathAcc::BITS_23>();
239PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::GetSqrt<plMathAcc::BITS_12>()
const
241 return (*
this) * GetInvSqrt<plMathAcc::BITS_12>();
246 return _mm_max_ps(m_v, f.m_v);
251 return _mm_min_ps(m_v, f.m_v);
254PL_ALWAYS_INLINE
plSimdFloat plSimdFloat::Abs()
const
256 return _mm_andnot_ps(_mm_set1_ps(-0.0f), 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