Plasma Engine  2.0
Loading...
Searching...
No Matches
NEONVec4i_inl.h
1#pragma once
2
3PL_ALWAYS_INLINE plSimdVec4i::plSimdVec4i()
4{
5 PL_CHECK_SIMD_ALIGNMENT(this);
6
7#if PL_ENABLED(PL_MATH_CHECK_FOR_NAN)
8 m_v = vmovq_n_u32(0xCDCDCDCD);
9#endif
10}
11
12PL_ALWAYS_INLINE plSimdVec4i::plSimdVec4i(plInt32 xyzw)
13{
14 PL_CHECK_SIMD_ALIGNMENT(this);
15
16 m_v = vmovq_n_s32(xyzw);
17}
18
19PL_ALWAYS_INLINE plSimdVec4i::plSimdVec4i(plInt32 x, plInt32 y, plInt32 z, plInt32 w)
20{
21 PL_CHECK_SIMD_ALIGNMENT(this);
22
23 alignas(16) plInt32 values[4] = {x, y, z, w};
24 m_v = vld1q_s32(values);
25}
26
27PL_ALWAYS_INLINE plSimdVec4i::plSimdVec4i(plInternal::QuadInt v)
28{
29 m_v = v;
30}
31
32PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::MakeZero()
33{
34 return vmovq_n_s32(0);
35}
36
37PL_ALWAYS_INLINE void plSimdVec4i::Set(plInt32 xyzw)
38{
39 m_v = vmovq_n_s32(xyzw);
40}
41
42PL_ALWAYS_INLINE void plSimdVec4i::Set(plInt32 x, plInt32 y, plInt32 z, plInt32 w)
43{
44 alignas(16) plInt32 values[4] = {x, y, z, w};
45 m_v = vld1q_s32(values);
46}
47
48PL_ALWAYS_INLINE void plSimdVec4i::SetZero()
49{
50 m_v = vmovq_n_s32(0);
51}
52
53template <>
54PL_ALWAYS_INLINE void plSimdVec4i::Load<1>(const plInt32* pInts)
55{
56 m_v = vld1q_lane_s32(pInts, vmovq_n_s32(0), 0);
57}
58
59template <>
60PL_ALWAYS_INLINE void plSimdVec4i::Load<2>(const plInt32* pInts)
61{
62 m_v = vreinterpretq_s32_s64(vld1q_lane_s64(reinterpret_cast<const int64_t*>(pInts), vmovq_n_s64(0), 0));
63}
64
65template <>
66PL_ALWAYS_INLINE void plSimdVec4i::Load<3>(const plInt32* pInts)
67{
68 m_v = vcombine_s32(vld1_s32(pInts), vld1_lane_s32(pInts + 2, vmov_n_s32(0), 0));
69}
70
71template <>
72PL_ALWAYS_INLINE void plSimdVec4i::Load<4>(const plInt32* pInts)
73{
74 m_v = vld1q_s32(pInts);
75}
76
77template <>
78PL_ALWAYS_INLINE void plSimdVec4i::Store<1>(plInt32* pInts) const
79{
80 vst1q_lane_s32(pInts, m_v, 0);
81}
82
83template <>
84PL_ALWAYS_INLINE void plSimdVec4i::Store<2>(plInt32* pInts) const
85{
86 vst1q_lane_s64(reinterpret_cast<int64_t*>(pInts), vreinterpretq_s64_s32(m_v), 0);
87}
88
89template <>
90PL_ALWAYS_INLINE void plSimdVec4i::Store<3>(plInt32* pInts) const
91{
92 vst1q_lane_s64(reinterpret_cast<int64_t*>(pInts), vreinterpretq_s64_s32(m_v), 0);
93 vst1q_lane_s32(pInts + 2, m_v, 2);
94}
95
96template <>
97PL_ALWAYS_INLINE void plSimdVec4i::Store<4>(plInt32* pInts) const
98{
99 vst1q_s32(pInts, m_v);
100}
101
102PL_ALWAYS_INLINE plSimdVec4f plSimdVec4i::ToFloat() const
103{
104 return vcvtq_f32_s32(m_v);
105}
106
107// static
108PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::Truncate(const plSimdVec4f& f)
109{
110 return vcvtq_s32_f32(f.m_v);
111}
112
113template <int N>
114PL_ALWAYS_INLINE plInt32 plSimdVec4i::GetComponent() const
115{
116 return vgetq_lane_s32(m_v, N);
117}
118
119PL_ALWAYS_INLINE plInt32 plSimdVec4i::x() const
120{
121 return GetComponent<0>();
122}
123
124PL_ALWAYS_INLINE plInt32 plSimdVec4i::y() const
125{
126 return GetComponent<1>();
127}
128
129PL_ALWAYS_INLINE plInt32 plSimdVec4i::z() const
130{
131 return GetComponent<2>();
132}
133
134PL_ALWAYS_INLINE plInt32 plSimdVec4i::w() const
135{
136 return GetComponent<3>();
137}
138
139template <plSwizzle::Enum s>
140PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::Get() const
141{
142 return __builtin_shufflevector(m_v, m_v, PL_TO_SHUFFLE(s));
143}
144
145template <plSwizzle::Enum s>
146PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::GetCombined(const plSimdVec4i& other) const
147{
148 return __builtin_shufflevector(m_v, other.m_v, PL_TO_SHUFFLE(s));
149}
150
151PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator-() const
152{
153 return vnegq_s32(m_v);
154}
155
156PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator+(const plSimdVec4i& v) const
157{
158 return vaddq_s32(m_v, v.m_v);
159}
160
161PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator-(const plSimdVec4i& v) const
162{
163 return vsubq_s32(m_v, v.m_v);
164}
165
166PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::CompMul(const plSimdVec4i& v) const
167{
168 return vmulq_s32(m_v, v.m_v);
169}
170
171PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::CompDiv(const plSimdVec4i& v) const
172{
173 int a[4];
174 int b[4];
175 Store<4>(a);
176 v.Store<4>(b);
177
178 for (plUInt32 i = 0; i < 4; ++i)
179 {
180 a[i] = a[i] / b[i];
181 }
182
183 plSimdVec4i r;
184 r.Load<4>(a);
185 return r;
186}
187
188PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator|(const plSimdVec4i& v) const
189{
190 return vorrq_s32(m_v, v.m_v);
191}
192
193PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator&(const plSimdVec4i& v) const
194{
195 return vandq_s32(m_v, v.m_v);
196}
197
198PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator^(const plSimdVec4i& v) const
199{
200 return veorq_s32(m_v, v.m_v);
201}
202
203PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator~() const
204{
205 return vmvnq_s32(m_v);
206}
207
208PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator<<(plUInt32 uiShift) const
209{
210 return vshlq_s32(m_v, vmovq_n_s32(uiShift));
211}
212
213PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator>>(plUInt32 uiShift) const
214{
215 return vshlq_s32(m_v, vmovq_n_s32(-uiShift));
216}
217
218PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator<<(const plSimdVec4i& v) const
219{
220 return vshlq_s32(m_v, v.m_v);
221}
222
223PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::operator>>(const plSimdVec4i& v) const
224{
225 return vshlq_s32(m_v, vnegq_s32(v.m_v));
226}
227
228PL_ALWAYS_INLINE plSimdVec4i& plSimdVec4i::operator+=(const plSimdVec4i& v)
229{
230 m_v = vaddq_s32(m_v, v.m_v);
231 return *this;
232}
233
234PL_ALWAYS_INLINE plSimdVec4i& plSimdVec4i::operator-=(const plSimdVec4i& v)
235{
236 m_v = vsubq_s32(m_v, v.m_v);
237 return *this;
238}
239
240PL_ALWAYS_INLINE plSimdVec4i& plSimdVec4i::operator|=(const plSimdVec4i& v)
241{
242 m_v = vorrq_s32(m_v, v.m_v);
243 return *this;
244}
245
246PL_ALWAYS_INLINE plSimdVec4i& plSimdVec4i::operator&=(const plSimdVec4i& v)
247{
248 m_v = vandq_s32(m_v, v.m_v);
249 return *this;
250}
251
252PL_ALWAYS_INLINE plSimdVec4i& plSimdVec4i::operator^=(const plSimdVec4i& v)
253{
254 m_v = veorq_s32(m_v, v.m_v);
255 return *this;
256}
257
258PL_ALWAYS_INLINE plSimdVec4i& plSimdVec4i::operator<<=(plUInt32 uiShift)
259{
260 m_v = vshlq_s32(m_v, vmovq_n_s32(uiShift));
261 return *this;
262}
263
264PL_ALWAYS_INLINE plSimdVec4i& plSimdVec4i::operator>>=(plUInt32 uiShift)
265{
266 m_v = vshlq_s32(m_v, vmovq_n_s32(-uiShift));
267 return *this;
268}
269
270PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::CompMin(const plSimdVec4i& v) const
271{
272 return vminq_s32(m_v, v.m_v);
273}
274
275PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::CompMax(const plSimdVec4i& v) const
276{
277 return vmaxq_s32(m_v, v.m_v);
278}
279
280PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::Abs() const
281{
282 return vabsq_s32(m_v);
283}
284
285PL_ALWAYS_INLINE plSimdVec4b plSimdVec4i::operator==(const plSimdVec4i& v) const
286{
287 return vceqq_s32(m_v, v.m_v);
288}
289
290PL_ALWAYS_INLINE plSimdVec4b plSimdVec4i::operator!=(const plSimdVec4i& v) const
291{
292 return vmvnq_u32(vceqq_s32(m_v, v.m_v));
293}
294
295PL_ALWAYS_INLINE plSimdVec4b plSimdVec4i::operator<=(const plSimdVec4i& v) const
296{
297 return vcleq_s32(m_v, v.m_v);
298}
299
300PL_ALWAYS_INLINE plSimdVec4b plSimdVec4i::operator<(const plSimdVec4i& v) const
301{
302 return vcltq_s32(m_v, v.m_v);
303}
304
305PL_ALWAYS_INLINE plSimdVec4b plSimdVec4i::operator>=(const plSimdVec4i& v) const
306{
307 return vcgeq_s32(m_v, v.m_v);
308}
309
310PL_ALWAYS_INLINE plSimdVec4b plSimdVec4i::operator>(const plSimdVec4i& v) const
311{
312 return vcgtq_s32(m_v, v.m_v);
313}
314
315// static
316PL_ALWAYS_INLINE plSimdVec4i plSimdVec4i::Select(const plSimdVec4b& vCmp, const plSimdVec4i& vTrue, const plSimdVec4i& vFalse)
317{
318 return vbslq_s32(vCmp.m_v, vTrue.m_v, vFalse.m_v);
319}
320
321// not needed atm
322#if 0
323void plSimdVec4i::Transpose(plSimdVec4i& v0, plSimdVec4i& v1, plSimdVec4i& v2, plSimdVec4i& v3)
324{
325 int32x4x2_t P0 = vzipq_s32(v0.m_v, v2.m_v);
326 int32x4x2_t P1 = vzipq_s32(v1.m_v, v3.m_v);
327
328 int32x4x2_t T0 = vzipq_s32(P0.val[0], P1.val[0]);
329 int32x4x2_t T1 = vzipq_s32(P0.val[1], P1.val[1]);
330
331 v0.m_v = T0.val[0];
332 v1.m_v = T0.val[1];
333 v2.m_v = T1.val[0];
334 v3.m_v = T1.val[1];
335}
336#endif
Definition SimdVec4b.h:7
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