Plasma Engine  2.0
Loading...
Searching...
No Matches
NEONVec4b_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 m_v = vmovq_n_u32(b ? 0xFFFFFFFF : 0);
13}
14
15PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(bool x, bool y, bool z, bool w)
16{
17 PL_CHECK_SIMD_ALIGNMENT(this);
18
19 alignas(16) plUInt32 mask[4] = {x ? 0xFFFFFFFF : 0, y ? 0xFFFFFFFF : 0, z ? 0xFFFFFFFF : 0, w ? 0xFFFFFFFF : 0};
20 m_v = vld1q_u32(mask);
21}
22
23PL_ALWAYS_INLINE plSimdVec4b::plSimdVec4b(plInternal::QuadBool v)
24{
25 m_v = v;
26}
27
28template <int N>
29PL_ALWAYS_INLINE bool plSimdVec4b::GetComponent() const
30{
31 return vgetq_lane_u32(m_v, N) & 1;
32}
33
34PL_ALWAYS_INLINE bool plSimdVec4b::x() const
35{
36 return GetComponent<0>();
37}
38
39PL_ALWAYS_INLINE bool plSimdVec4b::y() const
40{
41 return GetComponent<1>();
42}
43
44PL_ALWAYS_INLINE bool plSimdVec4b::z() const
45{
46 return GetComponent<2>();
47}
48
49PL_ALWAYS_INLINE bool plSimdVec4b::w() const
50{
51 return GetComponent<3>();
52}
53
54template <plSwizzle::Enum s>
55PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::Get() const
56{
57 return __builtin_shufflevector(m_v, m_v, PL_TO_SHUFFLE(s));
58}
59
60PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator&&(const plSimdVec4b& rhs) const
61{
62 return vandq_u32(m_v, rhs.m_v);
63}
64
65PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator||(const plSimdVec4b& rhs) const
66{
67 return vorrq_u32(m_v, rhs.m_v);
68}
69
70PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator!() const
71{
72 return vmvnq_u32(m_v);
73}
74
75PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator==(const plSimdVec4b& rhs) const
76{
77 return vceqq_u32(m_v, rhs.m_v);
78}
79
80PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::operator!=(const plSimdVec4b& rhs) const
81{
82 return veorq_u32(m_v, rhs.m_v);
83}
84
85template <int N>
86PL_ALWAYS_INLINE bool plSimdVec4b::AllSet() const
87{
88 const int mask = PL_BIT(N) - 1;
89 return (plInternal::NeonMoveMask(m_v) & mask) == mask;
90}
91
92template <int N>
93PL_ALWAYS_INLINE bool plSimdVec4b::AnySet() const
94{
95 const int mask = PL_BIT(N) - 1;
96 return (plInternal::NeonMoveMask(m_v) & mask) != 0;
97}
98
99template <int N>
100PL_ALWAYS_INLINE bool plSimdVec4b::NoneSet() const
101{
102 const int mask = PL_BIT(N) - 1;
103 return (plInternal::NeonMoveMask(m_v) & mask) == 0;
104}
105
106// static
107PL_ALWAYS_INLINE plSimdVec4b plSimdVec4b::Select(const plSimdVec4b& vCmp, const plSimdVec4b& vTrue, const plSimdVec4b& vFalse)
108{
109 return vbslq_u32(vCmp.m_v, vTrue.m_v, vFalse.m_v);
110}
Definition SimdVec4b.h:7
A 4-component vector class.
Definition Vec4.h:9