Plasma Engine  2.0
Loading...
Searching...
No Matches
SSEVec4b_inl.h
1#pragma once
2
3PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b()
4{
5 PL_CHECK_SIMD_ALIGNMENT(this);
6}
7
8PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(bool b)
9{
10 PL_CHECK_SIMD_ALIGNMENT(this);
11
12 plUInt32 mask = b ? 0xFFFFFFFF : 0;
13 __m128 tmp = _mm_load_ss((float*)&mask);
14 m_v = _mm_shuffle_ps(tmp, tmp, PL_TO_SHUFFLE(plSwizzle::XXXX));
15}
16
17PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(bool x, bool y, bool z, bool w)
18{
19 PL_CHECK_SIMD_ALIGNMENT(this);
20
21 alignas(16) plUInt32 mask[4] = {x ? 0xFFFFFFFF : 0, y ? 0xFFFFFFFF : 0, z ? 0xFFFFFFFF : 0, w ? 0xFFFFFFFF : 0};
22 m_v = _mm_load_ps((float*)mask);
23}
24
25PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(plInternal::QuadBool v)
26{
27 m_v = v;
28}
29
30template <int N>
31PL_ALWAYS_INLINE bool plSimdVec4b::GetComponent() const
32{
33 return _mm_movemask_ps(_mm_shuffle_ps(m_v, m_v, PL_SHUFFLE(N, N, N, N))) != 0;
34}
35
36PL_ALWAYS_INLINE bool plSimdVec4b::x() const
37{
38 return GetComponent<0>();
39}
40
41PL_ALWAYS_INLINE bool plSimdVec4b::y() const
42{
43 return GetComponent<1>();
44}
45
46PL_ALWAYS_INLINE bool plSimdVec4b::z() const
47{
48 return GetComponent<2>();
49}
50
51PL_ALWAYS_INLINE bool plSimdVec4b::w() const
52{
53 return GetComponent<3>();
54}
55
56template <plSwizzle::Enum s>
57PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::Get() const
58{
59 return _mm_shuffle_ps(m_v, m_v, PL_TO_SHUFFLE(s));
60}
61
62PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator&&(const plSimdVec4b& rhs) const
63{
64 return _mm_and_ps(m_v, rhs.m_v);
65}
66
67PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator||(const plSimdVec4b& rhs) const
68{
69 return _mm_or_ps(m_v, rhs.m_v);
70}
71
72PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator!() const
73{
74 __m128 allTrue = _mm_cmpeq_ps(_mm_setzero_ps(), _mm_setzero_ps());
75 return _mm_xor_ps(m_v, allTrue);
76}
77
78PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator==(const plSimdVec4b& rhs) const
79{
80 return !(*this != rhs);
81}
82
83PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator!=(const plSimdVec4b& rhs) const
84{
85 return _mm_xor_ps(m_v, rhs.m_v);
86}
87
88template <int N>
89PL_ALWAYS_INLINE bool plSimdVec4b::AllSet() const
90{
91 const int mask = PL_BIT(N) - 1;
92 return (_mm_movemask_ps(m_v) & mask) == mask;
93}
94
95template <int N>
96PL_ALWAYS_INLINE bool plSimdVec4b::AnySet() const
97{
98 const int mask = PL_BIT(N) - 1;
99 return (_mm_movemask_ps(m_v) & mask) != 0;
100}
101
102template <int N>
103PL_ALWAYS_INLINE bool plSimdVec4b::NoneSet() const
104{
105 const int mask = PL_BIT(N) - 1;
106 return (_mm_movemask_ps(m_v) & mask) == 0;
107}
108
109// static
110PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::Select(const plSimdVec4b& vCmp, const plSimdVec4b& vTrue, const plSimdVec4b& vFalse)
111{
112#if PL_SSE_LEVEL >= PL_SSE_41
113 return _mm_blendv_ps(vFalse.m_v, vTrue.m_v, vCmp.m_v);
114#else
115 return _mm_or_ps(_mm_andnot_ps(cmp.m_v, ifFalse.m_v), _mm_and_ps(cmp.m_v, ifTrue.m_v));
116#endif
117}
Definition SimdVec4b.h:7
A 4-component vector class.
Definition Vec4.h:9