11 #ifndef EIGEN_TYPE_CASTING_NEON_H 12 #define EIGEN_TYPE_CASTING_NEON_H 22 struct type_casting_traits<float, float> {
23 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
26 EIGEN_STRONG_INLINE Packet4f pcast<Packet4f, Packet4f>(
const Packet4f& a) {
30 EIGEN_STRONG_INLINE Packet2f pcast<Packet2f, Packet2f>(
const Packet2f& a) {
35 struct type_casting_traits<float, numext::int64_t> {
36 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
39 struct type_casting_traits<float, numext::uint64_t> {
40 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
45 EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
47 return vcvtq_s64_f64(vcvt_f64_f32(vget_low_f32(a)));
50 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
52 return vcvtq_u64_f64(vcvt_f64_f32(vget_low_f32(a)));
56 EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
58 return vmovl_s32(vget_low_s32(vcvtq_s32_f32(a)));
61 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
63 return vmovl_u32(vget_low_u32(vcvtq_u32_f32(a)));
65 #endif // EIGEN_ARCH_ARM64 68 struct type_casting_traits<float, numext::int32_t> {
69 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
72 EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(
const Packet4f& a) {
73 return vcvtq_s32_f32(a);
76 EIGEN_STRONG_INLINE Packet2i pcast<Packet2f, Packet2i>(
const Packet2f& a) {
77 return vcvt_s32_f32(a);
81 struct type_casting_traits<float, numext::uint32_t> {
82 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
85 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4f, Packet4ui>(
const Packet4f& a) {
86 return vcvtq_u32_f32(a);
89 EIGEN_STRONG_INLINE Packet2ui pcast<Packet2f, Packet2ui>(
const Packet2f& a) {
90 return vcvt_u32_f32(a);
94 struct type_casting_traits<float, numext::int16_t> {
95 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
98 EIGEN_STRONG_INLINE Packet8s pcast<Packet4f, Packet8s>(
const Packet4f& a,
const Packet4f& b) {
99 return vcombine_s16(vmovn_s32(vcvtq_s32_f32(a)), vmovn_s32(vcvtq_s32_f32(b)));
102 EIGEN_STRONG_INLINE Packet4s pcast<Packet2f, Packet4s>(
const Packet2f& a,
const Packet2f& b) {
103 return vmovn_s32(vcombine_s32(vcvt_s32_f32(a), vcvt_s32_f32(b)));
107 struct type_casting_traits<float, numext::uint16_t> {
108 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
111 EIGEN_STRONG_INLINE Packet8us pcast<Packet4f, Packet8us>(
const Packet4f& a,
const Packet4f& b) {
112 return vcombine_u16(vmovn_u32(vcvtq_u32_f32(a)), vmovn_u32(vcvtq_u32_f32(b)));
115 EIGEN_STRONG_INLINE Packet4us pcast<Packet2f, Packet4us>(
const Packet2f& a,
const Packet2f& b) {
116 return vmovn_u32(vcombine_u32(vcvt_u32_f32(a), vcvt_u32_f32(b)));
120 struct type_casting_traits<float, numext::int8_t> {
121 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
124 EIGEN_STRONG_INLINE Packet16c pcast<Packet4f, Packet16c>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
126 const int16x8_t ab_s16 = pcast<Packet4f, Packet8s>(a, b);
127 const int16x8_t cd_s16 = pcast<Packet4f, Packet8s>(c, d);
128 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
131 EIGEN_STRONG_INLINE Packet8c pcast<Packet2f, Packet8c>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
133 const int16x4_t ab_s16 = pcast<Packet2f, Packet4s>(a, b);
134 const int16x4_t cd_s16 = pcast<Packet2f, Packet4s>(c, d);
135 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
139 struct type_casting_traits<float, numext::uint8_t> {
140 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
143 EIGEN_STRONG_INLINE Packet16uc pcast<Packet4f, Packet16uc>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
145 const uint16x8_t ab_u16 = pcast<Packet4f, Packet8us>(a, b);
146 const uint16x8_t cd_u16 = pcast<Packet4f, Packet8us>(c, d);
147 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
150 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2f, Packet8uc>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
152 const uint16x4_t ab_u16 = pcast<Packet2f, Packet4us>(a, b);
153 const uint16x4_t cd_u16 = pcast<Packet2f, Packet4us>(c, d);
154 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
161 struct type_casting_traits<numext::int8_t, float> {
162 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
165 EIGEN_STRONG_INLINE Packet4f pcast<Packet16c, Packet4f>(
const Packet16c& a) {
167 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a)))));
170 EIGEN_STRONG_INLINE Packet2f pcast<Packet8c, Packet2f>(
const Packet8c& a) {
172 return vcvt_f32_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a)))));
176 struct type_casting_traits<numext::int8_t, numext::int64_t> {
177 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
180 EIGEN_STRONG_INLINE Packet2l pcast<Packet16c, Packet2l>(
const Packet16c& a) {
182 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))))));
186 struct type_casting_traits<numext::int8_t, numext::uint64_t> {
187 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
190 EIGEN_STRONG_INLINE Packet2ul pcast<Packet16c, Packet2ul>(
const Packet16c& a) {
191 return vreinterpretq_u64_s64(pcast<Packet16c, Packet2l>(a));
195 struct type_casting_traits<numext::int8_t, numext::int32_t> {
196 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
199 EIGEN_STRONG_INLINE Packet4i pcast<Packet16c, Packet4i>(
const Packet16c& a) {
201 return vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))));
204 EIGEN_STRONG_INLINE Packet2i pcast<Packet8c, Packet2i>(
const Packet8c& a) {
206 return vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a))));
210 struct type_casting_traits<numext::int8_t, numext::uint32_t> {
211 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
214 EIGEN_STRONG_INLINE Packet4ui pcast<Packet16c, Packet4ui>(
const Packet16c& a) {
215 return vreinterpretq_u32_s32(pcast<Packet16c, Packet4i>(a));
218 EIGEN_STRONG_INLINE Packet2ui pcast<Packet8c, Packet2ui>(
const Packet8c& a) {
219 return vreinterpret_u32_s32(pcast<Packet8c, Packet2i>(a));
223 struct type_casting_traits<numext::int8_t, numext::int16_t> {
224 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
227 EIGEN_STRONG_INLINE Packet8s pcast<Packet16c, Packet8s>(
const Packet16c& a) {
229 return vmovl_s8(vget_low_s8(a));
232 EIGEN_STRONG_INLINE Packet4s pcast<Packet8c, Packet4s>(
const Packet8c& a) {
234 return vget_low_s16(vmovl_s8(a));
238 struct type_casting_traits<numext::int8_t, numext::uint16_t> {
239 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
242 EIGEN_STRONG_INLINE Packet8us pcast<Packet16c, Packet8us>(
const Packet16c& a) {
243 return vreinterpretq_u16_s16(pcast<Packet16c, Packet8s>(a));
246 EIGEN_STRONG_INLINE Packet4us pcast<Packet8c, Packet4us>(
const Packet8c& a) {
247 return vreinterpret_u16_s16(pcast<Packet8c, Packet4s>(a));
251 struct type_casting_traits<numext::int8_t, numext::int8_t> {
252 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
255 EIGEN_STRONG_INLINE Packet16c pcast<Packet16c, Packet16c>(
const Packet16c& a) {
259 EIGEN_STRONG_INLINE Packet8c pcast<Packet8c, Packet8c>(
const Packet8c& a) {
263 EIGEN_STRONG_INLINE Packet4c pcast<Packet4c, Packet4c>(
const Packet4c& a) {
268 struct type_casting_traits<numext::int8_t, numext::uint8_t> {
269 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
272 EIGEN_STRONG_INLINE Packet16uc pcast<Packet16c, Packet16uc>(
const Packet16c& a) {
273 return vreinterpretq_u8_s8(a);
276 EIGEN_STRONG_INLINE Packet8uc pcast<Packet8c, Packet8uc>(
const Packet8c& a) {
277 return vreinterpret_u8_s8(a);
280 EIGEN_STRONG_INLINE Packet4uc pcast<Packet4c, Packet4uc>(
const Packet4c& a) {
281 return static_cast<Packet4uc
>(a);
288 struct type_casting_traits<numext::uint8_t, float> {
289 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
292 EIGEN_STRONG_INLINE Packet4f pcast<Packet16uc, Packet4f>(
const Packet16uc& a) {
294 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a)))));
297 EIGEN_STRONG_INLINE Packet2f pcast<Packet8uc, Packet2f>(
const Packet8uc& a) {
299 return vcvt_f32_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a)))));
303 struct type_casting_traits<numext::uint8_t, numext::uint64_t> {
304 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
307 EIGEN_STRONG_INLINE Packet2ul pcast<Packet16uc, Packet2ul>(
const Packet16uc& a) {
309 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))))));
313 struct type_casting_traits<numext::uint8_t, numext::int64_t> {
314 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
317 EIGEN_STRONG_INLINE Packet2l pcast<Packet16uc, Packet2l>(
const Packet16uc& a) {
318 return vreinterpretq_s64_u64(pcast<Packet16uc, Packet2ul>(a));
322 struct type_casting_traits<numext::uint8_t, numext::uint32_t> {
323 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
326 EIGEN_STRONG_INLINE Packet4ui pcast<Packet16uc, Packet4ui>(
const Packet16uc& a) {
328 return vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))));
331 EIGEN_STRONG_INLINE Packet2ui pcast<Packet8uc, Packet2ui>(
const Packet8uc& a) {
333 return vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a))));
337 struct type_casting_traits<numext::uint8_t, numext::int32_t> {
338 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
341 EIGEN_STRONG_INLINE Packet4i pcast<Packet16uc, Packet4i>(
const Packet16uc& a) {
342 return vreinterpretq_s32_u32(pcast<Packet16uc, Packet4ui>(a));
345 EIGEN_STRONG_INLINE Packet2i pcast<Packet8uc, Packet2i>(
const Packet8uc& a) {
346 return vreinterpret_s32_u32(pcast<Packet8uc, Packet2ui>(a));
350 struct type_casting_traits<numext::uint8_t, numext::uint16_t> {
351 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
354 EIGEN_STRONG_INLINE Packet8us pcast<Packet16uc, Packet8us>(
const Packet16uc& a) {
356 return vmovl_u8(vget_low_u8(a));
359 EIGEN_STRONG_INLINE Packet4us pcast<Packet8uc, Packet4us>(
const Packet8uc& a) {
361 return vget_low_u16(vmovl_u8(a));
365 struct type_casting_traits<numext::uint8_t, numext::int16_t> {
366 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
369 EIGEN_STRONG_INLINE Packet8s pcast<Packet16uc, Packet8s>(
const Packet16uc& a) {
370 return vreinterpretq_s16_u16(pcast<Packet16uc, Packet8us>(a));
373 EIGEN_STRONG_INLINE Packet4s pcast<Packet8uc, Packet4s>(
const Packet8uc& a) {
374 return vreinterpret_s16_u16(pcast<Packet8uc, Packet4us>(a));
378 struct type_casting_traits<numext::uint8_t, numext::uint8_t> {
379 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
382 EIGEN_STRONG_INLINE Packet16uc pcast<Packet16uc, Packet16uc>(
const Packet16uc& a) {
386 EIGEN_STRONG_INLINE Packet8uc pcast<Packet8uc, Packet8uc>(
const Packet8uc& a) {
390 EIGEN_STRONG_INLINE Packet4uc pcast<Packet4uc, Packet4uc>(
const Packet4uc& a) {
395 struct type_casting_traits<numext::uint8_t, numext::int8_t> {
396 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
399 EIGEN_STRONG_INLINE Packet16c pcast<Packet16uc, Packet16c>(
const Packet16uc& a) {
400 return vreinterpretq_s8_u8(a);
403 EIGEN_STRONG_INLINE Packet8c pcast<Packet8uc, Packet8c>(
const Packet8uc& a) {
404 return vreinterpret_s8_u8(a);
407 EIGEN_STRONG_INLINE Packet4c pcast<Packet4uc, Packet4c>(
const Packet4uc& a) {
408 return static_cast<Packet4c
>(a);
415 struct type_casting_traits<numext::int16_t, float> {
416 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
419 EIGEN_STRONG_INLINE Packet4f pcast<Packet8s, Packet4f>(
const Packet8s& a) {
421 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(a)));
424 EIGEN_STRONG_INLINE Packet2f pcast<Packet4s, Packet2f>(
const Packet4s& a) {
426 return vcvt_f32_s32(vget_low_s32(vmovl_s16(a)));
430 struct type_casting_traits<numext::int16_t, numext::int64_t> {
431 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
434 EIGEN_STRONG_INLINE Packet2l pcast<Packet8s, Packet2l>(
const Packet8s& a) {
436 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(a))));
440 struct type_casting_traits<numext::int16_t, numext::uint64_t> {
441 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
444 EIGEN_STRONG_INLINE Packet2ul pcast<Packet8s, Packet2ul>(
const Packet8s& a) {
445 return vreinterpretq_u64_s64(pcast<Packet8s, Packet2l>(a));
449 struct type_casting_traits<numext::int16_t, numext::int32_t> {
450 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
453 EIGEN_STRONG_INLINE Packet4i pcast<Packet8s, Packet4i>(
const Packet8s& a) {
455 return vmovl_s16(vget_low_s16(a));
458 EIGEN_STRONG_INLINE Packet2i pcast<Packet4s, Packet2i>(
const Packet4s& a) {
460 return vget_low_s32(vmovl_s16(a));
464 struct type_casting_traits<numext::int16_t, numext::uint32_t> {
465 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
468 EIGEN_STRONG_INLINE Packet4ui pcast<Packet8s, Packet4ui>(
const Packet8s& a) {
469 return vreinterpretq_u32_s32(pcast<Packet8s, Packet4i>(a));
472 EIGEN_STRONG_INLINE Packet2ui pcast<Packet4s, Packet2ui>(
const Packet4s& a) {
473 return vreinterpret_u32_s32(pcast<Packet4s, Packet2i>(a));
477 struct type_casting_traits<numext::int16_t, numext::int16_t> {
478 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
481 EIGEN_STRONG_INLINE Packet8s pcast<Packet8s, Packet8s>(
const Packet8s& a) {
485 EIGEN_STRONG_INLINE Packet4s pcast<Packet4s, Packet4s>(
const Packet4s& a) {
490 struct type_casting_traits<numext::int16_t, numext::uint16_t> {
491 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
494 EIGEN_STRONG_INLINE Packet8us pcast<Packet8s, Packet8us>(
const Packet8s& a) {
495 return vreinterpretq_u16_s16(a);
498 EIGEN_STRONG_INLINE Packet4us pcast<Packet4s, Packet4us>(
const Packet4s& a) {
499 return vreinterpret_u16_s16(a);
503 struct type_casting_traits<numext::int16_t, numext::int8_t> {
504 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
507 EIGEN_STRONG_INLINE Packet16c pcast<Packet8s, Packet16c>(
const Packet8s& a,
const Packet8s& b) {
508 return vcombine_s8(vmovn_s16(a), vmovn_s16(b));
511 EIGEN_STRONG_INLINE Packet8c pcast<Packet4s, Packet8c>(
const Packet4s& a,
const Packet4s& b) {
512 return vmovn_s16(vcombine_s16(a, b));
516 struct type_casting_traits<numext::int16_t, numext::uint8_t> {
517 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
520 EIGEN_STRONG_INLINE Packet16uc pcast<Packet8s, Packet16uc>(
const Packet8s& a,
const Packet8s& b) {
521 return vcombine_u8(vmovn_u16(vreinterpretq_u16_s16(a)), vmovn_u16(vreinterpretq_u16_s16(b)));
524 EIGEN_STRONG_INLINE Packet8uc pcast<Packet4s, Packet8uc>(
const Packet4s& a,
const Packet4s& b) {
525 return vmovn_u16(vcombine_u16(vreinterpret_u16_s16(a), vreinterpret_u16_s16(b)));
532 struct type_casting_traits<numext::uint16_t, float> {
533 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
536 EIGEN_STRONG_INLINE Packet4f pcast<Packet8us, Packet4f>(
const Packet8us& a) {
538 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(a)));
541 EIGEN_STRONG_INLINE Packet2f pcast<Packet4us, Packet2f>(
const Packet4us& a) {
543 return vcvt_f32_u32(vget_low_u32(vmovl_u16(a)));
547 struct type_casting_traits<numext::uint16_t, numext::uint64_t> {
548 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
551 EIGEN_STRONG_INLINE Packet2ul pcast<Packet8us, Packet2ul>(
const Packet8us& a) {
553 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(a))));
557 struct type_casting_traits<numext::uint16_t, numext::int64_t> {
558 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
561 EIGEN_STRONG_INLINE Packet2l pcast<Packet8us, Packet2l>(
const Packet8us& a) {
562 return vreinterpretq_s64_u64(pcast<Packet8us, Packet2ul>(a));
566 struct type_casting_traits<numext::uint16_t, numext::uint32_t> {
567 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
570 EIGEN_STRONG_INLINE Packet4ui pcast<Packet8us, Packet4ui>(
const Packet8us& a) {
572 return vmovl_u16(vget_low_u16(a));
575 EIGEN_STRONG_INLINE Packet2ui pcast<Packet4us, Packet2ui>(
const Packet4us& a) {
577 return vget_low_u32(vmovl_u16(a));
581 struct type_casting_traits<numext::uint16_t, numext::int32_t> {
582 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
585 EIGEN_STRONG_INLINE Packet4i pcast<Packet8us, Packet4i>(
const Packet8us& a) {
586 return vreinterpretq_s32_u32(pcast<Packet8us, Packet4ui>(a));
589 EIGEN_STRONG_INLINE Packet2i pcast<Packet4us, Packet2i>(
const Packet4us& a) {
590 return vreinterpret_s32_u32(pcast<Packet4us, Packet2ui>(a));
594 struct type_casting_traits<numext::uint16_t, numext::uint16_t> {
595 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
598 EIGEN_STRONG_INLINE Packet8us pcast<Packet8us, Packet8us>(
const Packet8us& a) {
602 EIGEN_STRONG_INLINE Packet4us pcast<Packet4us, Packet4us>(
const Packet4us& a) {
607 struct type_casting_traits<numext::uint16_t, numext::int16_t> {
608 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
611 EIGEN_STRONG_INLINE Packet8s pcast<Packet8us, Packet8s>(
const Packet8us& a) {
612 return vreinterpretq_s16_u16(a);
615 EIGEN_STRONG_INLINE Packet4s pcast<Packet4us, Packet4s>(
const Packet4us& a) {
616 return vreinterpret_s16_u16(a);
620 struct type_casting_traits<numext::uint16_t, numext::uint8_t> {
621 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
624 EIGEN_STRONG_INLINE Packet16uc pcast<Packet8us, Packet16uc>(
const Packet8us& a,
const Packet8us& b) {
625 return vcombine_u8(vmovn_u16(a), vmovn_u16(b));
628 EIGEN_STRONG_INLINE Packet8uc pcast<Packet4us, Packet8uc>(
const Packet4us& a,
const Packet4us& b) {
629 return vmovn_u16(vcombine_u16(a, b));
633 struct type_casting_traits<numext::uint16_t, numext::int8_t> {
634 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
637 EIGEN_STRONG_INLINE Packet16c pcast<Packet8us, Packet16c>(
const Packet8us& a,
const Packet8us& b) {
638 return vreinterpretq_s8_u8(pcast<Packet8us, Packet16uc>(a, b));
641 EIGEN_STRONG_INLINE Packet8c pcast<Packet4us, Packet8c>(
const Packet4us& a,
const Packet4us& b) {
642 return vreinterpret_s8_u8(pcast<Packet4us, Packet8uc>(a, b));
649 struct type_casting_traits<numext::int32_t, float> {
650 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
653 EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(
const Packet4i& a) {
654 return vcvtq_f32_s32(a);
657 EIGEN_STRONG_INLINE Packet2f pcast<Packet2i, Packet2f>(
const Packet2i& a) {
658 return vcvt_f32_s32(a);
662 struct type_casting_traits<numext::int32_t, numext::int64_t> {
663 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
666 EIGEN_STRONG_INLINE Packet2l pcast<Packet4i, Packet2l>(
const Packet4i& a) {
668 return vmovl_s32(vget_low_s32(a));
672 struct type_casting_traits<numext::int32_t, numext::uint64_t> {
673 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
676 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4i, Packet2ul>(
const Packet4i& a) {
677 return vreinterpretq_u64_s64(pcast<Packet4i, Packet2l>(a));
681 struct type_casting_traits<numext::int32_t, numext::int32_t> {
682 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
685 EIGEN_STRONG_INLINE Packet4i pcast<Packet4i, Packet4i>(
const Packet4i& a) {
689 EIGEN_STRONG_INLINE Packet2i pcast<Packet2i, Packet2i>(
const Packet2i& a) {
694 struct type_casting_traits<numext::int32_t, numext::uint32_t> {
695 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
698 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4i, Packet4ui>(
const Packet4i& a) {
699 return vreinterpretq_u32_s32(a);
702 EIGEN_STRONG_INLINE Packet2ui pcast<Packet2i, Packet2ui>(
const Packet2i& a) {
703 return vreinterpret_u32_s32(a);
707 struct type_casting_traits<numext::int32_t, numext::int16_t> {
708 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
711 EIGEN_STRONG_INLINE Packet8s pcast<Packet4i, Packet8s>(
const Packet4i& a,
const Packet4i& b) {
712 return vcombine_s16(vmovn_s32(a), vmovn_s32(b));
715 EIGEN_STRONG_INLINE Packet4s pcast<Packet2i, Packet4s>(
const Packet2i& a,
const Packet2i& b) {
716 return vmovn_s32(vcombine_s32(a, b));
720 struct type_casting_traits<numext::int32_t, numext::uint16_t> {
721 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
724 EIGEN_STRONG_INLINE Packet8us pcast<Packet4i, Packet8us>(
const Packet4i& a,
const Packet4i& b) {
725 return vcombine_u16(vmovn_u32(vreinterpretq_u32_s32(a)), vmovn_u32(vreinterpretq_u32_s32(b)));
728 EIGEN_STRONG_INLINE Packet4us pcast<Packet2i, Packet4us>(
const Packet2i& a,
const Packet2i& b) {
729 return vmovn_u32(vreinterpretq_u32_s32(vcombine_s32(a, b)));
733 struct type_casting_traits<numext::int32_t, numext::int8_t> {
734 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
737 EIGEN_STRONG_INLINE Packet16c pcast<Packet4i, Packet16c>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
739 const int16x8_t ab_s16 = pcast<Packet4i, Packet8s>(a, b);
740 const int16x8_t cd_s16 = pcast<Packet4i, Packet8s>(c, d);
741 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
744 EIGEN_STRONG_INLINE Packet8c pcast<Packet2i, Packet8c>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
746 const int16x4_t ab_s16 = vmovn_s32(vcombine_s32(a, b));
747 const int16x4_t cd_s16 = vmovn_s32(vcombine_s32(c, d));
748 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
752 struct type_casting_traits<numext::int32_t, numext::uint8_t> {
753 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
756 EIGEN_STRONG_INLINE Packet16uc pcast<Packet4i, Packet16uc>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
758 const uint16x8_t ab_u16 = pcast<Packet4i, Packet8us>(a, b);
759 const uint16x8_t cd_u16 = pcast<Packet4i, Packet8us>(c, d);
760 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
763 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2i, Packet8uc>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
765 const uint16x4_t ab_u16 = pcast<Packet2i, Packet4us>(a, b);
766 const uint16x4_t cd_u16 = pcast<Packet2i, Packet4us>(c, d);
767 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
774 struct type_casting_traits<numext::uint32_t, float> {
775 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
778 EIGEN_STRONG_INLINE Packet4f pcast<Packet4ui, Packet4f>(
const Packet4ui& a) {
779 return vcvtq_f32_u32(a);
782 EIGEN_STRONG_INLINE Packet2f pcast<Packet2ui, Packet2f>(
const Packet2ui& a) {
783 return vcvt_f32_u32(a);
787 struct type_casting_traits<numext::uint32_t, numext::uint64_t> {
788 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
791 EIGEN_STRONG_INLINE Packet2ul pcast<Packet4ui, Packet2ul>(
const Packet4ui& a) {
793 return vmovl_u32(vget_low_u32(a));
797 struct type_casting_traits<numext::uint32_t, numext::int64_t> {
798 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
801 EIGEN_STRONG_INLINE Packet2l pcast<Packet4ui, Packet2l>(
const Packet4ui& a) {
802 return vreinterpretq_s64_u64(pcast<Packet4ui, Packet2ul>(a));
806 struct type_casting_traits<numext::uint32_t, numext::uint32_t> {
807 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
810 EIGEN_STRONG_INLINE Packet4ui pcast<Packet4ui, Packet4ui>(
const Packet4ui& a) {
814 EIGEN_STRONG_INLINE Packet2ui pcast<Packet2ui, Packet2ui>(
const Packet2ui& a) {
819 struct type_casting_traits<numext::uint32_t, numext::int32_t> {
820 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
823 EIGEN_STRONG_INLINE Packet4i pcast<Packet4ui, Packet4i>(
const Packet4ui& a) {
824 return vreinterpretq_s32_u32(a);
827 EIGEN_STRONG_INLINE Packet2i pcast<Packet2ui, Packet2i>(
const Packet2ui& a) {
828 return vreinterpret_s32_u32(a);
832 struct type_casting_traits<numext::uint32_t, numext::uint16_t> {
833 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
836 EIGEN_STRONG_INLINE Packet8us pcast<Packet4ui, Packet8us>(
const Packet4ui& a,
const Packet4ui& b) {
837 return vcombine_u16(vmovn_u32(a), vmovn_u32(b));
840 EIGEN_STRONG_INLINE Packet4us pcast<Packet2ui, Packet4us>(
const Packet2ui& a,
const Packet2ui& b) {
841 return vmovn_u32(vcombine_u32(a, b));
845 struct type_casting_traits<numext::uint32_t, numext::int16_t> {
846 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
849 EIGEN_STRONG_INLINE Packet8s pcast<Packet4ui, Packet8s>(
const Packet4ui& a,
const Packet4ui& b) {
850 return vreinterpretq_s16_u16(pcast<Packet4ui, Packet8us>(a, b));
853 EIGEN_STRONG_INLINE Packet4s pcast<Packet2ui, Packet4s>(
const Packet2ui& a,
const Packet2ui& b) {
854 return vreinterpret_s16_u16(pcast<Packet2ui, Packet4us>(a, b));
858 struct type_casting_traits<numext::uint32_t, numext::uint8_t> {
859 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
862 EIGEN_STRONG_INLINE Packet16uc pcast<Packet4ui, Packet16uc>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
863 const Packet4ui& d) {
864 const uint16x8_t ab_u16 = vcombine_u16(vmovn_u32(a), vmovn_u32(b));
865 const uint16x8_t cd_u16 = vcombine_u16(vmovn_u32(c), vmovn_u32(d));
866 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
869 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2ui, Packet8uc>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
870 const Packet2ui& d) {
871 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(a, b));
872 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(c, d));
873 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
877 struct type_casting_traits<numext::uint32_t, numext::int8_t> {
878 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
881 EIGEN_STRONG_INLINE Packet16c pcast<Packet4ui, Packet16c>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
882 const Packet4ui& d) {
883 return vreinterpretq_s8_u8(pcast<Packet4ui, Packet16uc>(a, b, c, d));
886 EIGEN_STRONG_INLINE Packet8c pcast<Packet2ui, Packet8c>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
887 const Packet2ui& d) {
888 return vreinterpret_s8_u8(pcast<Packet2ui, Packet8uc>(a, b, c, d));
895 struct type_casting_traits<numext::int64_t, float> {
896 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
899 EIGEN_STRONG_INLINE Packet4f pcast<Packet2l, Packet4f>(
const Packet2l& a,
const Packet2l& b) {
900 return vcvtq_f32_s32(vcombine_s32(vmovn_s64(a), vmovn_s64(b)));
904 struct type_casting_traits<numext::int64_t, numext::int64_t> {
905 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
908 EIGEN_STRONG_INLINE Packet2l pcast<Packet2l, Packet2l>(
const Packet2l& a) {
913 struct type_casting_traits<numext::int64_t, numext::uint64_t> {
914 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
917 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2l, Packet2ul>(
const Packet2l& a) {
918 return vreinterpretq_u64_s64(a);
922 struct type_casting_traits<numext::int64_t, numext::int32_t> {
923 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
926 EIGEN_STRONG_INLINE Packet4i pcast<Packet2l, Packet4i>(
const Packet2l& a,
const Packet2l& b) {
927 return vcombine_s32(vmovn_s64(a), vmovn_s64(b));
931 struct type_casting_traits<numext::int64_t, numext::uint32_t> {
932 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
935 EIGEN_STRONG_INLINE Packet4ui pcast<Packet2l, Packet4ui>(
const Packet2l& a,
const Packet2l& b) {
936 return vcombine_u32(vmovn_u64(vreinterpretq_u64_s64(a)), vmovn_u64(vreinterpretq_u64_s64(b)));
940 struct type_casting_traits<numext::int64_t, numext::int16_t> {
941 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
944 EIGEN_STRONG_INLINE Packet8s pcast<Packet2l, Packet8s>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
946 const int32x4_t ab_s32 = pcast<Packet2l, Packet4i>(a, b);
947 const int32x4_t cd_s32 = pcast<Packet2l, Packet4i>(c, d);
948 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
952 struct type_casting_traits<numext::int64_t, numext::uint16_t> {
953 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
956 EIGEN_STRONG_INLINE Packet8us pcast<Packet2l, Packet8us>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
958 const uint32x4_t ab_u32 = pcast<Packet2l, Packet4ui>(a, b);
959 const uint32x4_t cd_u32 = pcast<Packet2l, Packet4ui>(c, d);
960 return vcombine_u16(vmovn_u32(ab_u32), vmovn_u32(cd_u32));
964 struct type_casting_traits<numext::int64_t, numext::int8_t> {
965 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
968 EIGEN_STRONG_INLINE Packet16c pcast<Packet2l, Packet16c>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
969 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
970 const Packet2l& g,
const Packet2l& h) {
971 const int16x8_t abcd_s16 = pcast<Packet2l, Packet8s>(a, b, c, d);
972 const int16x8_t efgh_s16 = pcast<Packet2l, Packet8s>(e, f, g, h);
973 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
977 struct type_casting_traits<numext::int64_t, numext::uint8_t> {
978 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
981 EIGEN_STRONG_INLINE Packet16uc pcast<Packet2l, Packet16uc>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
982 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
983 const Packet2l& g,
const Packet2l& h) {
984 const uint16x8_t abcd_u16 = pcast<Packet2l, Packet8us>(a, b, c, d);
985 const uint16x8_t efgh_u16 = pcast<Packet2l, Packet8us>(e, f, g, h);
986 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
993 struct type_casting_traits<numext::uint64_t, float> {
994 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
997 EIGEN_STRONG_INLINE Packet4f pcast<Packet2ul, Packet4f>(
const Packet2ul& a,
const Packet2ul& b) {
998 return vcvtq_f32_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1002 struct type_casting_traits<numext::uint64_t, numext::uint64_t> {
1003 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1006 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2ul, Packet2ul>(
const Packet2ul& a) {
1011 struct type_casting_traits<numext::uint64_t, numext::int64_t> {
1012 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1015 EIGEN_STRONG_INLINE Packet2l pcast<Packet2ul, Packet2l>(
const Packet2ul& a) {
1016 return vreinterpretq_s64_u64(a);
1020 struct type_casting_traits<numext::uint64_t, numext::uint32_t> {
1021 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1024 EIGEN_STRONG_INLINE Packet4ui pcast<Packet2ul, Packet4ui>(
const Packet2ul& a,
const Packet2ul& b) {
1025 return vcombine_u32(vmovn_u64(a), vmovn_u64(b));
1029 struct type_casting_traits<numext::uint64_t, numext::int32_t> {
1030 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1033 EIGEN_STRONG_INLINE Packet4i pcast<Packet2ul, Packet4i>(
const Packet2ul& a,
const Packet2ul& b) {
1034 return vreinterpretq_s32_u32(pcast<Packet2ul, Packet4ui>(a, b));
1038 struct type_casting_traits<numext::uint64_t, numext::uint16_t> {
1039 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1042 EIGEN_STRONG_INLINE Packet8us pcast<Packet2ul, Packet8us>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1043 const Packet2ul& d) {
1044 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1045 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(vmovn_u64(c), vmovn_u64(d)));
1046 return vcombine_u16(ab_u16, cd_u16);
1050 struct type_casting_traits<numext::uint64_t, numext::int16_t> {
1051 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1054 EIGEN_STRONG_INLINE Packet8s pcast<Packet2ul, Packet8s>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1055 const Packet2ul& d) {
1056 return vreinterpretq_s16_u16(pcast<Packet2ul, Packet8us>(a, b, c, d));
1060 struct type_casting_traits<numext::uint64_t, numext::uint8_t> {
1061 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1064 EIGEN_STRONG_INLINE Packet16uc pcast<Packet2ul, Packet16uc>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1065 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1066 const Packet2ul& g,
const Packet2ul& h) {
1067 const uint16x8_t abcd_u16 = pcast<Packet2ul, Packet8us>(a, b, c, d);
1068 const uint16x8_t efgh_u16 = pcast<Packet2ul, Packet8us>(e, f, g, h);
1069 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1073 struct type_casting_traits<numext::uint64_t, numext::int8_t> {
1074 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1077 EIGEN_STRONG_INLINE Packet16c pcast<Packet2ul, Packet16c>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1078 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1079 const Packet2ul& g,
const Packet2ul& h) {
1080 return vreinterpretq_s8_u8(pcast<Packet2ul, Packet16uc>(a, b, c, d, e, f, g, h));
1087 EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2i>(
const Packet2i& a) {
1088 return vreinterpret_f32_s32(a);
1091 EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2ui>(
const Packet2ui& a) {
1092 return vreinterpret_f32_u32(a);
1095 EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4i>(
const Packet4i& a) {
1096 return vreinterpretq_f32_s32(a);
1099 EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4ui>(
const Packet4ui& a) {
1100 return vreinterpretq_f32_u32(a);
1104 EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet4uc>(
const Packet4uc& a) {
1105 return static_cast<Packet4c
>(a);
1108 EIGEN_STRONG_INLINE Packet8c preinterpret<Packet8c, Packet8uc>(
const Packet8uc& a) {
1109 return vreinterpret_s8_u8(a);
1112 EIGEN_STRONG_INLINE Packet16c preinterpret<Packet16c, Packet16uc>(
const Packet16uc& a) {
1113 return vreinterpretq_s8_u8(a);
1117 EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet4c>(
const Packet4c& a) {
1118 return static_cast<Packet4uc
>(a);
1121 EIGEN_STRONG_INLINE Packet8uc preinterpret<Packet8uc, Packet8c>(
const Packet8c& a) {
1122 return vreinterpret_u8_s8(a);
1125 EIGEN_STRONG_INLINE Packet16uc preinterpret<Packet16uc, Packet16c>(
const Packet16c& a) {
1126 return vreinterpretq_u8_s8(a);
1130 EIGEN_STRONG_INLINE Packet4s preinterpret<Packet4s, Packet4us>(
const Packet4us& a) {
1131 return vreinterpret_s16_u16(a);
1134 EIGEN_STRONG_INLINE Packet8s preinterpret<Packet8s, Packet8us>(
const Packet8us& a) {
1135 return vreinterpretq_s16_u16(a);
1139 EIGEN_STRONG_INLINE Packet4us preinterpret<Packet4us, Packet4s>(
const Packet4s& a) {
1140 return vreinterpret_u16_s16(a);
1143 EIGEN_STRONG_INLINE Packet8us preinterpret<Packet8us, Packet8s>(
const Packet8s& a) {
1144 return vreinterpretq_u16_s16(a);
1148 EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2f>(
const Packet2f& a) {
1149 return vreinterpret_s32_f32(a);
1152 EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2ui>(
const Packet2ui& a) {
1153 return vreinterpret_s32_u32(a);
1156 EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4f>(
const Packet4f& a) {
1157 return vreinterpretq_s32_f32(a);
1160 EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4ui>(
const Packet4ui& a) {
1161 return vreinterpretq_s32_u32(a);
1165 EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2f>(
const Packet2f& a) {
1166 return vreinterpret_u32_f32(a);
1169 EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2i>(
const Packet2i& a) {
1170 return vreinterpret_u32_s32(a);
1173 EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4f>(
const Packet4f& a) {
1174 return vreinterpretq_u32_f32(a);
1177 EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4i>(
const Packet4i& a) {
1178 return vreinterpretq_u32_s32(a);
1182 EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2ul>(
const Packet2ul& a) {
1183 return vreinterpretq_s64_u64(a);
1186 EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2l>(
const Packet2l& a) {
1187 return vreinterpretq_u64_s64(a);
1190 #if EIGEN_ARCH_ARM64 1197 struct type_casting_traits<double, double> {
1198 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1201 EIGEN_STRONG_INLINE Packet2d pcast<Packet2d, Packet2d>(
const Packet2d& a) {
1206 struct type_casting_traits<double, float> {
1207 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1210 EIGEN_STRONG_INLINE Packet4f pcast<Packet2d, Packet4f>(
const Packet2d& a,
const Packet2d& b) {
1211 return vcombine_f32(vcvt_f32_f64(a), vcvt_f32_f64(b));
1215 struct type_casting_traits<double, numext::int64_t> {
1216 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1219 EIGEN_STRONG_INLINE Packet2l pcast<Packet2d, Packet2l>(
const Packet2d& a) {
1220 return vcvtq_s64_f64(a);
1224 struct type_casting_traits<double, numext::uint64_t> {
1225 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1228 EIGEN_STRONG_INLINE Packet2ul pcast<Packet2d, Packet2ul>(
const Packet2d& a) {
1229 return vcvtq_u64_f64(a);
1233 struct type_casting_traits<double, numext::int32_t> {
1234 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1237 EIGEN_STRONG_INLINE Packet4i pcast<Packet2d, Packet4i>(
const Packet2d& a,
const Packet2d& b) {
1238 return vcombine_s32(vmovn_s64(vcvtq_s64_f64(a)), vmovn_s64(vcvtq_s64_f64(b)));
1242 struct type_casting_traits<double, numext::uint32_t> {
1243 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1246 EIGEN_STRONG_INLINE Packet4ui pcast<Packet2d, Packet4ui>(
const Packet2d& a,
const Packet2d& b) {
1247 return vcombine_u32(vmovn_u64(vcvtq_u64_f64(a)), vmovn_u64(vcvtq_u64_f64(b)));
1251 struct type_casting_traits<double, numext::int16_t> {
1252 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1255 EIGEN_STRONG_INLINE Packet8s pcast<Packet2d, Packet8s>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1256 const Packet2d& d) {
1257 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1258 const int32x4_t cd_s32 = pcast<Packet2d, Packet4i>(c, d);
1259 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
1263 struct type_casting_traits<double, numext::uint16_t> {
1264 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1267 EIGEN_STRONG_INLINE Packet8us pcast<Packet2d, Packet8us>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1268 const Packet2d& d) {
1269 const uint32x4_t ab_u32 = pcast<Packet2d, Packet4ui>(a, b);
1270 const uint32x4_t cd_u32 = pcast<Packet2d, Packet4ui>(c, d);
1271 return vcombine_u16(vmovn_u32(ab_u32), vmovn_u32(cd_u32));
1275 struct type_casting_traits<double, numext::int8_t> {
1276 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1279 EIGEN_STRONG_INLINE Packet16c pcast<Packet2d, Packet16c>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1280 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1281 const Packet2d& g,
const Packet2d& h) {
1282 const int16x8_t abcd_s16 = pcast<Packet2d, Packet8s>(a, b, c, d);
1283 const int16x8_t efgh_s16 = pcast<Packet2d, Packet8s>(e, f, g, h);
1284 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
1288 struct type_casting_traits<double, numext::uint8_t> {
1289 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1292 EIGEN_STRONG_INLINE Packet16uc pcast<Packet2d, Packet16uc>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1293 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1294 const Packet2d& g,
const Packet2d& h) {
1295 const uint16x8_t abcd_u16 = pcast<Packet2d, Packet8us>(a, b, c, d);
1296 const uint16x8_t efgh_u16 = pcast<Packet2d, Packet8us>(e, f, g, h);
1297 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1301 struct type_casting_traits<float, double> {
1302 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1305 EIGEN_STRONG_INLINE Packet2d pcast<Packet4f, Packet2d>(
const Packet4f& a) {
1307 return vcvt_f64_f32(vget_low_f32(a));
1311 struct type_casting_traits<numext::int8_t, double> {
1312 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1315 EIGEN_STRONG_INLINE Packet2d pcast<Packet16c, Packet2d>(
const Packet16c& a) {
1317 return vcvt_f64_f32(pcast<Packet8c, Packet2f>(vget_low_s8(a)));
1321 struct type_casting_traits<numext::uint8_t, double> {
1322 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1325 EIGEN_STRONG_INLINE Packet2d pcast<Packet16uc, Packet2d>(
const Packet16uc& a) {
1327 return vcvt_f64_f32(pcast<Packet8uc, Packet2f>(vget_low_u8(a)));
1331 struct type_casting_traits<numext::int16_t, double> {
1332 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1335 EIGEN_STRONG_INLINE Packet2d pcast<Packet8s, Packet2d>(
const Packet8s& a) {
1337 return vcvt_f64_f32(pcast<Packet4s, Packet2f>(vget_low_s16(a)));
1341 struct type_casting_traits<numext::uint16_t, double> {
1342 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1345 EIGEN_STRONG_INLINE Packet2d pcast<Packet8us, Packet2d>(
const Packet8us& a) {
1347 return vcvt_f64_f32(pcast<Packet4us, Packet2f>(vget_low_u16(a)));
1351 struct type_casting_traits<numext::int32_t, double> {
1352 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1355 EIGEN_STRONG_INLINE Packet2d pcast<Packet4i, Packet2d>(
const Packet4i& a) {
1357 return vcvtq_f64_s64(vmovl_s32(vget_low_s32(a)));
1361 struct type_casting_traits<numext::uint32_t, double> {
1362 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1365 EIGEN_STRONG_INLINE Packet2d pcast<Packet4ui, Packet2d>(
const Packet4ui& a) {
1367 return vcvtq_f64_u64(vmovl_u32(vget_low_u32(a)));
1371 struct type_casting_traits<numext::int64_t, double> {
1372 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1375 EIGEN_STRONG_INLINE Packet2d pcast<Packet2l, Packet2d>(
const Packet2l& a) {
1376 return vcvtq_f64_s64(a);
1380 struct type_casting_traits<numext::uint64_t, double> {
1381 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1384 EIGEN_STRONG_INLINE Packet2d pcast<Packet2ul, Packet2d>(
const Packet2ul& a) {
1385 return vcvtq_f64_u64(a);
1389 EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2l>(
const Packet2l& a) {
1390 return vreinterpretq_f64_s64(a);
1393 EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2ul>(
const Packet2ul& a) {
1394 return vreinterpretq_f64_u64(a);
1397 EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2d>(
const Packet2d& a) {
1398 return vreinterpretq_s64_f64(a);
1401 EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2d>(
const Packet2d& a) {
1402 return vreinterpretq_u64_f64(a);
1405 EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4i>(
const Packet4i& a) {
1406 return vreinterpretq_f64_s32(a);
1409 EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet2d>(
const Packet2d& a) {
1410 return vreinterpretq_s32_f64(a);
1413 #endif // EIGEN_ARCH_ARM64 1419 #endif // EIGEN_TYPE_CASTING_NEON_H Namespace containing all symbols from the Eigen library.
Definition: Core:141
Definition: Eigen_Colamd.h:50