3#if PL_ENABLED(PL_COMPILER_MSVC)
7PL_ALWAYS_INLINE plSimdVec4i::plSimdVec4i()
9 PL_CHECK_SIMD_ALIGNMENT(
this);
11#if PL_ENABLED(PL_MATH_CHECK_FOR_NAN)
12 m_v = _mm_set1_epi32(0xCDCDCDCD);
16PL_ALWAYS_INLINE plSimdVec4i::plSimdVec4i(plInt32 iXyzw)
18 PL_CHECK_SIMD_ALIGNMENT(
this);
20 m_v = _mm_set1_epi32(iXyzw);
23PL_ALWAYS_INLINE plSimdVec4i::plSimdVec4i(plInt32 x, plInt32 y, plInt32 z, plInt32 w)
25 PL_CHECK_SIMD_ALIGNMENT(
this);
27 m_v = _mm_setr_epi32(x, y, z, w);
37 return _mm_setzero_si128();
40PL_ALWAYS_INLINE
void plSimdVec4i::Set(plInt32 iXyzw)
42 m_v = _mm_set1_epi32(iXyzw);
45PL_ALWAYS_INLINE
void plSimdVec4i::Set(plInt32 x, plInt32 y, plInt32 z, plInt32 w)
47 m_v = _mm_setr_epi32(x, y, z, w);
50PL_ALWAYS_INLINE
void plSimdVec4i::SetZero()
52 m_v = _mm_setzero_si128();
56PL_ALWAYS_INLINE
void plSimdVec4i::Load<1>(
const plInt32* pInts)
58 m_v = _mm_loadu_si32(pInts);
62PL_ALWAYS_INLINE
void plSimdVec4i::Load<2>(
const plInt32* pInts)
64 m_v = _mm_loadu_si64(pInts);
68PL_ALWAYS_INLINE
void plSimdVec4i::Load<3>(
const plInt32* pInts)
70 m_v = _mm_setr_epi32(pInts[0], pInts[1], pInts[2], 0);
74PL_ALWAYS_INLINE
void plSimdVec4i::Load<4>(
const plInt32* pInts)
76 m_v = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(pInts));
80PL_ALWAYS_INLINE
void plSimdVec4i::Store<1>(plInt32* pInts)
const
82 _mm_storeu_si32(pInts, m_v);
86PL_ALWAYS_INLINE
void plSimdVec4i::Store<2>(plInt32* pInts)
const
88 _mm_storeu_si64(pInts, m_v);
92PL_ALWAYS_INLINE
void plSimdVec4i::Store<3>(plInt32* pInts)
const
94 _mm_storeu_si64(pInts, m_v);
95 _mm_storeu_si32(pInts + 2, _mm_castps_si128(_mm_movehl_ps(_mm_castsi128_ps(m_v), _mm_castsi128_ps(m_v))));
99PL_ALWAYS_INLINE
void plSimdVec4i::Store<4>(plInt32* pInts)
const
101 _mm_storeu_si128(
reinterpret_cast<__m128i*
>(pInts), m_v);
104PL_ALWAYS_INLINE
plSimdVec4f plSimdVec4i::ToFloat()
const
106 return _mm_cvtepi32_ps(m_v);
112 return _mm_cvttps_epi32(f.m_v);
116PL_ALWAYS_INLINE plInt32 plSimdVec4i::GetComponent()
const
118#if PL_SSE_LEVEL >= PL_SSE_41
119 return _mm_extract_epi32(m_v, N);
121 return m_v.m128i_i32[N];
125PL_ALWAYS_INLINE plInt32 plSimdVec4i::x()
const
127 return GetComponent<0>();
130PL_ALWAYS_INLINE plInt32 plSimdVec4i::y()
const
132 return GetComponent<1>();
135PL_ALWAYS_INLINE plInt32 plSimdVec4i::z()
const
137 return GetComponent<2>();
140PL_ALWAYS_INLINE plInt32 plSimdVec4i::w()
const
142 return GetComponent<3>();
145template <plSwizzle::Enum s>
146PL_ALWAYS_INLINE
plSimdVec4i plSimdVec4i::Get()
const
148 return _mm_shuffle_epi32(m_v, PL_TO_SHUFFLE(s));
151template <plSwizzle::Enum s>
154 return _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(m_v), _mm_castsi128_ps(other.m_v), PL_TO_SHUFFLE(s)));
157PL_ALWAYS_INLINE
plSimdVec4i plSimdVec4i::operator-()
const
159 return _mm_sub_epi32(_mm_setzero_si128(), m_v);
164 return _mm_add_epi32(m_v, v.m_v);
169 return _mm_sub_epi32(m_v, v.m_v);
174#if PL_SSE_LEVEL >= PL_SSE_41
175 return _mm_mullo_epi32(m_v, v.m_v);
177 PL_ASSERT_NOT_IMPLEMENTED;
178 __m128i tmp1 = _mm_mul_epu32(m_v, v.m_v);
179 __m128i tmp2 = _mm_mul_epu32(_mm_srli_si128(m_v, 4), _mm_srli_si128(v.m_v, 4));
180 return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, PL_SHUFFLE(0, 2, 0, 0)), _mm_shuffle_epi32(tmp2, PL_SHUFFLE(0, 2, 0, 0)));
186#if PL_ENABLED(PL_COMPILER_MSVC)
187 return _mm_div_epi32(m_v, v.m_v);
194 for (plUInt32 i = 0; i < 4; ++i)
207 return _mm_or_si128(m_v, v.m_v);
212 return _mm_and_si128(m_v, v.m_v);
217 return _mm_xor_si128(m_v, v.m_v);
220PL_ALWAYS_INLINE
plSimdVec4i plSimdVec4i::operator~()
const
222 __m128i ones = _mm_cmpeq_epi8(_mm_setzero_si128(), _mm_setzero_si128());
223 return _mm_xor_si128(ones, m_v);
226PL_ALWAYS_INLINE
plSimdVec4i plSimdVec4i::operator<<(plUInt32 uiShift)
const
228 return _mm_slli_epi32(m_v, uiShift);
231PL_ALWAYS_INLINE
plSimdVec4i plSimdVec4i::operator>>(plUInt32 uiShift)
const
233 return _mm_srai_epi32(m_v, uiShift);
243 for (plUInt32 i = 0; i < 4; ++i)
260 for (plUInt32 i = 0; i < 4; ++i)
272 m_v = _mm_add_epi32(m_v, v.m_v);
278 m_v = _mm_sub_epi32(m_v, v.m_v);
284 m_v = _mm_or_si128(m_v, v.m_v);
290 m_v = _mm_and_si128(m_v, v.m_v);
296 m_v = _mm_xor_si128(m_v, v.m_v);
300PL_ALWAYS_INLINE
plSimdVec4i& plSimdVec4i::operator<<=(plUInt32 uiShift)
302 m_v = _mm_slli_epi32(m_v, uiShift);
306PL_ALWAYS_INLINE
plSimdVec4i& plSimdVec4i::operator>>=(plUInt32 uiShift)
308 m_v = _mm_srai_epi32(m_v, uiShift);
314#if PL_SSE_LEVEL >= PL_SSE_41
315 return _mm_min_epi32(m_v, v.m_v);
317 __m128i mask = _mm_cmplt_epi32(m_v, v.m_v);
318 return _mm_or_si128(_mm_and_si128(mask, m_v), _mm_andnot_si128(mask, v.m_v));
324#if PL_SSE_LEVEL >= PL_SSE_41
325 return _mm_max_epi32(m_v, v.m_v);
327 __m128i mask = _mm_cmpgt_epi32(m_v, v.m_v);
328 return _mm_or_si128(_mm_and_si128(mask, m_v), _mm_andnot_si128(mask, v.m_v));
332PL_ALWAYS_INLINE
plSimdVec4i plSimdVec4i::Abs()
const
334#if PL_SSE_LEVEL >= PL_SSE_31
335 return _mm_abs_epi32(m_v);
337 __m128i negMask = _mm_cmplt_epi32(m_v, _mm_setzero_si128());
338 __m128i neg = _mm_sub_epi32(_mm_setzero_si128(), m_v);
339 return _mm_or_si128(_mm_and_si128(negMask, neg), _mm_andnot_si128(negMask, m_v));
345 return _mm_castsi128_ps(_mm_cmpeq_epi32(m_v, v.m_v));
350 return !(*
this == v);
360 return _mm_castsi128_ps(_mm_cmplt_epi32(m_v, v.m_v));
370 return _mm_castsi128_ps(_mm_cmpgt_epi32(m_v, v.m_v));
376#if PL_SSE_LEVEL >= PL_SSE_41
377 return _mm_castps_si128(_mm_blendv_ps(_mm_castsi128_ps(vFalse.m_v), _mm_castsi128_ps(vTrue.m_v), vCmp.m_v));
379 return _mm_castps_si128(_mm_or_ps(_mm_andnot_ps(cmp.m_v, _mm_castsi128_ps(ifFalse.m_v)), _mm_and_ps(cmp.m_v, _mm_castsi128_ps(ifTrue.m_v))));
387 __m128i T0 = _mm_unpacklo_epi32(v0.m_v, v1.m_v);
388 __m128i T1 = _mm_unpacklo_epi32(v2.m_v, v3.m_v);
389 __m128i T2 = _mm_unpackhi_epi32(v0.m_v, v1.m_v);
390 __m128i T3 = _mm_unpackhi_epi32(v2.m_v, v3.m_v);
392 v0.m_v = _mm_unpacklo_epi64(T0, T1);
393 v1.m_v = _mm_unpackhi_epi64(T0, T1);
394 v2.m_v = _mm_unpacklo_epi64(T2, T3);
395 v3.m_v = _mm_unpackhi_epi64(T2, T3);
A 4-component SIMD vector class.
Definition SimdVec4f.h:8
A SIMD 4-component vector class of signed 32b integers.
Definition SimdVec4i.h:9
plSimdVec4i GetCombined(const plSimdVec4i &other) const
x = this[s0], y = this[s1], z = other[s2], w = other[s3]
static plSimdVec4i MakeZero()
Creates an plSimdVec4i that is initialized to zero.
Definition FPUVec4i_inl.h:25