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