11 #ifndef EIGEN_TYPE_CASTING_NEON_H 12 #define EIGEN_TYPE_CASTING_NEON_H 15 #include "../../InternalHeaderCheck.h" 26 EIGEN_STRONG_INLINE Packet8c preinterpret<Packet8c, Packet16c>(
const Packet16c& a) {
27 return Packet8c(vget_low_s8(a));
30 EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet8c>(
const Packet8c& a) {
31 return Packet4c(vget_lane_s32(vreinterpret_s32_s8(a), 0));
34 EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet16c>(
const Packet16c& a) {
35 return preinterpret<Packet4c>(preinterpret<Packet8c>(a));
39 EIGEN_STRONG_INLINE Packet8uc preinterpret<Packet8uc, Packet16uc>(
const Packet16uc& a) {
40 return Packet8uc(vget_low_u8(a));
43 EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet8uc>(
const Packet8uc& a) {
44 return Packet4uc(vget_lane_u32(vreinterpret_u32_u8(a), 0));
47 EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet16uc>(
const Packet16uc& a) {
48 return preinterpret<Packet4uc>(preinterpret<Packet8uc>(a));
52 EIGEN_STRONG_INLINE Packet4s preinterpret<Packet4s, Packet8s>(
const Packet8s& a) {
53 return Packet4s(vget_low_s16(a));
57 EIGEN_STRONG_INLINE Packet4us preinterpret<Packet4us, Packet8us>(
const Packet8us& a) {
58 return Packet4us(vget_low_u16(a));
62 EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet4i>(
const Packet4i& a) {
63 return Packet2i(vget_low_s32(a));
66 EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet4ui>(
const Packet4ui& a) {
67 return Packet2ui(vget_low_u32(a));
71 EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet4f>(
const Packet4f& a) {
72 return Packet2f(vget_low_f32(a));
79 EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2i>(
const Packet2i& a) {
80 return Packet2f(vreinterpret_f32_s32(a));
83 EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2ui>(
const Packet2ui& a) {
84 return Packet2f(vreinterpret_f32_u32(a));
87 EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4i>(
const Packet4i& a) {
88 return Packet4f(vreinterpretq_f32_s32(a));
91 EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4ui>(
const Packet4ui& a) {
92 return Packet4f(vreinterpretq_f32_u32(a));
96 EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet4uc>(
const Packet4uc& a) {
97 return static_cast<Packet4c
>(a);
100 EIGEN_STRONG_INLINE Packet8c preinterpret<Packet8c, Packet8uc>(
const Packet8uc& a) {
101 return Packet8c(vreinterpret_s8_u8(a));
104 EIGEN_STRONG_INLINE Packet16c preinterpret<Packet16c, Packet16uc>(
const Packet16uc& a) {
105 return Packet16c(vreinterpretq_s8_u8(a));
109 EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet4c>(
const Packet4c& a) {
110 return static_cast<Packet4uc
>(a);
113 EIGEN_STRONG_INLINE Packet8uc preinterpret<Packet8uc, Packet8c>(
const Packet8c& a) {
114 return Packet8uc(vreinterpret_u8_s8(a));
117 EIGEN_STRONG_INLINE Packet16uc preinterpret<Packet16uc, Packet16c>(
const Packet16c& a) {
118 return Packet16uc(vreinterpretq_u8_s8(a));
122 EIGEN_STRONG_INLINE Packet4s preinterpret<Packet4s, Packet4us>(
const Packet4us& a) {
123 return Packet4s(vreinterpret_s16_u16(a));
126 EIGEN_STRONG_INLINE Packet8s preinterpret<Packet8s, Packet8us>(
const Packet8us& a) {
127 return Packet8s(vreinterpretq_s16_u16(a));
130 EIGEN_STRONG_INLINE Packet4us preinterpret<Packet4us, Packet4s>(
const Packet4s& a) {
131 return Packet4us(vreinterpret_u16_s16(a));
134 EIGEN_STRONG_INLINE Packet8us preinterpret<Packet8us, Packet8s>(
const Packet8s& a) {
135 return Packet8us(vreinterpretq_u16_s16(a));
139 EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2f>(
const Packet2f& a) {
140 return Packet2i(vreinterpret_s32_f32(a));
143 EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2ui>(
const Packet2ui& a) {
144 return Packet2i(vreinterpret_s32_u32(a));
147 EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4f>(
const Packet4f& a) {
148 return Packet4i(vreinterpretq_s32_f32(a));
151 EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4ui>(
const Packet4ui& a) {
152 return Packet4i(vreinterpretq_s32_u32(a));
156 EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2f>(
const Packet2f& a) {
157 return Packet2ui(vreinterpret_u32_f32(a));
160 EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2i>(
const Packet2i& a) {
161 return Packet2ui(vreinterpret_u32_s32(a));
164 EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4f>(
const Packet4f& a) {
165 return Packet4ui(vreinterpretq_u32_f32(a));
168 EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4i>(
const Packet4i& a) {
169 return Packet4ui(vreinterpretq_u32_s32(a));
173 EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2ul>(
const Packet2ul& a) {
174 return Packet2l(vreinterpretq_s64_u64(a));
177 EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2l>(
const Packet2l& a) {
178 return Packet2ul(vreinterpretq_u64_s64(a));
186 struct type_casting_traits<float, numext::int64_t> {
187 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
190 struct type_casting_traits<float, numext::uint64_t> {
191 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
196 EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
198 return vcvtq_s64_f64(vcvt_f64_f32(vget_low_f32(a)));
201 EIGEN_STRONG_INLINE Packet2l pcast<Packet2f, Packet2l>(
const Packet2f& a) {
202 return vcvtq_s64_f64(vcvt_f64_f32(a));
205 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
207 return vcvtq_u64_f64(vcvt_f64_f32(vget_low_f32(a)));
210 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2f, Packet2ul>(
const Packet2f& a) {
211 return vcvtq_u64_f64(vcvt_f64_f32(a));
215 EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
217 return vmovl_s32(vget_low_s32(vcvtq_s32_f32(a)));
220 EIGEN_STRONG_INLINE Packet2l pcast<Packet2f, Packet2l>(
const Packet2f& a) {
221 return vmovl_s32(vcvt_s32_f32(a));
224 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
226 return vmovl_u32(vget_low_u32(vcvtq_u32_f32(a)));
229 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2f, Packet2ul>(
const Packet2f& a) {
231 return vmovl_u32(vcvt_u32_f32(a));
233 #endif // EIGEN_ARCH_ARM64 236 struct type_casting_traits<float, numext::int32_t> {
237 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
240 EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(
const Packet4f& a) {
241 return vcvtq_s32_f32(a);
244 EIGEN_STRONG_INLINE Packet2i pcast<Packet2f, Packet2i>(
const Packet2f& a) {
245 return vcvt_s32_f32(a);
249 struct type_casting_traits<float, numext::uint32_t> {
250 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
253 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4f, Packet4ui>(
const Packet4f& a) {
254 return vcvtq_u32_f32(a);
257 EIGEN_STRONG_INLINE Packet2ui pcast<Packet2f, Packet2ui>(
const Packet2f& a) {
258 return vcvt_u32_f32(a);
262 struct type_casting_traits<float, numext::int16_t> {
263 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
266 EIGEN_STRONG_INLINE Packet8s pcast<Packet4f, Packet8s>(
const Packet4f& a,
const Packet4f& b) {
267 return vcombine_s16(vmovn_s32(vcvtq_s32_f32(a)), vmovn_s32(vcvtq_s32_f32(b)));
270 EIGEN_STRONG_INLINE Packet4s pcast<Packet4f, Packet4s>(
const Packet4f& a) {
271 return vmovn_s32(vcvtq_s32_f32(a));
274 EIGEN_STRONG_INLINE Packet4s pcast<Packet2f, Packet4s>(
const Packet2f& a,
const Packet2f& b) {
275 return vmovn_s32(vcombine_s32(vcvt_s32_f32(a), vcvt_s32_f32(b)));
279 struct type_casting_traits<float, numext::uint16_t> {
280 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
283 EIGEN_STRONG_INLINE Packet8us pcast<Packet4f, Packet8us>(
const Packet4f& a,
const Packet4f& b) {
284 return vcombine_u16(vmovn_u32(vcvtq_u32_f32(a)), vmovn_u32(vcvtq_u32_f32(b)));
287 EIGEN_STRONG_INLINE Packet4us pcast<Packet4f, Packet4us>(
const Packet4f& a) {
288 return vmovn_u32(vcvtq_u32_f32(a));
291 EIGEN_STRONG_INLINE Packet4us pcast<Packet2f, Packet4us>(
const Packet2f& a,
const Packet2f& b) {
292 return vmovn_u32(vcombine_u32(vcvt_u32_f32(a), vcvt_u32_f32(b)));
296 struct type_casting_traits<float, numext::int8_t> {
297 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
300 EIGEN_STRONG_INLINE Packet16c pcast<Packet4f, Packet16c>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
302 const int16x8_t ab_s16 = pcast<Packet4f, Packet8s>(a, b);
303 const int16x8_t cd_s16 = pcast<Packet4f, Packet8s>(c, d);
304 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
307 EIGEN_STRONG_INLINE Packet8c pcast<Packet4f, Packet8c>(
const Packet4f& a,
const Packet4f& b) {
308 const int16x8_t ab_s16 = pcast<Packet4f, Packet8s>(a, b);
309 return vmovn_s16(ab_s16);
312 EIGEN_STRONG_INLINE Packet8c pcast<Packet2f, Packet8c>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
314 const int16x4_t ab_s16 = pcast<Packet2f, Packet4s>(a, b);
315 const int16x4_t cd_s16 = pcast<Packet2f, Packet4s>(c, d);
316 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
319 EIGEN_STRONG_INLINE Packet4c pcast<Packet4f, Packet4c>(
const Packet4f& a) {
320 const int32x4_t a_s32x4 = vcvtq_s32_f32(a);
321 const int16x4_t a_s16x4 = vmovn_s32(a_s32x4);
322 const int16x8_t aa_s16x8 = vcombine_s16(a_s16x4, a_s16x4);
323 const int8x8_t aa_s8x8 = vmovn_s16(aa_s16x8);
324 return vget_lane_s32(vreinterpret_s32_s8(aa_s8x8), 0);
328 struct type_casting_traits<float, numext::uint8_t> {
329 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
332 EIGEN_STRONG_INLINE Packet16uc pcast<Packet4f, Packet16uc>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
334 return preinterpret<Packet16uc>(pcast<Packet4f, Packet16c>(a, b, c, d));
337 EIGEN_STRONG_INLINE Packet8uc pcast<Packet4f, Packet8uc>(
const Packet4f& a,
const Packet4f& b) {
338 return preinterpret<Packet8uc>(pcast<Packet4f, Packet8c>(a, b));
341 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2f, Packet8uc>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
343 return preinterpret<Packet8uc>(pcast<Packet2f, Packet8c>(a, b, c, d));
346 EIGEN_STRONG_INLINE Packet4uc pcast<Packet4f, Packet4uc>(
const Packet4f& a) {
347 return static_cast<Packet4uc
>(pcast<Packet4f, Packet4c>(a));
354 struct type_casting_traits<numext::int8_t, float> {
355 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
358 EIGEN_STRONG_INLINE Packet4f pcast<Packet16c, Packet4f>(
const Packet16c& a) {
360 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a)))));
363 EIGEN_STRONG_INLINE Packet4f pcast<Packet4c, Packet4f>(
const Packet4c& a) {
364 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_s32(vdup_n_s32(a))))));
367 EIGEN_STRONG_INLINE Packet2f pcast<Packet8c, Packet2f>(
const Packet8c& a) {
369 return vcvt_f32_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a)))));
373 struct type_casting_traits<numext::int8_t, numext::int64_t> {
374 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
377 EIGEN_STRONG_INLINE Packet2l pcast<Packet16c, Packet2l>(
const Packet16c& a) {
379 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))))));
383 struct type_casting_traits<numext::int8_t, numext::uint64_t> {
384 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
387 EIGEN_STRONG_INLINE Packet2ul pcast<Packet16c, Packet2ul>(
const Packet16c& a) {
388 return preinterpret<Packet2ul>(pcast<Packet16c, Packet2l>(a));
392 struct type_casting_traits<numext::int8_t, numext::int32_t> {
393 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
396 EIGEN_STRONG_INLINE Packet4i pcast<Packet16c, Packet4i>(
const Packet16c& a) {
398 return vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))));
401 EIGEN_STRONG_INLINE Packet4i pcast<Packet8c, Packet4i>(
const Packet8c& a) {
402 return vmovl_s16(vget_low_s16(vmovl_s8(a)));
405 EIGEN_STRONG_INLINE Packet4i pcast<Packet4c, Packet4i>(
const Packet4c& a) {
406 return pcast<Packet8c, Packet4i>(vreinterpret_s8_s32(vdup_n_s32(a)));
409 EIGEN_STRONG_INLINE Packet2i pcast<Packet8c, Packet2i>(
const Packet8c& a) {
411 return vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a))));
415 struct type_casting_traits<numext::int8_t, numext::uint32_t> {
416 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
419 EIGEN_STRONG_INLINE Packet4ui pcast<Packet16c, Packet4ui>(
const Packet16c& a) {
420 return preinterpret<Packet4ui>(pcast<Packet16c, Packet4i>(a));
423 EIGEN_STRONG_INLINE Packet2ui pcast<Packet8c, Packet2ui>(
const Packet8c& a) {
424 return preinterpret<Packet2ui>(pcast<Packet8c, Packet2i>(a));
427 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4c, Packet4ui>(
const Packet4c& a) {
428 return preinterpret<Packet4ui>(pcast<Packet4c, Packet4i>(a));
432 struct type_casting_traits<numext::int8_t, numext::int16_t> {
433 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
436 EIGEN_STRONG_INLINE Packet8s pcast<Packet16c, Packet8s>(
const Packet16c& a) {
438 return vmovl_s8(vget_low_s8(a));
441 EIGEN_STRONG_INLINE Packet8s pcast<Packet8c, Packet8s>(
const Packet8c& a) {
445 EIGEN_STRONG_INLINE Packet4s pcast<Packet8c, Packet4s>(
const Packet8c& a) {
447 return vget_low_s16(vmovl_s8(a));
450 EIGEN_STRONG_INLINE Packet4s pcast<Packet4c, Packet4s>(
const Packet4c& a) {
451 return pcast<Packet8c, Packet4s>(vreinterpret_s8_s32(vdup_n_s32(a)));
455 struct type_casting_traits<numext::int8_t, numext::uint16_t> {
456 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
459 EIGEN_STRONG_INLINE Packet8us pcast<Packet16c, Packet8us>(
const Packet16c& a) {
460 return preinterpret<Packet8us>(pcast<Packet16c, Packet8s>(a));
463 EIGEN_STRONG_INLINE Packet8us pcast<Packet8c, Packet8us>(
const Packet8c& a) {
464 return preinterpret<Packet8us>(pcast<Packet8c, Packet8s>(a));
467 EIGEN_STRONG_INLINE Packet4us pcast<Packet8c, Packet4us>(
const Packet8c& a) {
468 return preinterpret<Packet4us>(pcast<Packet8c, Packet4s>(a));
471 EIGEN_STRONG_INLINE Packet4us pcast<Packet4c, Packet4us>(
const Packet4c& a) {
472 return preinterpret<Packet4us>(pcast<Packet4c, Packet4s>(a));
479 struct type_casting_traits<numext::uint8_t, float> {
480 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
483 EIGEN_STRONG_INLINE Packet4f pcast<Packet16uc, Packet4f>(
const Packet16uc& a) {
485 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a)))));
488 EIGEN_STRONG_INLINE Packet4f pcast<Packet4uc, Packet4f>(
const Packet4uc& a) {
489 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))))));
492 EIGEN_STRONG_INLINE Packet2f pcast<Packet8uc, Packet2f>(
const Packet8uc& a) {
494 return vcvt_f32_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a)))));
498 struct type_casting_traits<numext::uint8_t, numext::uint64_t> {
499 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
502 EIGEN_STRONG_INLINE Packet2ul pcast<Packet16uc, Packet2ul>(
const Packet16uc& a) {
504 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))))));
508 struct type_casting_traits<numext::uint8_t, numext::int64_t> {
509 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
512 EIGEN_STRONG_INLINE Packet2l pcast<Packet16uc, Packet2l>(
const Packet16uc& a) {
513 return preinterpret<Packet2l>(pcast<Packet16uc, Packet2ul>(a));
517 struct type_casting_traits<numext::uint8_t, numext::uint32_t> {
518 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
521 EIGEN_STRONG_INLINE Packet4ui pcast<Packet16uc, Packet4ui>(
const Packet16uc& a) {
523 return vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))));
526 EIGEN_STRONG_INLINE Packet4ui pcast<Packet8uc, Packet4ui>(
const Packet8uc& a) {
527 return vmovl_u16(vget_low_u16(vmovl_u8(a)));
530 EIGEN_STRONG_INLINE Packet2ui pcast<Packet8uc, Packet2ui>(
const Packet8uc& a) {
532 return vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a))));
535 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4uc, Packet4ui>(
const Packet4uc& a) {
536 return pcast<Packet8uc, Packet4ui>(vreinterpret_u8_u32(vdup_n_u32(a)));
540 struct type_casting_traits<numext::uint8_t, numext::int32_t> {
541 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
544 EIGEN_STRONG_INLINE Packet4i pcast<Packet16uc, Packet4i>(
const Packet16uc& a) {
545 return preinterpret<Packet4i>(pcast<Packet16uc, Packet4ui>(a));
548 EIGEN_STRONG_INLINE Packet2i pcast<Packet8uc, Packet2i>(
const Packet8uc& a) {
549 return preinterpret<Packet2i>(pcast<Packet8uc, Packet2ui>(a));
552 EIGEN_STRONG_INLINE Packet4i pcast<Packet4uc, Packet4i>(
const Packet4uc& a) {
553 return preinterpret<Packet4i>(pcast<Packet4uc, Packet4ui>(a));
557 struct type_casting_traits<numext::uint8_t, numext::uint16_t> {
558 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
561 EIGEN_STRONG_INLINE Packet8us pcast<Packet16uc, Packet8us>(
const Packet16uc& a) {
563 return vmovl_u8(vget_low_u8(a));
566 EIGEN_STRONG_INLINE Packet8us pcast<Packet8uc, Packet8us>(
const Packet8uc& a) {
570 EIGEN_STRONG_INLINE Packet4us pcast<Packet4uc, Packet4us>(
const Packet4uc& a) {
571 return vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))));
575 struct type_casting_traits<numext::uint8_t, numext::int16_t> {
576 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
579 EIGEN_STRONG_INLINE Packet8s pcast<Packet16uc, Packet8s>(
const Packet16uc& a) {
580 return preinterpret<Packet8s>(pcast<Packet16uc, Packet8us>(a));
583 EIGEN_STRONG_INLINE Packet8s pcast<Packet8uc, Packet8s>(
const Packet8uc& a) {
584 return preinterpret<Packet8s>(pcast<Packet8uc, Packet8us>(a));
587 EIGEN_STRONG_INLINE Packet4s pcast<Packet4uc, Packet4s>(
const Packet4uc& a) {
588 return preinterpret<Packet4s>(pcast<Packet4uc, Packet4us>(a));
595 struct type_casting_traits<numext::int16_t, float> {
596 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
599 EIGEN_STRONG_INLINE Packet4f pcast<Packet8s, Packet4f>(
const Packet8s& a) {
601 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(a)));
604 EIGEN_STRONG_INLINE Packet4f pcast<Packet4s, Packet4f>(
const Packet4s& a) {
605 return vcvtq_f32_s32(vmovl_s16(a));
608 EIGEN_STRONG_INLINE Packet2f pcast<Packet4s, Packet2f>(
const Packet4s& a) {
610 return vcvt_f32_s32(vget_low_s32(vmovl_s16(a)));
614 struct type_casting_traits<numext::int16_t, numext::int64_t> {
615 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
618 EIGEN_STRONG_INLINE Packet2l pcast<Packet8s, Packet2l>(
const Packet8s& a) {
620 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(a))));
624 struct type_casting_traits<numext::int16_t, numext::uint64_t> {
625 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
628 EIGEN_STRONG_INLINE Packet2ul pcast<Packet8s, Packet2ul>(
const Packet8s& a) {
629 return preinterpret<Packet2ul>(pcast<Packet8s, Packet2l>(a));
633 struct type_casting_traits<numext::int16_t, numext::int32_t> {
634 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
637 EIGEN_STRONG_INLINE Packet4i pcast<Packet8s, Packet4i>(
const Packet8s& a) {
639 return vmovl_s16(vget_low_s16(a));
642 EIGEN_STRONG_INLINE Packet4i pcast<Packet4s, Packet4i>(
const Packet4s& a) {
646 EIGEN_STRONG_INLINE Packet2i pcast<Packet4s, Packet2i>(
const Packet4s& a) {
648 return vget_low_s32(vmovl_s16(a));
652 struct type_casting_traits<numext::int16_t, numext::uint32_t> {
653 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
656 EIGEN_STRONG_INLINE Packet4ui pcast<Packet8s, Packet4ui>(
const Packet8s& a) {
657 return preinterpret<Packet4ui>(pcast<Packet8s, Packet4i>(a));
660 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4s, Packet4ui>(
const Packet4s& a) {
661 return preinterpret<Packet4ui>(pcast<Packet4s, Packet4i>(a));
664 EIGEN_STRONG_INLINE Packet2ui pcast<Packet4s, Packet2ui>(
const Packet4s& a) {
665 return preinterpret<Packet2ui>(pcast<Packet4s, Packet2i>(a));
669 struct type_casting_traits<numext::int16_t, numext::int8_t> {
670 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
673 EIGEN_STRONG_INLINE Packet16c pcast<Packet8s, Packet16c>(
const Packet8s& a,
const Packet8s& b) {
674 return vcombine_s8(vmovn_s16(a), vmovn_s16(b));
677 EIGEN_STRONG_INLINE Packet8c pcast<Packet8s, Packet8c>(
const Packet8s& a) {
681 EIGEN_STRONG_INLINE Packet8c pcast<Packet4s, Packet8c>(
const Packet4s& a,
const Packet4s& b) {
682 return vmovn_s16(vcombine_s16(a, b));
685 EIGEN_STRONG_INLINE Packet4c pcast<Packet4s, Packet4c>(
const Packet4s& a) {
686 const int8x8_t aa_s8x8 = pcast<Packet4s, Packet8c>(a, a);
687 return vget_lane_s32(vreinterpret_s32_s8(aa_s8x8), 0);
691 struct type_casting_traits<numext::int16_t, numext::uint8_t> {
692 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
695 EIGEN_STRONG_INLINE Packet16uc pcast<Packet8s, Packet16uc>(
const Packet8s& a,
const Packet8s& b) {
696 return preinterpret<Packet16uc>(pcast<Packet8s, Packet16c>(a, b));
699 EIGEN_STRONG_INLINE Packet8uc pcast<Packet8s, Packet8uc>(
const Packet8s& a) {
700 return preinterpret<Packet8uc>(pcast<Packet8s, Packet8c>(a));
703 EIGEN_STRONG_INLINE Packet8uc pcast<Packet4s, Packet8uc>(
const Packet4s& a,
const Packet4s& b) {
704 return preinterpret<Packet8uc>(pcast<Packet4s, Packet8c>(a, b));
707 EIGEN_STRONG_INLINE Packet4uc pcast<Packet4s, Packet4uc>(
const Packet4s& a) {
708 return static_cast<Packet4uc
>(pcast<Packet4s, Packet4c>(a));
715 struct type_casting_traits<numext::uint16_t, float> {
716 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
719 EIGEN_STRONG_INLINE Packet4f pcast<Packet8us, Packet4f>(
const Packet8us& a) {
721 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(a)));
724 EIGEN_STRONG_INLINE Packet4f pcast<Packet4us, Packet4f>(
const Packet4us& a) {
725 return vcvtq_f32_u32(vmovl_u16(a));
728 EIGEN_STRONG_INLINE Packet2f pcast<Packet4us, Packet2f>(
const Packet4us& a) {
730 return vcvt_f32_u32(vget_low_u32(vmovl_u16(a)));
734 struct type_casting_traits<numext::uint16_t, numext::uint64_t> {
735 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
738 EIGEN_STRONG_INLINE Packet2ul pcast<Packet8us, Packet2ul>(
const Packet8us& a) {
740 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(a))));
744 struct type_casting_traits<numext::uint16_t, numext::int64_t> {
745 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
748 EIGEN_STRONG_INLINE Packet2l pcast<Packet8us, Packet2l>(
const Packet8us& a) {
749 return preinterpret<Packet2l>(pcast<Packet8us, Packet2ul>(a));
753 struct type_casting_traits<numext::uint16_t, numext::uint32_t> {
754 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
757 EIGEN_STRONG_INLINE Packet4ui pcast<Packet8us, Packet4ui>(
const Packet8us& a) {
759 return vmovl_u16(vget_low_u16(a));
762 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4us, Packet4ui>(
const Packet4us& a) {
766 EIGEN_STRONG_INLINE Packet2ui pcast<Packet4us, Packet2ui>(
const Packet4us& a) {
768 return vget_low_u32(vmovl_u16(a));
772 struct type_casting_traits<numext::uint16_t, numext::int32_t> {
773 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
776 EIGEN_STRONG_INLINE Packet4i pcast<Packet8us, Packet4i>(
const Packet8us& a) {
777 return preinterpret<Packet4i>(pcast<Packet8us, Packet4ui>(a));
780 EIGEN_STRONG_INLINE Packet4i pcast<Packet4us, Packet4i>(
const Packet4us& a) {
781 return preinterpret<Packet4i>(pcast<Packet4us, Packet4ui>(a));
784 EIGEN_STRONG_INLINE Packet2i pcast<Packet4us, Packet2i>(
const Packet4us& a) {
785 return preinterpret<Packet2i>(pcast<Packet4us, Packet2ui>(a));
789 struct type_casting_traits<numext::uint16_t, numext::uint8_t> {
790 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
793 EIGEN_STRONG_INLINE Packet16uc pcast<Packet8us, Packet16uc>(
const Packet8us& a,
const Packet8us& b) {
794 return vcombine_u8(vmovn_u16(a), vmovn_u16(b));
797 EIGEN_STRONG_INLINE Packet8uc pcast<Packet8us, Packet8uc>(
const Packet8us& a) {
801 EIGEN_STRONG_INLINE Packet8uc pcast<Packet4us, Packet8uc>(
const Packet4us& a,
const Packet4us& b) {
802 return vmovn_u16(vcombine_u16(a, b));
805 EIGEN_STRONG_INLINE Packet4uc pcast<Packet4us, Packet4uc>(
const Packet4us& a) {
806 uint8x8_t aa_u8x8 = pcast<Packet4us, Packet8uc>(a, a);
807 return vget_lane_u32(vreinterpret_u32_u8(aa_u8x8), 0);
811 struct type_casting_traits<numext::uint16_t, numext::int8_t> {
812 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
815 EIGEN_STRONG_INLINE Packet16c pcast<Packet8us, Packet16c>(
const Packet8us& a,
const Packet8us& b) {
816 return preinterpret<Packet16c>(pcast<Packet8us, Packet16uc>(a, b));
819 EIGEN_STRONG_INLINE Packet8c pcast<Packet8us, Packet8c>(
const Packet8us& a) {
820 return preinterpret<Packet8c>(pcast<Packet8us, Packet8uc>(a));
823 EIGEN_STRONG_INLINE Packet8c pcast<Packet4us, Packet8c>(
const Packet4us& a,
const Packet4us& b) {
824 return preinterpret<Packet8c>(pcast<Packet4us, Packet8uc>(a, b));
827 EIGEN_STRONG_INLINE Packet4c pcast<Packet4us, Packet4c>(
const Packet4us& a) {
828 return static_cast<Packet4c
>(pcast<Packet4us, Packet4uc>(a));
835 struct type_casting_traits<numext::int32_t, float> {
836 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
839 EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(
const Packet4i& a) {
840 return vcvtq_f32_s32(a);
843 EIGEN_STRONG_INLINE Packet2f pcast<Packet2i, Packet2f>(
const Packet2i& a) {
844 return vcvt_f32_s32(a);
848 struct type_casting_traits<numext::int32_t, numext::int64_t> {
849 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
852 EIGEN_STRONG_INLINE Packet2l pcast<Packet4i, Packet2l>(
const Packet4i& a) {
854 return vmovl_s32(vget_low_s32(a));
857 EIGEN_STRONG_INLINE Packet2l pcast<Packet2i, Packet2l>(
const Packet2i& a) {
862 struct type_casting_traits<numext::int32_t, numext::uint64_t> {
863 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
866 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4i, Packet2ul>(
const Packet4i& a) {
867 return preinterpret<Packet2ul>(pcast<Packet4i, Packet2l>(a));
870 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2i, Packet2ul>(
const Packet2i& a) {
871 return preinterpret<Packet2ul>(pcast<Packet2i, Packet2l>(a));
875 struct type_casting_traits<numext::int32_t, numext::int16_t> {
876 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
879 EIGEN_STRONG_INLINE Packet8s pcast<Packet4i, Packet8s>(
const Packet4i& a,
const Packet4i& b) {
880 return vcombine_s16(vmovn_s32(a), vmovn_s32(b));
883 EIGEN_STRONG_INLINE Packet4s pcast<Packet4i, Packet4s>(
const Packet4i& a) {
887 EIGEN_STRONG_INLINE Packet4s pcast<Packet2i, Packet4s>(
const Packet2i& a,
const Packet2i& b) {
888 return vmovn_s32(vcombine_s32(a, b));
892 struct type_casting_traits<numext::int32_t, numext::uint16_t> {
893 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
896 EIGEN_STRONG_INLINE Packet8us pcast<Packet4i, Packet8us>(
const Packet4i& a,
const Packet4i& b) {
897 return vcombine_u16(vmovn_u32(vreinterpretq_u32_s32(a)), vmovn_u32(vreinterpretq_u32_s32(b)));
900 EIGEN_STRONG_INLINE Packet4us pcast<Packet4i, Packet4us>(
const Packet4i& a) {
901 return vmovn_u32(vreinterpretq_u32_s32(a));
904 EIGEN_STRONG_INLINE Packet4us pcast<Packet2i, Packet4us>(
const Packet2i& a,
const Packet2i& b) {
905 return vmovn_u32(vreinterpretq_u32_s32(vcombine_s32(a, b)));
909 struct type_casting_traits<numext::int32_t, numext::int8_t> {
910 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
913 EIGEN_STRONG_INLINE Packet16c pcast<Packet4i, Packet16c>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
915 const int16x8_t ab_s16 = pcast<Packet4i, Packet8s>(a, b);
916 const int16x8_t cd_s16 = pcast<Packet4i, Packet8s>(c, d);
917 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
920 EIGEN_STRONG_INLINE Packet8c pcast<Packet4i, Packet8c>(
const Packet4i& a,
const Packet4i& b) {
921 const int16x8_t ab_s16 = pcast<Packet4i, Packet8s>(a, b);
922 return vmovn_s16(ab_s16);
925 EIGEN_STRONG_INLINE Packet8c pcast<Packet2i, Packet8c>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
927 const int16x4_t ab_s16 = vmovn_s32(vcombine_s32(a, b));
928 const int16x4_t cd_s16 = vmovn_s32(vcombine_s32(c, d));
929 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
932 EIGEN_STRONG_INLINE Packet4c pcast<Packet4i, Packet4c>(
const Packet4i& a) {
933 const int16x4_t a_s16x4 = vmovn_s32(a);
934 const int16x8_t aa_s16x8 = vcombine_s16(a_s16x4, a_s16x4);
935 const int8x8_t aa_s8x8 = vmovn_s16(aa_s16x8);
936 return vget_lane_s32(vreinterpret_s32_s8(aa_s8x8), 0);
940 struct type_casting_traits<numext::int32_t, numext::uint8_t> {
941 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
944 EIGEN_STRONG_INLINE Packet16uc pcast<Packet4i, Packet16uc>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
946 return preinterpret<Packet16uc>(pcast<Packet4i, Packet16c>(a, b, c, d));
949 EIGEN_STRONG_INLINE Packet8uc pcast<Packet4i, Packet8uc>(
const Packet4i& a,
const Packet4i& b) {
950 return preinterpret<Packet8uc>(pcast<Packet4i, Packet8c>(a, b));
953 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2i, Packet8uc>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
955 return preinterpret<Packet8uc>(pcast<Packet2i, Packet8c>(a, b, c, d));
958 EIGEN_STRONG_INLINE Packet4uc pcast<Packet4i, Packet4uc>(
const Packet4i& a) {
959 return static_cast<Packet4uc
>(pcast<Packet4i, Packet4c>(a));
966 struct type_casting_traits<numext::uint32_t, float> {
967 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
970 EIGEN_STRONG_INLINE Packet4f pcast<Packet4ui, Packet4f>(
const Packet4ui& a) {
971 return vcvtq_f32_u32(a);
974 EIGEN_STRONG_INLINE Packet2f pcast<Packet2ui, Packet2f>(
const Packet2ui& a) {
975 return vcvt_f32_u32(a);
979 struct type_casting_traits<numext::uint32_t, numext::uint64_t> {
980 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
983 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4ui, Packet2ul>(
const Packet4ui& a) {
985 return vmovl_u32(vget_low_u32(a));
988 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2ui, Packet2ul>(
const Packet2ui& a) {
993 struct type_casting_traits<numext::uint32_t, numext::int64_t> {
994 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
997 EIGEN_STRONG_INLINE Packet2l pcast<Packet4ui, Packet2l>(
const Packet4ui& a) {
998 return preinterpret<Packet2l>(pcast<Packet4ui, Packet2ul>(a));
1001 EIGEN_STRONG_INLINE Packet2l pcast<Packet2ui, Packet2l>(
const Packet2ui& a) {
1002 return preinterpret<Packet2l>(pcast<Packet2ui, Packet2ul>(a));
1006 struct type_casting_traits<numext::uint32_t, numext::uint16_t> {
1007 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1010 EIGEN_STRONG_INLINE Packet8us pcast<Packet4ui, Packet8us>(
const Packet4ui& a,
const Packet4ui& b) {
1011 return vcombine_u16(vmovn_u32(a), vmovn_u32(b));
1014 EIGEN_STRONG_INLINE Packet4us pcast<Packet2ui, Packet4us>(
const Packet2ui& a,
const Packet2ui& b) {
1015 return vmovn_u32(vcombine_u32(a, b));
1018 EIGEN_STRONG_INLINE Packet4us pcast<Packet4ui, Packet4us>(
const Packet4ui& a) {
1019 return vmovn_u32(a);
1023 struct type_casting_traits<numext::uint32_t, numext::int16_t> {
1024 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1027 EIGEN_STRONG_INLINE Packet8s pcast<Packet4ui, Packet8s>(
const Packet4ui& a,
const Packet4ui& b) {
1028 return preinterpret<Packet8s>(pcast<Packet4ui, Packet8us>(a, b));
1031 EIGEN_STRONG_INLINE Packet4s pcast<Packet2ui, Packet4s>(
const Packet2ui& a,
const Packet2ui& b) {
1032 return preinterpret<Packet4s>(pcast<Packet2ui, Packet4us>(a, b));
1035 EIGEN_STRONG_INLINE Packet4s pcast<Packet4ui, Packet4s>(
const Packet4ui& a) {
1036 return preinterpret<Packet4s>(pcast<Packet4ui, Packet4us>(a));
1040 struct type_casting_traits<numext::uint32_t, numext::uint8_t> {
1041 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1044 EIGEN_STRONG_INLINE Packet16uc pcast<Packet4ui, Packet16uc>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
1045 const Packet4ui& d) {
1046 const uint16x8_t ab_u16 = vcombine_u16(vmovn_u32(a), vmovn_u32(b));
1047 const uint16x8_t cd_u16 = vcombine_u16(vmovn_u32(c), vmovn_u32(d));
1048 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
1051 EIGEN_STRONG_INLINE Packet8uc pcast<Packet4ui, Packet8uc>(
const Packet4ui& a,
const Packet4ui& b) {
1052 const uint16x8_t ab_u16 = vcombine_u16(vmovn_u32(a), vmovn_u32(b));
1053 return vmovn_u16(ab_u16);
1056 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2ui, Packet8uc>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
1057 const Packet2ui& d) {
1058 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(a, b));
1059 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(c, d));
1060 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
1063 EIGEN_STRONG_INLINE Packet4uc pcast<Packet4ui, Packet4uc>(
const Packet4ui& a) {
1064 const uint16x4_t a_u16x4 = vmovn_u32(a);
1065 const uint16x8_t aa_u16x8 = vcombine_u16(a_u16x4, a_u16x4);
1066 const uint8x8_t aa_u8x8 = vmovn_u16(aa_u16x8);
1067 return vget_lane_u32(vreinterpret_u32_u8(aa_u8x8), 0);
1071 struct type_casting_traits<numext::uint32_t, numext::int8_t> {
1072 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1075 EIGEN_STRONG_INLINE Packet16c pcast<Packet4ui, Packet16c>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
1076 const Packet4ui& d) {
1077 return preinterpret<Packet16c>(pcast<Packet4ui, Packet16uc>(a, b, c, d));
1080 EIGEN_STRONG_INLINE Packet8c pcast<Packet4ui, Packet8c>(
const Packet4ui& a,
const Packet4ui& b) {
1081 return preinterpret<Packet8c>(pcast<Packet4ui, Packet8uc>(a, b));
1084 EIGEN_STRONG_INLINE Packet8c pcast<Packet2ui, Packet8c>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
1085 const Packet2ui& d) {
1086 return preinterpret<Packet8c>(pcast<Packet2ui, Packet8uc>(a, b, c, d));
1089 EIGEN_STRONG_INLINE Packet4c pcast<Packet4ui, Packet4c>(
const Packet4ui& a) {
1090 return static_cast<Packet4c
>(pcast<Packet4ui, Packet4uc>(a));
1097 struct type_casting_traits<numext::int64_t, float> {
1098 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1102 EIGEN_STRONG_INLINE Packet4f pcast<Packet2l, Packet4f>(
const Packet2l& a,
const Packet2l& b) {
1103 #if EIGEN_ARCH_ARM64 1104 return vcombine_f32(vcvt_f32_f64(vcvtq_f64_s64(a)), vcvt_f32_f64(vcvtq_f64_s64(b)));
1106 EIGEN_ALIGN_MAX int64_t lvals[4];
1108 pstore(lvals + 2, b);
1109 EIGEN_ALIGN_MAX
float fvals[4] = {
static_cast<float>(lvals[0]), static_cast<float>(lvals[1]),
1110 static_cast<float>(lvals[2]), static_cast<float>(lvals[3])};
1111 return pload<Packet4f>(fvals);
1116 EIGEN_STRONG_INLINE Packet2f pcast<Packet2l, Packet2f>(
const Packet2l& a) {
1117 #if EIGEN_ARCH_ARM64 1118 return vcvt_f32_f64(vcvtq_f64_s64(a));
1120 EIGEN_ALIGN_MAX int64_t lvals[2];
1122 EIGEN_ALIGN_MAX
float fvals[2] = {
static_cast<float>(lvals[0]), static_cast<float>(lvals[1])};
1123 return pload<Packet2f>(fvals);
1128 struct type_casting_traits<numext::int64_t, numext::int32_t> {
1129 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1132 EIGEN_STRONG_INLINE Packet4i pcast<Packet2l, Packet4i>(
const Packet2l& a,
const Packet2l& b) {
1133 return vcombine_s32(vmovn_s64(a), vmovn_s64(b));
1136 EIGEN_STRONG_INLINE Packet2i pcast<Packet2l, Packet2i>(
const Packet2l& a) {
1137 return vmovn_s64(a);
1141 struct type_casting_traits<numext::int64_t, numext::uint32_t> {
1142 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1145 EIGEN_STRONG_INLINE Packet4ui pcast<Packet2l, Packet4ui>(
const Packet2l& a,
const Packet2l& b) {
1146 return vcombine_u32(vmovn_u64(vreinterpretq_u64_s64(a)), vmovn_u64(vreinterpretq_u64_s64(b)));
1149 EIGEN_STRONG_INLINE Packet2ui pcast<Packet2l, Packet2ui>(
const Packet2l& a) {
1150 return vmovn_u64(vreinterpretq_u64_s64(a));
1154 struct type_casting_traits<numext::int64_t, numext::int16_t> {
1155 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1158 EIGEN_STRONG_INLINE Packet8s pcast<Packet2l, Packet8s>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1159 const Packet2l& d) {
1160 const int32x4_t ab_s32 = pcast<Packet2l, Packet4i>(a, b);
1161 const int32x4_t cd_s32 = pcast<Packet2l, Packet4i>(c, d);
1162 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
1165 EIGEN_STRONG_INLINE Packet4s pcast<Packet2l, Packet4s>(
const Packet2l& a,
const Packet2l& b) {
1166 const int32x4_t ab_s32 = pcast<Packet2l, Packet4i>(a, b);
1167 return vmovn_s32(ab_s32);
1171 struct type_casting_traits<numext::int64_t, numext::uint16_t> {
1172 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1175 EIGEN_STRONG_INLINE Packet8us pcast<Packet2l, Packet8us>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1176 const Packet2l& d) {
1177 return preinterpret<Packet8us>(pcast<Packet2l, Packet8s>(a, b, c, d));
1180 EIGEN_STRONG_INLINE Packet4us pcast<Packet2l, Packet4us>(
const Packet2l& a,
const Packet2l& b) {
1181 return preinterpret<Packet4us>(pcast<Packet2l, Packet4s>(a, b));
1185 struct type_casting_traits<numext::int64_t, numext::int8_t> {
1186 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1189 EIGEN_STRONG_INLINE Packet16c pcast<Packet2l, Packet16c>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1190 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
1191 const Packet2l& g,
const Packet2l& h) {
1192 const int16x8_t abcd_s16 = pcast<Packet2l, Packet8s>(a, b, c, d);
1193 const int16x8_t efgh_s16 = pcast<Packet2l, Packet8s>(e, f, g, h);
1194 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
1197 EIGEN_STRONG_INLINE Packet8c pcast<Packet2l, Packet8c>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1198 const Packet2l& d) {
1199 const int16x8_t abcd_s16 = pcast<Packet2l, Packet8s>(a, b, c, d);
1200 return vmovn_s16(abcd_s16);
1203 EIGEN_STRONG_INLINE Packet4c pcast<Packet2l, Packet4c>(
const Packet2l& a,
const Packet2l& b) {
1204 const int16x4_t ab_s16 = pcast<Packet2l, Packet4s>(a, b);
1205 const int16x8_t abab_s16 = vcombine_s16(ab_s16, ab_s16);
1206 const int8x8_t abab_s8 = vmovn_s16(abab_s16);
1207 return vget_lane_s32(vreinterpret_s32_s8(abab_s8), 0);
1211 struct type_casting_traits<numext::int64_t, numext::uint8_t> {
1212 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1215 EIGEN_STRONG_INLINE Packet16uc pcast<Packet2l, Packet16uc>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1216 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
1217 const Packet2l& g,
const Packet2l& h) {
1218 const uint16x8_t abcd_u16 = pcast<Packet2l, Packet8us>(a, b, c, d);
1219 const uint16x8_t efgh_u16 = pcast<Packet2l, Packet8us>(e, f, g, h);
1220 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1223 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2l, Packet8uc>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1224 const Packet2l& d) {
1225 return preinterpret<Packet8uc>(pcast<Packet2l, Packet8c>(a, b, c, d));
1228 EIGEN_STRONG_INLINE Packet4uc pcast<Packet2l, Packet4uc>(
const Packet2l& a,
const Packet2l& b) {
1229 return static_cast<Packet4uc
>(pcast<Packet2l, Packet4c>(a, b));
1236 struct type_casting_traits<numext::uint64_t, float> {
1237 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1240 EIGEN_STRONG_INLINE Packet4f pcast<Packet2ul, Packet4f>(
const Packet2ul& a,
const Packet2ul& b) {
1241 #if EIGEN_ARCH_ARM64 1242 return vcombine_f32(vcvt_f32_f64(vcvtq_f64_u64(a)), vcvt_f32_f64(vcvtq_f64_u64(b)));
1244 EIGEN_ALIGN_MAX uint64_t uvals[4];
1246 pstore(uvals + 2, b);
1247 EIGEN_ALIGN_MAX
float fvals[4] = {
static_cast<float>(uvals[0]), static_cast<float>(uvals[1]),
1248 static_cast<float>(uvals[2]), static_cast<float>(uvals[3])};
1249 return pload<Packet4f>(fvals);
1253 EIGEN_STRONG_INLINE Packet2f pcast<Packet2ul, Packet2f>(
const Packet2ul& a) {
1254 #if EIGEN_ARCH_ARM64 1255 return vcvt_f32_f64(vcvtq_f64_u64(a));
1257 EIGEN_ALIGN_MAX uint64_t uvals[2];
1259 EIGEN_ALIGN_MAX
float fvals[2] = {
static_cast<float>(uvals[0]), static_cast<float>(uvals[1])};
1260 return pload<Packet2f>(fvals);
1265 struct type_casting_traits<numext::uint64_t, numext::uint32_t> {
1266 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1269 EIGEN_STRONG_INLINE Packet4ui pcast<Packet2ul, Packet4ui>(
const Packet2ul& a,
const Packet2ul& b) {
1270 return vcombine_u32(vmovn_u64(a), vmovn_u64(b));
1273 EIGEN_STRONG_INLINE Packet2ui pcast<Packet2ul, Packet2ui>(
const Packet2ul& a) {
1274 return vmovn_u64(a);
1278 struct type_casting_traits<numext::uint64_t, numext::int32_t> {
1279 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1282 EIGEN_STRONG_INLINE Packet4i pcast<Packet2ul, Packet4i>(
const Packet2ul& a,
const Packet2ul& b) {
1283 return preinterpret<Packet4i>(pcast<Packet2ul, Packet4ui>(a, b));
1286 EIGEN_STRONG_INLINE Packet2i pcast<Packet2ul, Packet2i>(
const Packet2ul& a) {
1287 return preinterpret<Packet2i>(pcast<Packet2ul, Packet2ui>(a));
1291 struct type_casting_traits<numext::uint64_t, numext::uint16_t> {
1292 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1295 EIGEN_STRONG_INLINE Packet8us pcast<Packet2ul, Packet8us>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1296 const Packet2ul& d) {
1297 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1298 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(vmovn_u64(c), vmovn_u64(d)));
1299 return vcombine_u16(ab_u16, cd_u16);
1302 EIGEN_STRONG_INLINE Packet4us pcast<Packet2ul, Packet4us>(
const Packet2ul& a,
const Packet2ul& b) {
1303 return vmovn_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1307 struct type_casting_traits<numext::uint64_t, numext::int16_t> {
1308 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1311 EIGEN_STRONG_INLINE Packet8s pcast<Packet2ul, Packet8s>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1312 const Packet2ul& d) {
1313 return preinterpret<Packet8s>(pcast<Packet2ul, Packet8us>(a, b, c, d));
1316 EIGEN_STRONG_INLINE Packet4s pcast<Packet2ul, Packet4s>(
const Packet2ul& a,
const Packet2ul& b) {
1317 return preinterpret<Packet4s>(pcast<Packet2ul, Packet4us>(a, b));
1321 struct type_casting_traits<numext::uint64_t, numext::uint8_t> {
1322 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1325 EIGEN_STRONG_INLINE Packet16uc pcast<Packet2ul, Packet16uc>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1326 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1327 const Packet2ul& g,
const Packet2ul& h) {
1328 const uint16x8_t abcd_u16 = pcast<Packet2ul, Packet8us>(a, b, c, d);
1329 const uint16x8_t efgh_u16 = pcast<Packet2ul, Packet8us>(e, f, g, h);
1330 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1333 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2ul, Packet8uc>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1334 const Packet2ul& d) {
1335 const uint16x8_t abcd_u16 = pcast<Packet2ul, Packet8us>(a, b, c, d);
1336 return vmovn_u16(abcd_u16);
1339 EIGEN_STRONG_INLINE Packet4uc pcast<Packet2ul, Packet4uc>(
const Packet2ul& a,
const Packet2ul& b) {
1340 const uint16x4_t ab_u16 = pcast<Packet2ul, Packet4us>(a, b);
1341 const uint16x8_t abab_u16 = vcombine_u16(ab_u16, ab_u16);
1342 const uint8x8_t abab_u8 = vmovn_u16(abab_u16);
1343 return vget_lane_u32(vreinterpret_u32_u8(abab_u8), 0);
1347 struct type_casting_traits<numext::uint64_t, numext::int8_t> {
1348 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1351 EIGEN_STRONG_INLINE Packet16c pcast<Packet2ul, Packet16c>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1352 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1353 const Packet2ul& g,
const Packet2ul& h) {
1354 return preinterpret<Packet16c>(pcast<Packet2ul, Packet16uc>(a, b, c, d, e, f, g, h));
1357 EIGEN_STRONG_INLINE Packet8c pcast<Packet2ul, Packet8c>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1358 const Packet2ul& d) {
1359 return preinterpret<Packet8c>(pcast<Packet2ul, Packet8uc>(a, b, c, d));
1362 EIGEN_STRONG_INLINE Packet4c pcast<Packet2ul, Packet4c>(
const Packet2ul& a,
const Packet2ul& b) {
1363 return static_cast<Packet4c
>(pcast<Packet2ul, Packet4uc>(a, b));
1366 #if EIGEN_ARCH_ARM64 1373 EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2l>(
const Packet2l& a) {
1374 return Packet2d(vreinterpretq_f64_s64(a));
1377 EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2ul>(
const Packet2ul& a) {
1378 return Packet2d(vreinterpretq_f64_u64(a));
1381 EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2d>(
const Packet2d& a) {
1382 return Packet2l(vreinterpretq_s64_f64(a));
1385 EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2d>(
const Packet2d& a) {
1386 return Packet2ul(vreinterpretq_u64_f64(a));
1389 EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4i>(
const Packet4i& a) {
1390 return Packet2d(vreinterpretq_f64_s32(a));
1393 EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet2d>(
const Packet2d& a) {
1394 return Packet4i(vreinterpretq_s32_f64(a));
1398 struct type_casting_traits<double, float> {
1399 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1402 EIGEN_STRONG_INLINE Packet4f pcast<Packet2d, Packet4f>(
const Packet2d& a,
const Packet2d& b) {
1403 return vcombine_f32(vcvt_f32_f64(a), vcvt_f32_f64(b));
1406 EIGEN_STRONG_INLINE Packet2f pcast<Packet2d, Packet2f>(
const Packet2d& a) {
1407 return vcvt_f32_f64(a);
1411 struct type_casting_traits<double, numext::int64_t> {
1412 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1415 EIGEN_STRONG_INLINE Packet2l pcast<Packet2d, Packet2l>(
const Packet2d& a) {
1416 return vcvtq_s64_f64(a);
1420 struct type_casting_traits<double, numext::uint64_t> {
1421 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1424 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2d, Packet2ul>(
const Packet2d& a) {
1425 return vcvtq_u64_f64(a);
1429 struct type_casting_traits<double, numext::int32_t> {
1430 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1433 EIGEN_STRONG_INLINE Packet4i pcast<Packet2d, Packet4i>(
const Packet2d& a,
const Packet2d& b) {
1434 return vcombine_s32(vmovn_s64(vcvtq_s64_f64(a)), vmovn_s64(vcvtq_s64_f64(b)));
1437 EIGEN_STRONG_INLINE Packet2i pcast<Packet2d, Packet2i>(
const Packet2d& a) {
1438 return vmovn_s64(vcvtq_s64_f64(a));
1442 struct type_casting_traits<double, numext::uint32_t> {
1443 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1446 EIGEN_STRONG_INLINE Packet4ui pcast<Packet2d, Packet4ui>(
const Packet2d& a,
const Packet2d& b) {
1447 return vcombine_u32(vmovn_u64(vcvtq_u64_f64(a)), vmovn_u64(vcvtq_u64_f64(b)));
1450 EIGEN_STRONG_INLINE Packet2ui pcast<Packet2d, Packet2ui>(
const Packet2d& a) {
1451 return vmovn_u64(vcvtq_u64_f64(a));
1455 struct type_casting_traits<double, numext::int16_t> {
1456 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1459 EIGEN_STRONG_INLINE Packet8s pcast<Packet2d, Packet8s>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1460 const Packet2d& d) {
1461 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1462 const int32x4_t cd_s32 = pcast<Packet2d, Packet4i>(c, d);
1463 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
1466 EIGEN_STRONG_INLINE Packet4s pcast<Packet2d, Packet4s>(
const Packet2d& a,
const Packet2d& b) {
1467 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1468 return vmovn_s32(ab_s32);
1472 struct type_casting_traits<double, numext::uint16_t> {
1473 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1476 EIGEN_STRONG_INLINE Packet8us pcast<Packet2d, Packet8us>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1477 const Packet2d& d) {
1478 return preinterpret<Packet8us>(pcast<Packet2d, Packet8s>(a, b, c, d));
1481 EIGEN_STRONG_INLINE Packet4us pcast<Packet2d, Packet4us>(
const Packet2d& a,
const Packet2d& b) {
1482 return preinterpret<Packet4us>(pcast<Packet2d, Packet4s>(a, b));
1486 struct type_casting_traits<double, numext::int8_t> {
1487 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1490 EIGEN_STRONG_INLINE Packet16c pcast<Packet2d, Packet16c>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1491 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1492 const Packet2d& g,
const Packet2d& h) {
1493 const int16x8_t abcd_s16 = pcast<Packet2d, Packet8s>(a, b, c, d);
1494 const int16x8_t efgh_s16 = pcast<Packet2d, Packet8s>(e, f, g, h);
1495 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
1498 EIGEN_STRONG_INLINE Packet8c pcast<Packet2d, Packet8c>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1499 const Packet2d& d) {
1500 const int16x8_t abcd_s16 = pcast<Packet2d, Packet8s>(a, b, c, d);
1501 return vmovn_s16(abcd_s16);
1504 EIGEN_STRONG_INLINE Packet4c pcast<Packet2d, Packet4c>(
const Packet2d& a,
const Packet2d& b) {
1505 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1506 return pcast<Packet4i, Packet4c>(ab_s32);
1510 struct type_casting_traits<double, numext::uint8_t> {
1511 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1514 EIGEN_STRONG_INLINE Packet16uc pcast<Packet2d, Packet16uc>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1515 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1516 const Packet2d& g,
const Packet2d& h) {
1517 const uint16x8_t abcd_u16 = pcast<Packet2d, Packet8us>(a, b, c, d);
1518 const uint16x8_t efgh_u16 = pcast<Packet2d, Packet8us>(e, f, g, h);
1519 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1522 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2d, Packet8uc>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1523 const Packet2d& d) {
1524 return preinterpret<Packet8uc>(pcast<Packet2d, Packet8c>(a, b, c, d));
1527 EIGEN_STRONG_INLINE Packet4uc pcast<Packet2d, Packet4uc>(
const Packet2d& a,
const Packet2d& b) {
1528 return static_cast<Packet4uc
>(pcast<Packet2d, Packet4c>(a, b));
1532 struct type_casting_traits<float, double> {
1533 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1536 EIGEN_STRONG_INLINE Packet2d pcast<Packet4f, Packet2d>(
const Packet4f& a) {
1538 return vcvt_f64_f32(vget_low_f32(a));
1541 EIGEN_STRONG_INLINE Packet2d pcast<Packet2f, Packet2d>(
const Packet2f& a) {
1542 return vcvt_f64_f32(a);
1546 struct type_casting_traits<numext::int8_t, double> {
1547 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1550 EIGEN_STRONG_INLINE Packet2d pcast<Packet16c, Packet2d>(
const Packet16c& a) {
1553 Packet2f tmp = pcast<Packet8c, Packet2f>(vget_low_s8(a));
1554 return vcvt_f64_f32(tmp);
1558 struct type_casting_traits<numext::uint8_t, double> {
1559 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1562 EIGEN_STRONG_INLINE Packet2d pcast<Packet16uc, Packet2d>(
const Packet16uc& a) {
1564 Packet2f tmp = pcast<Packet8uc, Packet2f>(vget_low_u8(a));
1565 return vcvt_f64_f32(tmp);
1569 struct type_casting_traits<numext::int16_t, double> {
1570 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1573 EIGEN_STRONG_INLINE Packet2d pcast<Packet8s, Packet2d>(
const Packet8s& a) {
1575 Packet2f tmp = pcast<Packet4s, Packet2f>(vget_low_s16(a));
1576 return vcvt_f64_f32(tmp);
1580 struct type_casting_traits<numext::uint16_t, double> {
1581 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1584 EIGEN_STRONG_INLINE Packet2d pcast<Packet8us, Packet2d>(
const Packet8us& a) {
1586 Packet2f tmp = pcast<Packet4us, Packet2f>(vget_low_u16(a));
1587 return vcvt_f64_f32(tmp);
1591 struct type_casting_traits<numext::int32_t, double> {
1592 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1595 EIGEN_STRONG_INLINE Packet2d pcast<Packet4i, Packet2d>(
const Packet4i& a) {
1597 return vcvtq_f64_s64(vmovl_s32(vget_low_s32(a)));
1600 EIGEN_STRONG_INLINE Packet2d pcast<Packet2i, Packet2d>(
const Packet2i& a) {
1601 return vcvtq_f64_s64(vmovl_s32(a));
1605 struct type_casting_traits<numext::uint32_t, double> {
1606 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1609 EIGEN_STRONG_INLINE Packet2d pcast<Packet4ui, Packet2d>(
const Packet4ui& a) {
1611 return vcvtq_f64_u64(vmovl_u32(vget_low_u32(a)));
1614 EIGEN_STRONG_INLINE Packet2d pcast<Packet2ui, Packet2d>(
const Packet2ui& a) {
1615 return vcvtq_f64_u64(vmovl_u32(a));
1619 struct type_casting_traits<numext::int64_t, double> {
1620 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1623 EIGEN_STRONG_INLINE Packet2d pcast<Packet2l, Packet2d>(
const Packet2l& a) {
1624 return vcvtq_f64_s64(a);
1628 struct type_casting_traits<numext::uint64_t, double> {
1629 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1632 EIGEN_STRONG_INLINE Packet2d pcast<Packet2ul, Packet2d>(
const Packet2ul& a) {
1633 return vcvtq_f64_u64(a);
1636 #endif // EIGEN_ARCH_ARM64 1642 #endif // EIGEN_TYPE_CASTING_NEON_H Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1