11#ifndef EIGEN_TYPE_CASTING_NEON_H
12#define EIGEN_TYPE_CASTING_NEON_H
22EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2i>(
const Packet2i& a) {
23 return Packet2f(vreinterpret_f32_s32(a));
26EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2ui>(
const Packet2ui& a) {
27 return Packet2f(vreinterpret_f32_u32(a));
30EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4i>(
const Packet4i& a) {
31 return Packet4f(vreinterpretq_f32_s32(a));
34EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4ui>(
const Packet4ui& a) {
35 return Packet4f(vreinterpretq_f32_u32(a));
39EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet4uc>(
const Packet4uc& a) {
40 return static_cast<Packet4c
>(a);
43EIGEN_STRONG_INLINE Packet8c preinterpret<Packet8c, Packet8uc>(
const Packet8uc& a) {
44 return Packet8c(vreinterpret_s8_u8(a));
47EIGEN_STRONG_INLINE Packet16c preinterpret<Packet16c, Packet16uc>(
const Packet16uc& a) {
48 return Packet16c(vreinterpretq_s8_u8(a));
52EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet4c>(
const Packet4c& a) {
53 return static_cast<Packet4uc
>(a);
56EIGEN_STRONG_INLINE Packet8uc preinterpret<Packet8uc, Packet8c>(
const Packet8c& a) {
57 return Packet8uc(vreinterpret_u8_s8(a));
60EIGEN_STRONG_INLINE Packet16uc preinterpret<Packet16uc, Packet16c>(
const Packet16c& a) {
61 return Packet16uc(vreinterpretq_u8_s8(a));
65EIGEN_STRONG_INLINE Packet4s preinterpret<Packet4s, Packet4us>(
const Packet4us& a) {
66 return Packet4s(vreinterpret_s16_u16(a));
69EIGEN_STRONG_INLINE Packet8s preinterpret<Packet8s, Packet8us>(
const Packet8us& a) {
70 return Packet8s(vreinterpretq_s16_u16(a));
74EIGEN_STRONG_INLINE Packet4us preinterpret<Packet4us, Packet4s>(
const Packet4s& a) {
75 return Packet4us(vreinterpret_u16_s16(a));
78EIGEN_STRONG_INLINE Packet8us preinterpret<Packet8us, Packet8s>(
const Packet8s& a) {
79 return Packet8us(vreinterpretq_u16_s16(a));
83EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2f>(
const Packet2f& a) {
84 return Packet2i(vreinterpret_s32_f32(a));
87EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2ui>(
const Packet2ui& a) {
88 return Packet2i(vreinterpret_s32_u32(a));
91EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4f>(
const Packet4f& a) {
92 return Packet4i(vreinterpretq_s32_f32(a));
95EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4ui>(
const Packet4ui& a) {
96 return Packet4i(vreinterpretq_s32_u32(a));
100EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2f>(
const Packet2f& a) {
101 return Packet2ui(vreinterpret_u32_f32(a));
104EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2i>(
const Packet2i& a) {
105 return Packet2ui(vreinterpret_u32_s32(a));
108EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4f>(
const Packet4f& a) {
109 return Packet4ui(vreinterpretq_u32_f32(a));
112EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4i>(
const Packet4i& a) {
113 return Packet4ui(vreinterpretq_u32_s32(a));
117EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2ul>(
const Packet2ul& a) {
118 return Packet2l(vreinterpretq_s64_u64(a));
121EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2l>(
const Packet2l& a) {
122 return Packet2ul(vreinterpretq_u64_s64(a));
129struct type_casting_traits<float, float> {
130 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
133EIGEN_STRONG_INLINE Packet4f pcast<Packet4f, Packet4f>(
const Packet4f& a) {
137EIGEN_STRONG_INLINE Packet2f pcast<Packet2f, Packet2f>(
const Packet2f& a) {
142struct type_casting_traits<float, numext::int64_t> {
143 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
146struct type_casting_traits<float, numext::uint64_t> {
147 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
152EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
154 return vcvtq_s64_f64(vcvt_f64_f32(vget_low_f32(a)));
157EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
159 return vcvtq_u64_f64(vcvt_f64_f32(vget_low_f32(a)));
163EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
165 return vmovl_s32(vget_low_s32(vcvtq_s32_f32(a)));
168EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
170 return vmovl_u32(vget_low_u32(vcvtq_u32_f32(a)));
175struct type_casting_traits<float, numext::int32_t> {
176 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
179EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(
const Packet4f& a) {
180 return vcvtq_s32_f32(a);
183EIGEN_STRONG_INLINE Packet2i pcast<Packet2f, Packet2i>(
const Packet2f& a) {
184 return vcvt_s32_f32(a);
188struct type_casting_traits<float, numext::uint32_t> {
189 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
192EIGEN_STRONG_INLINE Packet4ui pcast<Packet4f, Packet4ui>(
const Packet4f& a) {
193 return vcvtq_u32_f32(a);
196EIGEN_STRONG_INLINE Packet2ui pcast<Packet2f, Packet2ui>(
const Packet2f& a) {
197 return vcvt_u32_f32(a);
201struct type_casting_traits<float, numext::int16_t> {
202 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
205EIGEN_STRONG_INLINE Packet8s pcast<Packet4f, Packet8s>(
const Packet4f& a,
const Packet4f& b) {
206 return vcombine_s16(vmovn_s32(vcvtq_s32_f32(a)), vmovn_s32(vcvtq_s32_f32(b)));
209EIGEN_STRONG_INLINE Packet4s pcast<Packet2f, Packet4s>(
const Packet2f& a,
const Packet2f& b) {
210 return vmovn_s32(vcombine_s32(vcvt_s32_f32(a), vcvt_s32_f32(b)));
214struct type_casting_traits<float, numext::uint16_t> {
215 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
218EIGEN_STRONG_INLINE Packet8us pcast<Packet4f, Packet8us>(
const Packet4f& a,
const Packet4f& b) {
219 return vcombine_u16(vmovn_u32(vcvtq_u32_f32(a)), vmovn_u32(vcvtq_u32_f32(b)));
222EIGEN_STRONG_INLINE Packet4us pcast<Packet2f, Packet4us>(
const Packet2f& a,
const Packet2f& b) {
223 return vmovn_u32(vcombine_u32(vcvt_u32_f32(a), vcvt_u32_f32(b)));
227struct type_casting_traits<float, numext::int8_t> {
228 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
231EIGEN_STRONG_INLINE Packet16c pcast<Packet4f, Packet16c>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
233 const int16x8_t ab_s16 = pcast<Packet4f, Packet8s>(a, b);
234 const int16x8_t cd_s16 = pcast<Packet4f, Packet8s>(c, d);
235 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
238EIGEN_STRONG_INLINE Packet8c pcast<Packet2f, Packet8c>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
240 const int16x4_t ab_s16 = pcast<Packet2f, Packet4s>(a, b);
241 const int16x4_t cd_s16 = pcast<Packet2f, Packet4s>(c, d);
242 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
246struct type_casting_traits<float, numext::uint8_t> {
247 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
250EIGEN_STRONG_INLINE Packet16uc pcast<Packet4f, Packet16uc>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
252 const uint16x8_t ab_u16 = pcast<Packet4f, Packet8us>(a, b);
253 const uint16x8_t cd_u16 = pcast<Packet4f, Packet8us>(c, d);
254 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
257EIGEN_STRONG_INLINE Packet8uc pcast<Packet2f, Packet8uc>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
259 const uint16x4_t ab_u16 = pcast<Packet2f, Packet4us>(a, b);
260 const uint16x4_t cd_u16 = pcast<Packet2f, Packet4us>(c, d);
261 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
268struct type_casting_traits<numext::int8_t, float> {
269 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
272EIGEN_STRONG_INLINE Packet4f pcast<Packet16c, Packet4f>(
const Packet16c& a) {
274 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a)))));
277EIGEN_STRONG_INLINE Packet2f pcast<Packet8c, Packet2f>(
const Packet8c& a) {
279 return vcvt_f32_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a)))));
283struct type_casting_traits<numext::int8_t, numext::int64_t> {
284 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
287EIGEN_STRONG_INLINE Packet2l pcast<Packet16c, Packet2l>(
const Packet16c& a) {
289 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))))));
293struct type_casting_traits<numext::int8_t, numext::uint64_t> {
294 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
297EIGEN_STRONG_INLINE Packet2ul pcast<Packet16c, Packet2ul>(
const Packet16c& a) {
298 return preinterpret<Packet2ul>(pcast<Packet16c, Packet2l>(a));
302struct type_casting_traits<numext::int8_t, numext::int32_t> {
303 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
306EIGEN_STRONG_INLINE Packet4i pcast<Packet16c, Packet4i>(
const Packet16c& a) {
308 return vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))));
311EIGEN_STRONG_INLINE Packet2i pcast<Packet8c, Packet2i>(
const Packet8c& a) {
313 return vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a))));
317struct type_casting_traits<numext::int8_t, numext::uint32_t> {
318 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
321EIGEN_STRONG_INLINE Packet4ui pcast<Packet16c, Packet4ui>(
const Packet16c& a) {
322 return preinterpret<Packet4ui>(pcast<Packet16c, Packet4i>(a));
325EIGEN_STRONG_INLINE Packet2ui pcast<Packet8c, Packet2ui>(
const Packet8c& a) {
326 return preinterpret<Packet2ui>(pcast<Packet8c, Packet2i>(a));
330struct type_casting_traits<numext::int8_t, numext::int16_t> {
331 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
334EIGEN_STRONG_INLINE Packet8s pcast<Packet16c, Packet8s>(
const Packet16c& a) {
336 return vmovl_s8(vget_low_s8(a));
339EIGEN_STRONG_INLINE Packet4s pcast<Packet8c, Packet4s>(
const Packet8c& a) {
341 return vget_low_s16(vmovl_s8(a));
345struct type_casting_traits<numext::int8_t, numext::uint16_t> {
346 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
349EIGEN_STRONG_INLINE Packet8us pcast<Packet16c, Packet8us>(
const Packet16c& a) {
350 return preinterpret<Packet8us>(pcast<Packet16c, Packet8s>(a));
353EIGEN_STRONG_INLINE Packet4us pcast<Packet8c, Packet4us>(
const Packet8c& a) {
354 return preinterpret<Packet4us>(pcast<Packet8c, Packet4s>(a));
358struct type_casting_traits<numext::int8_t, numext::int8_t> {
359 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
362EIGEN_STRONG_INLINE Packet16c pcast<Packet16c, Packet16c>(
const Packet16c& a) {
366EIGEN_STRONG_INLINE Packet8c pcast<Packet8c, Packet8c>(
const Packet8c& a) {
370EIGEN_STRONG_INLINE Packet4c pcast<Packet4c, Packet4c>(
const Packet4c& a) {
375struct type_casting_traits<numext::int8_t, numext::uint8_t> {
376 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
379EIGEN_STRONG_INLINE Packet16uc pcast<Packet16c, Packet16uc>(
const Packet16c& a) {
380 return preinterpret<Packet16uc>(a);
383EIGEN_STRONG_INLINE Packet8uc pcast<Packet8c, Packet8uc>(
const Packet8c& a) {
384 return preinterpret<Packet8uc>(a);
387EIGEN_STRONG_INLINE Packet4uc pcast<Packet4c, Packet4uc>(
const Packet4c& a) {
388 return static_cast<Packet4uc
>(a);
395struct type_casting_traits<numext::uint8_t, float> {
396 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
399EIGEN_STRONG_INLINE Packet4f pcast<Packet16uc, Packet4f>(
const Packet16uc& a) {
401 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a)))));
404EIGEN_STRONG_INLINE Packet2f pcast<Packet8uc, Packet2f>(
const Packet8uc& a) {
406 return vcvt_f32_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a)))));
410struct type_casting_traits<numext::uint8_t, numext::uint64_t> {
411 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
414EIGEN_STRONG_INLINE Packet2ul pcast<Packet16uc, Packet2ul>(
const Packet16uc& a) {
416 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))))));
420struct type_casting_traits<numext::uint8_t, numext::int64_t> {
421 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
424EIGEN_STRONG_INLINE Packet2l pcast<Packet16uc, Packet2l>(
const Packet16uc& a) {
425 return preinterpret<Packet2l>(pcast<Packet16uc, Packet2ul>(a));
429struct type_casting_traits<numext::uint8_t, numext::uint32_t> {
430 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
433EIGEN_STRONG_INLINE Packet4ui pcast<Packet16uc, Packet4ui>(
const Packet16uc& a) {
435 return vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))));
438EIGEN_STRONG_INLINE Packet2ui pcast<Packet8uc, Packet2ui>(
const Packet8uc& a) {
440 return vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a))));
444struct type_casting_traits<numext::uint8_t, numext::int32_t> {
445 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
448EIGEN_STRONG_INLINE Packet4i pcast<Packet16uc, Packet4i>(
const Packet16uc& a) {
449 return preinterpret<Packet4i>(pcast<Packet16uc, Packet4ui>(a));
452EIGEN_STRONG_INLINE Packet2i pcast<Packet8uc, Packet2i>(
const Packet8uc& a) {
453 return preinterpret<Packet2i>(pcast<Packet8uc, Packet2ui>(a));
457struct type_casting_traits<numext::uint8_t, numext::uint16_t> {
458 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
461EIGEN_STRONG_INLINE Packet8us pcast<Packet16uc, Packet8us>(
const Packet16uc& a) {
463 return vmovl_u8(vget_low_u8(a));
466EIGEN_STRONG_INLINE Packet4us pcast<Packet8uc, Packet4us>(
const Packet8uc& a) {
468 return vget_low_u16(vmovl_u8(a));
472struct type_casting_traits<numext::uint8_t, numext::int16_t> {
473 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
476EIGEN_STRONG_INLINE Packet8s pcast<Packet16uc, Packet8s>(
const Packet16uc& a) {
477 return preinterpret<Packet8s>(pcast<Packet16uc, Packet8us>(a));
480EIGEN_STRONG_INLINE Packet4s pcast<Packet8uc, Packet4s>(
const Packet8uc& a) {
481 return preinterpret<Packet4s>(pcast<Packet8uc, Packet4us>(a));
485struct type_casting_traits<numext::uint8_t, numext::uint8_t> {
486 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
489EIGEN_STRONG_INLINE Packet16uc pcast<Packet16uc, Packet16uc>(
const Packet16uc& a) {
493EIGEN_STRONG_INLINE Packet8uc pcast<Packet8uc, Packet8uc>(
const Packet8uc& a) {
497EIGEN_STRONG_INLINE Packet4uc pcast<Packet4uc, Packet4uc>(
const Packet4uc& a) {
502struct type_casting_traits<numext::uint8_t, numext::int8_t> {
503 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
506EIGEN_STRONG_INLINE Packet16c pcast<Packet16uc, Packet16c>(
const Packet16uc& a) {
507 return preinterpret<Packet16c>(a);
510EIGEN_STRONG_INLINE Packet8c pcast<Packet8uc, Packet8c>(
const Packet8uc& a) {
511 return preinterpret<Packet8c>(a);
514EIGEN_STRONG_INLINE Packet4c pcast<Packet4uc, Packet4c>(
const Packet4uc& a) {
515 return static_cast<Packet4c
>(a);
522struct type_casting_traits<numext::int16_t, float> {
523 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
526EIGEN_STRONG_INLINE Packet4f pcast<Packet8s, Packet4f>(
const Packet8s& a) {
528 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(a)));
531EIGEN_STRONG_INLINE Packet2f pcast<Packet4s, Packet2f>(
const Packet4s& a) {
533 return vcvt_f32_s32(vget_low_s32(vmovl_s16(a)));
537struct type_casting_traits<numext::int16_t, numext::int64_t> {
538 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
541EIGEN_STRONG_INLINE Packet2l pcast<Packet8s, Packet2l>(
const Packet8s& a) {
543 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(a))));
547struct type_casting_traits<numext::int16_t, numext::uint64_t> {
548 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
551EIGEN_STRONG_INLINE Packet2ul pcast<Packet8s, Packet2ul>(
const Packet8s& a) {
552 return preinterpret<Packet2ul>(pcast<Packet8s, Packet2l>(a));
556struct type_casting_traits<numext::int16_t, numext::int32_t> {
557 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
560EIGEN_STRONG_INLINE Packet4i pcast<Packet8s, Packet4i>(
const Packet8s& a) {
562 return vmovl_s16(vget_low_s16(a));
565EIGEN_STRONG_INLINE Packet2i pcast<Packet4s, Packet2i>(
const Packet4s& a) {
567 return vget_low_s32(vmovl_s16(a));
571struct type_casting_traits<numext::int16_t, numext::uint32_t> {
572 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
575EIGEN_STRONG_INLINE Packet4ui pcast<Packet8s, Packet4ui>(
const Packet8s& a) {
576 return preinterpret<Packet4ui>(pcast<Packet8s, Packet4i>(a));
579EIGEN_STRONG_INLINE Packet2ui pcast<Packet4s, Packet2ui>(
const Packet4s& a) {
580 return preinterpret<Packet2ui>(pcast<Packet4s, Packet2i>(a));
584struct type_casting_traits<numext::int16_t, numext::int16_t> {
585 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
588EIGEN_STRONG_INLINE Packet8s pcast<Packet8s, Packet8s>(
const Packet8s& a) {
592EIGEN_STRONG_INLINE Packet4s pcast<Packet4s, Packet4s>(
const Packet4s& a) {
597struct type_casting_traits<numext::int16_t, numext::uint16_t> {
598 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
601EIGEN_STRONG_INLINE Packet8us pcast<Packet8s, Packet8us>(
const Packet8s& a) {
602 return preinterpret<Packet8us>(a);
605EIGEN_STRONG_INLINE Packet4us pcast<Packet4s, Packet4us>(
const Packet4s& a) {
606 return preinterpret<Packet4us>(a);
610struct type_casting_traits<numext::int16_t, numext::int8_t> {
611 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
614EIGEN_STRONG_INLINE Packet16c pcast<Packet8s, Packet16c>(
const Packet8s& a,
const Packet8s& b) {
615 return vcombine_s8(vmovn_s16(a), vmovn_s16(b));
618EIGEN_STRONG_INLINE Packet8c pcast<Packet4s, Packet8c>(
const Packet4s& a,
const Packet4s& b) {
619 return vmovn_s16(vcombine_s16(a, b));
623struct type_casting_traits<numext::int16_t, numext::uint8_t> {
624 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
627EIGEN_STRONG_INLINE Packet16uc pcast<Packet8s, Packet16uc>(
const Packet8s& a,
const Packet8s& b) {
628 return vcombine_u8(vmovn_u16(vreinterpretq_u16_s16(a)), vmovn_u16(vreinterpretq_u16_s16(b)));
631EIGEN_STRONG_INLINE Packet8uc pcast<Packet4s, Packet8uc>(
const Packet4s& a,
const Packet4s& b) {
632 return vmovn_u16(vcombine_u16(vreinterpret_u16_s16(a), vreinterpret_u16_s16(b)));
639struct type_casting_traits<numext::uint16_t, float> {
640 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
643EIGEN_STRONG_INLINE Packet4f pcast<Packet8us, Packet4f>(
const Packet8us& a) {
645 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(a)));
648EIGEN_STRONG_INLINE Packet2f pcast<Packet4us, Packet2f>(
const Packet4us& a) {
650 return vcvt_f32_u32(vget_low_u32(vmovl_u16(a)));
654struct type_casting_traits<numext::uint16_t, numext::uint64_t> {
655 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
658EIGEN_STRONG_INLINE Packet2ul pcast<Packet8us, Packet2ul>(
const Packet8us& a) {
660 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(a))));
664struct type_casting_traits<numext::uint16_t, numext::int64_t> {
665 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
668EIGEN_STRONG_INLINE Packet2l pcast<Packet8us, Packet2l>(
const Packet8us& a) {
669 return preinterpret<Packet2l>(pcast<Packet8us, Packet2ul>(a));
673struct type_casting_traits<numext::uint16_t, numext::uint32_t> {
674 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
677EIGEN_STRONG_INLINE Packet4ui pcast<Packet8us, Packet4ui>(
const Packet8us& a) {
679 return vmovl_u16(vget_low_u16(a));
682EIGEN_STRONG_INLINE Packet2ui pcast<Packet4us, Packet2ui>(
const Packet4us& a) {
684 return vget_low_u32(vmovl_u16(a));
688struct type_casting_traits<numext::uint16_t, numext::int32_t> {
689 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
692EIGEN_STRONG_INLINE Packet4i pcast<Packet8us, Packet4i>(
const Packet8us& a) {
693 return preinterpret<Packet4i>(pcast<Packet8us, Packet4ui>(a));
696EIGEN_STRONG_INLINE Packet2i pcast<Packet4us, Packet2i>(
const Packet4us& a) {
697 return preinterpret<Packet2i>(pcast<Packet4us, Packet2ui>(a));
701struct type_casting_traits<numext::uint16_t, numext::uint16_t> {
702 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
705EIGEN_STRONG_INLINE Packet8us pcast<Packet8us, Packet8us>(
const Packet8us& a) {
709EIGEN_STRONG_INLINE Packet4us pcast<Packet4us, Packet4us>(
const Packet4us& a) {
714struct type_casting_traits<numext::uint16_t, numext::int16_t> {
715 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
718EIGEN_STRONG_INLINE Packet8s pcast<Packet8us, Packet8s>(
const Packet8us& a) {
719 return preinterpret<Packet8s>(a);
722EIGEN_STRONG_INLINE Packet4s pcast<Packet4us, Packet4s>(
const Packet4us& a) {
723 return preinterpret<Packet4s>(a);
727struct type_casting_traits<numext::uint16_t, numext::uint8_t> {
728 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
731EIGEN_STRONG_INLINE Packet16uc pcast<Packet8us, Packet16uc>(
const Packet8us& a,
const Packet8us& b) {
732 return vcombine_u8(vmovn_u16(a), vmovn_u16(b));
735EIGEN_STRONG_INLINE Packet8uc pcast<Packet4us, Packet8uc>(
const Packet4us& a,
const Packet4us& b) {
736 return vmovn_u16(vcombine_u16(a, b));
740struct type_casting_traits<numext::uint16_t, numext::int8_t> {
741 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
744EIGEN_STRONG_INLINE Packet16c pcast<Packet8us, Packet16c>(
const Packet8us& a,
const Packet8us& b) {
745 return preinterpret<Packet16c>(pcast<Packet8us, Packet16uc>(a, b));
748EIGEN_STRONG_INLINE Packet8c pcast<Packet4us, Packet8c>(
const Packet4us& a,
const Packet4us& b) {
749 return preinterpret<Packet8c>(pcast<Packet4us, Packet8uc>(a, b));
756struct type_casting_traits<numext::int32_t, float> {
757 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
760EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(
const Packet4i& a) {
761 return vcvtq_f32_s32(a);
764EIGEN_STRONG_INLINE Packet2f pcast<Packet2i, Packet2f>(
const Packet2i& a) {
765 return vcvt_f32_s32(a);
769struct type_casting_traits<numext::int32_t, numext::int64_t> {
770 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
773EIGEN_STRONG_INLINE Packet2l pcast<Packet4i, Packet2l>(
const Packet4i& a) {
775 return vmovl_s32(vget_low_s32(a));
779struct type_casting_traits<numext::int32_t, numext::uint64_t> {
780 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
783EIGEN_STRONG_INLINE Packet2ul pcast<Packet4i, Packet2ul>(
const Packet4i& a) {
784 return preinterpret<Packet2ul>(pcast<Packet4i, Packet2l>(a));
788struct type_casting_traits<numext::int32_t, numext::int32_t> {
789 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
792EIGEN_STRONG_INLINE Packet4i pcast<Packet4i, Packet4i>(
const Packet4i& a) {
796EIGEN_STRONG_INLINE Packet2i pcast<Packet2i, Packet2i>(
const Packet2i& a) {
801struct type_casting_traits<numext::int32_t, numext::uint32_t> {
802 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
805EIGEN_STRONG_INLINE Packet4ui pcast<Packet4i, Packet4ui>(
const Packet4i& a) {
806 return preinterpret<Packet4ui>(a);
809EIGEN_STRONG_INLINE Packet2ui pcast<Packet2i, Packet2ui>(
const Packet2i& a) {
810 return preinterpret<Packet2ui>(a);
814struct type_casting_traits<numext::int32_t, numext::int16_t> {
815 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
818EIGEN_STRONG_INLINE Packet8s pcast<Packet4i, Packet8s>(
const Packet4i& a,
const Packet4i& b) {
819 return vcombine_s16(vmovn_s32(a), vmovn_s32(b));
822EIGEN_STRONG_INLINE Packet4s pcast<Packet2i, Packet4s>(
const Packet2i& a,
const Packet2i& b) {
823 return vmovn_s32(vcombine_s32(a, b));
827struct type_casting_traits<numext::int32_t, numext::uint16_t> {
828 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
831EIGEN_STRONG_INLINE Packet8us pcast<Packet4i, Packet8us>(
const Packet4i& a,
const Packet4i& b) {
832 return vcombine_u16(vmovn_u32(vreinterpretq_u32_s32(a)), vmovn_u32(vreinterpretq_u32_s32(b)));
835EIGEN_STRONG_INLINE Packet4us pcast<Packet2i, Packet4us>(
const Packet2i& a,
const Packet2i& b) {
836 return vmovn_u32(vreinterpretq_u32_s32(vcombine_s32(a, b)));
840struct type_casting_traits<numext::int32_t, numext::int8_t> {
841 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
844EIGEN_STRONG_INLINE Packet16c pcast<Packet4i, Packet16c>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
846 const int16x8_t ab_s16 = pcast<Packet4i, Packet8s>(a, b);
847 const int16x8_t cd_s16 = pcast<Packet4i, Packet8s>(c, d);
848 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
851EIGEN_STRONG_INLINE Packet8c pcast<Packet2i, Packet8c>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
853 const int16x4_t ab_s16 = vmovn_s32(vcombine_s32(a, b));
854 const int16x4_t cd_s16 = vmovn_s32(vcombine_s32(c, d));
855 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
859struct type_casting_traits<numext::int32_t, numext::uint8_t> {
860 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
863EIGEN_STRONG_INLINE Packet16uc pcast<Packet4i, Packet16uc>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
865 const uint16x8_t ab_u16 = pcast<Packet4i, Packet8us>(a, b);
866 const uint16x8_t cd_u16 = pcast<Packet4i, Packet8us>(c, d);
867 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
870EIGEN_STRONG_INLINE Packet8uc pcast<Packet2i, Packet8uc>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
872 const uint16x4_t ab_u16 = pcast<Packet2i, Packet4us>(a, b);
873 const uint16x4_t cd_u16 = pcast<Packet2i, Packet4us>(c, d);
874 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
881struct type_casting_traits<numext::uint32_t, float> {
882 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
885EIGEN_STRONG_INLINE Packet4f pcast<Packet4ui, Packet4f>(
const Packet4ui& a) {
886 return vcvtq_f32_u32(a);
889EIGEN_STRONG_INLINE Packet2f pcast<Packet2ui, Packet2f>(
const Packet2ui& a) {
890 return vcvt_f32_u32(a);
894struct type_casting_traits<numext::uint32_t, numext::uint64_t> {
895 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
898EIGEN_STRONG_INLINE Packet2ul pcast<Packet4ui, Packet2ul>(
const Packet4ui& a) {
900 return vmovl_u32(vget_low_u32(a));
904struct type_casting_traits<numext::uint32_t, numext::int64_t> {
905 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
908EIGEN_STRONG_INLINE Packet2l pcast<Packet4ui, Packet2l>(
const Packet4ui& a) {
909 return preinterpret<Packet2l>(pcast<Packet4ui, Packet2ul>(a));
913struct type_casting_traits<numext::uint32_t, numext::uint32_t> {
914 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
917EIGEN_STRONG_INLINE Packet4ui pcast<Packet4ui, Packet4ui>(
const Packet4ui& a) {
921EIGEN_STRONG_INLINE Packet2ui pcast<Packet2ui, Packet2ui>(
const Packet2ui& a) {
926struct type_casting_traits<numext::uint32_t, numext::int32_t> {
927 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
930EIGEN_STRONG_INLINE Packet4i pcast<Packet4ui, Packet4i>(
const Packet4ui& a) {
931 return preinterpret<Packet4i>(a);
934EIGEN_STRONG_INLINE Packet2i pcast<Packet2ui, Packet2i>(
const Packet2ui& a) {
935 return preinterpret<Packet2i>(a);
939struct type_casting_traits<numext::uint32_t, numext::uint16_t> {
940 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
943EIGEN_STRONG_INLINE Packet8us pcast<Packet4ui, Packet8us>(
const Packet4ui& a,
const Packet4ui& b) {
944 return vcombine_u16(vmovn_u32(a), vmovn_u32(b));
947EIGEN_STRONG_INLINE Packet4us pcast<Packet2ui, Packet4us>(
const Packet2ui& a,
const Packet2ui& b) {
948 return vmovn_u32(vcombine_u32(a, b));
952struct type_casting_traits<numext::uint32_t, numext::int16_t> {
953 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
956EIGEN_STRONG_INLINE Packet8s pcast<Packet4ui, Packet8s>(
const Packet4ui& a,
const Packet4ui& b) {
957 return preinterpret<Packet8s>(pcast<Packet4ui, Packet8us>(a, b));
960EIGEN_STRONG_INLINE Packet4s pcast<Packet2ui, Packet4s>(
const Packet2ui& a,
const Packet2ui& b) {
961 return preinterpret<Packet4s>(pcast<Packet2ui, Packet4us>(a, b));
965struct type_casting_traits<numext::uint32_t, numext::uint8_t> {
966 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
969EIGEN_STRONG_INLINE Packet16uc pcast<Packet4ui, Packet16uc>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
970 const Packet4ui& d) {
971 const uint16x8_t ab_u16 = vcombine_u16(vmovn_u32(a), vmovn_u32(b));
972 const uint16x8_t cd_u16 = vcombine_u16(vmovn_u32(c), vmovn_u32(d));
973 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
976EIGEN_STRONG_INLINE Packet8uc pcast<Packet2ui, Packet8uc>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
977 const Packet2ui& d) {
978 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(a, b));
979 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(c, d));
980 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
984struct type_casting_traits<numext::uint32_t, numext::int8_t> {
985 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
988EIGEN_STRONG_INLINE Packet16c pcast<Packet4ui, Packet16c>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
989 const Packet4ui& d) {
990 return preinterpret<Packet16c>(pcast<Packet4ui, Packet16uc>(a, b, c, d));
993EIGEN_STRONG_INLINE Packet8c pcast<Packet2ui, Packet8c>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
994 const Packet2ui& d) {
995 return preinterpret<Packet8c>(pcast<Packet2ui, Packet8uc>(a, b, c, d));
1002struct type_casting_traits<numext::int64_t, float> {
1003 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1006EIGEN_STRONG_INLINE Packet4f pcast<Packet2l, Packet4f>(
const Packet2l& a,
const Packet2l& b) {
1007 return vcvtq_f32_s32(vcombine_s32(vmovn_s64(a), vmovn_s64(b)));
1011struct type_casting_traits<numext::int64_t, numext::int64_t> {
1012 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1015EIGEN_STRONG_INLINE Packet2l pcast<Packet2l, Packet2l>(
const Packet2l& a) {
1020struct type_casting_traits<numext::int64_t, numext::uint64_t> {
1021 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1024EIGEN_STRONG_INLINE Packet2ul pcast<Packet2l, Packet2ul>(
const Packet2l& a) {
1025 return preinterpret<Packet2ul>(a);
1029struct type_casting_traits<numext::int64_t, numext::int32_t> {
1030 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1033EIGEN_STRONG_INLINE Packet4i pcast<Packet2l, Packet4i>(
const Packet2l& a,
const Packet2l& b) {
1034 return vcombine_s32(vmovn_s64(a), vmovn_s64(b));
1038struct type_casting_traits<numext::int64_t, numext::uint32_t> {
1039 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1042EIGEN_STRONG_INLINE Packet4ui pcast<Packet2l, Packet4ui>(
const Packet2l& a,
const Packet2l& b) {
1043 return vcombine_u32(vmovn_u64(vreinterpretq_u64_s64(a)), vmovn_u64(vreinterpretq_u64_s64(b)));
1047struct type_casting_traits<numext::int64_t, numext::int16_t> {
1048 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1051EIGEN_STRONG_INLINE Packet8s pcast<Packet2l, Packet8s>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1052 const Packet2l& d) {
1053 const int32x4_t ab_s32 = pcast<Packet2l, Packet4i>(a, b);
1054 const int32x4_t cd_s32 = pcast<Packet2l, Packet4i>(c, d);
1055 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
1059struct type_casting_traits<numext::int64_t, numext::uint16_t> {
1060 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1063EIGEN_STRONG_INLINE Packet8us pcast<Packet2l, Packet8us>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1064 const Packet2l& d) {
1065 const uint32x4_t ab_u32 = pcast<Packet2l, Packet4ui>(a, b);
1066 const uint32x4_t cd_u32 = pcast<Packet2l, Packet4ui>(c, d);
1067 return vcombine_u16(vmovn_u32(ab_u32), vmovn_u32(cd_u32));
1071struct type_casting_traits<numext::int64_t, numext::int8_t> {
1072 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1075EIGEN_STRONG_INLINE Packet16c pcast<Packet2l, Packet16c>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1076 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
1077 const Packet2l& g,
const Packet2l& h) {
1078 const int16x8_t abcd_s16 = pcast<Packet2l, Packet8s>(a, b, c, d);
1079 const int16x8_t efgh_s16 = pcast<Packet2l, Packet8s>(e, f, g, h);
1080 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
1084struct type_casting_traits<numext::int64_t, numext::uint8_t> {
1085 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1088EIGEN_STRONG_INLINE Packet16uc pcast<Packet2l, Packet16uc>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1089 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
1090 const Packet2l& g,
const Packet2l& h) {
1091 const uint16x8_t abcd_u16 = pcast<Packet2l, Packet8us>(a, b, c, d);
1092 const uint16x8_t efgh_u16 = pcast<Packet2l, Packet8us>(e, f, g, h);
1093 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1100struct type_casting_traits<numext::uint64_t, float> {
1101 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1104EIGEN_STRONG_INLINE Packet4f pcast<Packet2ul, Packet4f>(
const Packet2ul& a,
const Packet2ul& b) {
1105 return vcvtq_f32_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1109struct type_casting_traits<numext::uint64_t, numext::uint64_t> {
1110 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1113EIGEN_STRONG_INLINE Packet2ul pcast<Packet2ul, Packet2ul>(
const Packet2ul& a) {
1118struct type_casting_traits<numext::uint64_t, numext::int64_t> {
1119 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1122EIGEN_STRONG_INLINE Packet2l pcast<Packet2ul, Packet2l>(
const Packet2ul& a) {
1123 return preinterpret<Packet2l>(a);
1127struct type_casting_traits<numext::uint64_t, numext::uint32_t> {
1128 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1131EIGEN_STRONG_INLINE Packet4ui pcast<Packet2ul, Packet4ui>(
const Packet2ul& a,
const Packet2ul& b) {
1132 return vcombine_u32(vmovn_u64(a), vmovn_u64(b));
1136struct type_casting_traits<numext::uint64_t, numext::int32_t> {
1137 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1140EIGEN_STRONG_INLINE Packet4i pcast<Packet2ul, Packet4i>(
const Packet2ul& a,
const Packet2ul& b) {
1141 return preinterpret<Packet4i>(pcast<Packet2ul, Packet4ui>(a, b));
1145struct type_casting_traits<numext::uint64_t, numext::uint16_t> {
1146 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1149EIGEN_STRONG_INLINE Packet8us pcast<Packet2ul, Packet8us>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1150 const Packet2ul& d) {
1151 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1152 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(vmovn_u64(c), vmovn_u64(d)));
1153 return vcombine_u16(ab_u16, cd_u16);
1157struct type_casting_traits<numext::uint64_t, numext::int16_t> {
1158 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1161EIGEN_STRONG_INLINE Packet8s pcast<Packet2ul, Packet8s>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1162 const Packet2ul& d) {
1163 return preinterpret<Packet8s>(pcast<Packet2ul, Packet8us>(a, b, c, d));
1167struct type_casting_traits<numext::uint64_t, numext::uint8_t> {
1168 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1171EIGEN_STRONG_INLINE Packet16uc pcast<Packet2ul, Packet16uc>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1172 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1173 const Packet2ul& g,
const Packet2ul& h) {
1174 const uint16x8_t abcd_u16 = pcast<Packet2ul, Packet8us>(a, b, c, d);
1175 const uint16x8_t efgh_u16 = pcast<Packet2ul, Packet8us>(e, f, g, h);
1176 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1180struct type_casting_traits<numext::uint64_t, numext::int8_t> {
1181 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1184EIGEN_STRONG_INLINE Packet16c pcast<Packet2ul, Packet16c>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1185 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1186 const Packet2ul& g,
const Packet2ul& h) {
1187 return preinterpret<Packet16c>(pcast<Packet2ul, Packet16uc>(a, b, c, d, e, f, g, h));
1197EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2l>(
const Packet2l& a) {
1198 return Packet2d(vreinterpretq_f64_s64(a));
1201EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2ul>(
const Packet2ul& a) {
1202 return Packet2d(vreinterpretq_f64_u64(a));
1205EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2d>(
const Packet2d& a) {
1206 return Packet2l(vreinterpretq_s64_f64(a));
1209EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2d>(
const Packet2d& a) {
1210 return Packet2ul(vreinterpretq_u64_f64(a));
1213EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4i>(
const Packet4i& a) {
1214 return Packet2d(vreinterpretq_f64_s32(a));
1217EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet2d>(
const Packet2d& a) {
1218 return Packet4i(vreinterpretq_s32_f64(a));
1222struct type_casting_traits<double, double> {
1223 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1226EIGEN_STRONG_INLINE Packet2d pcast<Packet2d, Packet2d>(
const Packet2d& a) {
1231struct type_casting_traits<double, float> {
1232 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1235EIGEN_STRONG_INLINE Packet4f pcast<Packet2d, Packet4f>(
const Packet2d& a,
const Packet2d& b) {
1236 return vcombine_f32(vcvt_f32_f64(a), vcvt_f32_f64(b));
1240struct type_casting_traits<double, numext::int64_t> {
1241 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1244EIGEN_STRONG_INLINE Packet2l pcast<Packet2d, Packet2l>(
const Packet2d& a) {
1245 return vcvtq_s64_f64(a);
1249struct type_casting_traits<double, numext::uint64_t> {
1250 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1253EIGEN_STRONG_INLINE Packet2ul pcast<Packet2d, Packet2ul>(
const Packet2d& a) {
1254 return vcvtq_u64_f64(a);
1258struct type_casting_traits<double, numext::int32_t> {
1259 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1262EIGEN_STRONG_INLINE Packet4i pcast<Packet2d, Packet4i>(
const Packet2d& a,
const Packet2d& b) {
1263 return vcombine_s32(vmovn_s64(vcvtq_s64_f64(a)), vmovn_s64(vcvtq_s64_f64(b)));
1267struct type_casting_traits<double, numext::uint32_t> {
1268 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1271EIGEN_STRONG_INLINE Packet4ui pcast<Packet2d, Packet4ui>(
const Packet2d& a,
const Packet2d& b) {
1272 return vcombine_u32(vmovn_u64(vcvtq_u64_f64(a)), vmovn_u64(vcvtq_u64_f64(b)));
1276struct type_casting_traits<double, numext::int16_t> {
1277 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1280EIGEN_STRONG_INLINE Packet8s pcast<Packet2d, Packet8s>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1281 const Packet2d& d) {
1282 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1283 const int32x4_t cd_s32 = pcast<Packet2d, Packet4i>(c, d);
1284 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
1288struct type_casting_traits<double, numext::uint16_t> {
1289 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1292EIGEN_STRONG_INLINE Packet8us pcast<Packet2d, Packet8us>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1293 const Packet2d& d) {
1294 const uint32x4_t ab_u32 = pcast<Packet2d, Packet4ui>(a, b);
1295 const uint32x4_t cd_u32 = pcast<Packet2d, Packet4ui>(c, d);
1296 return vcombine_u16(vmovn_u32(ab_u32), vmovn_u32(cd_u32));
1300struct type_casting_traits<double, numext::int8_t> {
1301 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1304EIGEN_STRONG_INLINE Packet16c pcast<Packet2d, Packet16c>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1305 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1306 const Packet2d& g,
const Packet2d& h) {
1307 const int16x8_t abcd_s16 = pcast<Packet2d, Packet8s>(a, b, c, d);
1308 const int16x8_t efgh_s16 = pcast<Packet2d, Packet8s>(e, f, g, h);
1309 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
1313struct type_casting_traits<double, numext::uint8_t> {
1314 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1317EIGEN_STRONG_INLINE Packet16uc pcast<Packet2d, Packet16uc>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1318 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1319 const Packet2d& g,
const Packet2d& h) {
1320 const uint16x8_t abcd_u16 = pcast<Packet2d, Packet8us>(a, b, c, d);
1321 const uint16x8_t efgh_u16 = pcast<Packet2d, Packet8us>(e, f, g, h);
1322 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1326struct type_casting_traits<float, double> {
1327 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1330EIGEN_STRONG_INLINE Packet2d pcast<Packet4f, Packet2d>(
const Packet4f& a) {
1332 return vcvt_f64_f32(vget_low_f32(a));
1336struct type_casting_traits<numext::int8_t, double> {
1337 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1340EIGEN_STRONG_INLINE Packet2d pcast<Packet16c, Packet2d>(
const Packet16c& a) {
1343 Packet2f tmp = pcast<Packet8c, Packet2f>(vget_low_s8(a));
1344 return vcvt_f64_f32(tmp);
1348struct type_casting_traits<numext::uint8_t, double> {
1349 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1352EIGEN_STRONG_INLINE Packet2d pcast<Packet16uc, Packet2d>(
const Packet16uc& a) {
1354 Packet2f tmp = pcast<Packet8uc, Packet2f>(vget_low_u8(a));
1355 return vcvt_f64_f32(tmp);
1359struct type_casting_traits<numext::int16_t, double> {
1360 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1363EIGEN_STRONG_INLINE Packet2d pcast<Packet8s, Packet2d>(
const Packet8s& a) {
1365 Packet2f tmp = pcast<Packet4s, Packet2f>(vget_low_s16(a));
1366 return vcvt_f64_f32(tmp);
1370struct type_casting_traits<numext::uint16_t, double> {
1371 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1374EIGEN_STRONG_INLINE Packet2d pcast<Packet8us, Packet2d>(
const Packet8us& a) {
1376 Packet2f tmp = pcast<Packet4us, Packet2f>(vget_low_u16(a));
1377 return vcvt_f64_f32(tmp);
1381struct type_casting_traits<numext::int32_t, double> {
1382 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1385EIGEN_STRONG_INLINE Packet2d pcast<Packet4i, Packet2d>(
const Packet4i& a) {
1387 return vcvtq_f64_s64(vmovl_s32(vget_low_s32(a)));
1391struct type_casting_traits<numext::uint32_t, double> {
1392 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1395EIGEN_STRONG_INLINE Packet2d pcast<Packet4ui, Packet2d>(
const Packet4ui& a) {
1397 return vcvtq_f64_u64(vmovl_u32(vget_low_u32(a)));
1401struct type_casting_traits<numext::int64_t, double> {
1402 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1405EIGEN_STRONG_INLINE Packet2d pcast<Packet2l, Packet2d>(
const Packet2l& a) {
1406 return vcvtq_f64_s64(a);
1410struct type_casting_traits<numext::uint64_t, double> {
1411 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1414EIGEN_STRONG_INLINE Packet2d pcast<Packet2ul, Packet2d>(
const Packet2ul& a) {
1415 return vcvtq_f64_u64(a);
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1