12#ifndef EIGEN_TYPE_CASTING_NEON_H
13#define EIGEN_TYPE_CASTING_NEON_H
16#include "../../InternalHeaderCheck.h"
27EIGEN_STRONG_INLINE Packet8c preinterpret<Packet8c, Packet16c>(
const Packet16c& a) {
28 return Packet8c(vget_low_s8(a));
31EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet8c>(
const Packet8c& a) {
32 return Packet4c(vget_lane_s32(vreinterpret_s32_s8(a), 0));
35EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet16c>(
const Packet16c& a) {
36 return preinterpret<Packet4c>(preinterpret<Packet8c>(a));
40EIGEN_STRONG_INLINE Packet8uc preinterpret<Packet8uc, Packet16uc>(
const Packet16uc& a) {
41 return Packet8uc(vget_low_u8(a));
44EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet8uc>(
const Packet8uc& a) {
45 return Packet4uc(vget_lane_u32(vreinterpret_u32_u8(a), 0));
48EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet16uc>(
const Packet16uc& a) {
49 return preinterpret<Packet4uc>(preinterpret<Packet8uc>(a));
53EIGEN_STRONG_INLINE Packet4s preinterpret<Packet4s, Packet8s>(
const Packet8s& a) {
54 return Packet4s(vget_low_s16(a));
58EIGEN_STRONG_INLINE Packet4us preinterpret<Packet4us, Packet8us>(
const Packet8us& a) {
59 return Packet4us(vget_low_u16(a));
63EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet4i>(
const Packet4i& a) {
64 return Packet2i(vget_low_s32(a));
67EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet4ui>(
const Packet4ui& a) {
68 return Packet2ui(vget_low_u32(a));
72EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet4f>(
const Packet4f& a) {
73 return Packet2f(vget_low_f32(a));
80EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2i>(
const Packet2i& a) {
81 return Packet2f(vreinterpret_f32_s32(a));
84EIGEN_STRONG_INLINE Packet2f preinterpret<Packet2f, Packet2ui>(
const Packet2ui& a) {
85 return Packet2f(vreinterpret_f32_u32(a));
88EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4i>(
const Packet4i& a) {
89 return Packet4f(vreinterpretq_f32_s32(a));
92EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4ui>(
const Packet4ui& a) {
93 return Packet4f(vreinterpretq_f32_u32(a));
97EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet4uc>(
const Packet4uc& a) {
98 return static_cast<Packet4c
>(a);
101EIGEN_STRONG_INLINE Packet8c preinterpret<Packet8c, Packet8uc>(
const Packet8uc& a) {
102 return Packet8c(vreinterpret_s8_u8(a));
105EIGEN_STRONG_INLINE Packet16c preinterpret<Packet16c, Packet16uc>(
const Packet16uc& a) {
106 return Packet16c(vreinterpretq_s8_u8(a));
110EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet4c>(
const Packet4c& a) {
111 return static_cast<Packet4uc
>(a);
114EIGEN_STRONG_INLINE Packet8uc preinterpret<Packet8uc, Packet8c>(
const Packet8c& a) {
115 return Packet8uc(vreinterpret_u8_s8(a));
118EIGEN_STRONG_INLINE Packet16uc preinterpret<Packet16uc, Packet16c>(
const Packet16c& a) {
119 return Packet16uc(vreinterpretq_u8_s8(a));
123EIGEN_STRONG_INLINE Packet4s preinterpret<Packet4s, Packet4us>(
const Packet4us& a) {
124 return Packet4s(vreinterpret_s16_u16(a));
127EIGEN_STRONG_INLINE Packet8s preinterpret<Packet8s, Packet8us>(
const Packet8us& a) {
128 return Packet8s(vreinterpretq_s16_u16(a));
131EIGEN_STRONG_INLINE Packet4us preinterpret<Packet4us, Packet4s>(
const Packet4s& a) {
132 return Packet4us(vreinterpret_u16_s16(a));
135EIGEN_STRONG_INLINE Packet8us preinterpret<Packet8us, Packet8s>(
const Packet8s& a) {
136 return Packet8us(vreinterpretq_u16_s16(a));
140EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2f>(
const Packet2f& a) {
141 return Packet2i(vreinterpret_s32_f32(a));
144EIGEN_STRONG_INLINE Packet2i preinterpret<Packet2i, Packet2ui>(
const Packet2ui& a) {
145 return Packet2i(vreinterpret_s32_u32(a));
148EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4f>(
const Packet4f& a) {
149 return Packet4i(vreinterpretq_s32_f32(a));
152EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4ui>(
const Packet4ui& a) {
153 return Packet4i(vreinterpretq_s32_u32(a));
157EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2f>(
const Packet2f& a) {
158 return Packet2ui(vreinterpret_u32_f32(a));
161EIGEN_STRONG_INLINE Packet2ui preinterpret<Packet2ui, Packet2i>(
const Packet2i& a) {
162 return Packet2ui(vreinterpret_u32_s32(a));
165EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4f>(
const Packet4f& a) {
166 return Packet4ui(vreinterpretq_u32_f32(a));
169EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4i>(
const Packet4i& a) {
170 return Packet4ui(vreinterpretq_u32_s32(a));
174EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2ul>(
const Packet2ul& a) {
175 return Packet2l(vreinterpretq_s64_u64(a));
178EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2l>(
const Packet2l& a) {
179 return Packet2ul(vreinterpretq_u64_s64(a));
182#if EIGEN_ARCH_ARM64 && EIGEN_HAS_ARM64_FP16
184EIGEN_STRONG_INLINE Packet4hf preinterpret<Packet4hf, Packet4s>(
const Packet4s& a) {
185 return Packet4hf(vreinterpret_f16_s16(a));
188EIGEN_STRONG_INLINE Packet4hf preinterpret<Packet4hf, Packet4us>(
const Packet4us& a) {
189 return Packet4hf(vreinterpret_f16_u16(a));
192EIGEN_STRONG_INLINE Packet8hf preinterpret<Packet8hf, Packet8s>(
const Packet8s& a) {
193 return Packet8hf(vreinterpretq_f16_s16(a));
196EIGEN_STRONG_INLINE Packet8hf preinterpret<Packet8hf, Packet8us>(
const Packet8us& a) {
197 return Packet8hf(vreinterpretq_f16_u16(a));
201EIGEN_STRONG_INLINE Packet4s preinterpret<Packet4s, Packet4hf>(
const Packet4hf& a) {
202 return Packet4s(vreinterpret_s16_f16(a));
205EIGEN_STRONG_INLINE Packet8s preinterpret<Packet8s, Packet8hf>(
const Packet8hf& a) {
206 return Packet8s(vreinterpretq_s16_f16(a));
209EIGEN_STRONG_INLINE Packet4us preinterpret<Packet4us, Packet4hf>(
const Packet4hf& a) {
210 return Packet4us(vreinterpret_u16_f16(a));
213EIGEN_STRONG_INLINE Packet8us preinterpret<Packet8us, Packet8hf>(
const Packet8hf& a) {
214 return Packet8us(vreinterpretq_u16_f16(a));
223struct type_casting_traits<float, numext::int64_t> {
224 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
227struct type_casting_traits<float, numext::uint64_t> {
228 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
233EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
235 return vcvtq_s64_f64(vcvt_f64_f32(vget_low_f32(a)));
238EIGEN_STRONG_INLINE Packet2l pcast<Packet2f, Packet2l>(
const Packet2f& a) {
239 return vcvtq_s64_f64(vcvt_f64_f32(a));
242EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
244 return vcvtq_u64_f64(vcvt_f64_f32(vget_low_f32(a)));
247EIGEN_STRONG_INLINE Packet2ul pcast<Packet2f, Packet2ul>(
const Packet2f& a) {
248 return vcvtq_u64_f64(vcvt_f64_f32(a));
252EIGEN_STRONG_INLINE Packet2l pcast<Packet4f, Packet2l>(
const Packet4f& a) {
254 return vmovl_s32(vget_low_s32(vcvtq_s32_f32(a)));
257EIGEN_STRONG_INLINE Packet2l pcast<Packet2f, Packet2l>(
const Packet2f& a) {
258 return vmovl_s32(vcvt_s32_f32(a));
261EIGEN_STRONG_INLINE Packet2ul pcast<Packet4f, Packet2ul>(
const Packet4f& a) {
263 return vmovl_u32(vget_low_u32(vcvtq_u32_f32(a)));
266EIGEN_STRONG_INLINE Packet2ul pcast<Packet2f, Packet2ul>(
const Packet2f& a) {
267 return vmovl_u32(vcvt_u32_f32(a));
271#if EIGEN_ARCH_ARM64 && EIGEN_HAS_ARM64_FP16
273struct type_casting_traits<float, half> {
274 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
278EIGEN_STRONG_INLINE Packet8hf pcast<Packet4f, Packet8hf>(
const Packet4f& a,
const Packet4f& b) {
279 return vcombine_f16(vcvt_f16_f32(a), vcvt_f16_f32(b));
283EIGEN_STRONG_INLINE Packet4hf pcast<Packet4f, Packet4hf>(
const Packet4f& a) {
284 return vcvt_f16_f32(a);
288EIGEN_STRONG_INLINE Packet4hf pcast<Packet2f, Packet4hf>(
const Packet2f& a,
const Packet2f& b) {
289 return vcvt_f16_f32(vcombine_f32(a, b));
294struct type_casting_traits<float, numext::int32_t> {
295 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
298EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(
const Packet4f& a) {
299 return vcvtq_s32_f32(a);
302EIGEN_STRONG_INLINE Packet2i pcast<Packet2f, Packet2i>(
const Packet2f& a) {
303 return vcvt_s32_f32(a);
307struct type_casting_traits<float, numext::uint32_t> {
308 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
311EIGEN_STRONG_INLINE Packet4ui pcast<Packet4f, Packet4ui>(
const Packet4f& a) {
312 return vcvtq_u32_f32(a);
315EIGEN_STRONG_INLINE Packet2ui pcast<Packet2f, Packet2ui>(
const Packet2f& a) {
316 return vcvt_u32_f32(a);
320struct type_casting_traits<float, numext::int16_t> {
321 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
324EIGEN_STRONG_INLINE Packet8s pcast<Packet4f, Packet8s>(
const Packet4f& a,
const Packet4f& b) {
325 return vcombine_s16(vmovn_s32(vcvtq_s32_f32(a)), vmovn_s32(vcvtq_s32_f32(b)));
328EIGEN_STRONG_INLINE Packet4s pcast<Packet4f, Packet4s>(
const Packet4f& a) {
329 return vmovn_s32(vcvtq_s32_f32(a));
332EIGEN_STRONG_INLINE Packet4s pcast<Packet2f, Packet4s>(
const Packet2f& a,
const Packet2f& b) {
333 return vmovn_s32(vcombine_s32(vcvt_s32_f32(a), vcvt_s32_f32(b)));
337struct type_casting_traits<float, numext::uint16_t> {
338 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
341EIGEN_STRONG_INLINE Packet8us pcast<Packet4f, Packet8us>(
const Packet4f& a,
const Packet4f& b) {
342 return vcombine_u16(vmovn_u32(vcvtq_u32_f32(a)), vmovn_u32(vcvtq_u32_f32(b)));
345EIGEN_STRONG_INLINE Packet4us pcast<Packet4f, Packet4us>(
const Packet4f& a) {
346 return vmovn_u32(vcvtq_u32_f32(a));
349EIGEN_STRONG_INLINE Packet4us pcast<Packet2f, Packet4us>(
const Packet2f& a,
const Packet2f& b) {
350 return vmovn_u32(vcombine_u32(vcvt_u32_f32(a), vcvt_u32_f32(b)));
354struct type_casting_traits<float, numext::int8_t> {
355 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
358EIGEN_STRONG_INLINE Packet16c pcast<Packet4f, Packet16c>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
360 const int16x8_t ab_s16 = pcast<Packet4f, Packet8s>(a, b);
361 const int16x8_t cd_s16 = pcast<Packet4f, Packet8s>(c, d);
362 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
365EIGEN_STRONG_INLINE Packet8c pcast<Packet4f, Packet8c>(
const Packet4f& a,
const Packet4f& b) {
366 const int16x8_t ab_s16 = pcast<Packet4f, Packet8s>(a, b);
367 return vmovn_s16(ab_s16);
370EIGEN_STRONG_INLINE Packet8c pcast<Packet2f, Packet8c>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
372 const int16x4_t ab_s16 = pcast<Packet2f, Packet4s>(a, b);
373 const int16x4_t cd_s16 = pcast<Packet2f, Packet4s>(c, d);
374 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
377EIGEN_STRONG_INLINE Packet4c pcast<Packet4f, Packet4c>(
const Packet4f& a) {
378 const int32x4_t a_s32x4 = vcvtq_s32_f32(a);
379 const int16x4_t a_s16x4 = vmovn_s32(a_s32x4);
380 const int16x8_t aa_s16x8 = vcombine_s16(a_s16x4, a_s16x4);
381 const int8x8_t aa_s8x8 = vmovn_s16(aa_s16x8);
382 return vget_lane_s32(vreinterpret_s32_s8(aa_s8x8), 0);
386struct type_casting_traits<float, numext::uint8_t> {
387 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
390EIGEN_STRONG_INLINE Packet16uc pcast<Packet4f, Packet16uc>(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c,
392 return preinterpret<Packet16uc>(pcast<Packet4f, Packet16c>(a, b, c, d));
395EIGEN_STRONG_INLINE Packet8uc pcast<Packet4f, Packet8uc>(
const Packet4f& a,
const Packet4f& b) {
396 return preinterpret<Packet8uc>(pcast<Packet4f, Packet8c>(a, b));
399EIGEN_STRONG_INLINE Packet8uc pcast<Packet2f, Packet8uc>(
const Packet2f& a,
const Packet2f& b,
const Packet2f& c,
401 return preinterpret<Packet8uc>(pcast<Packet2f, Packet8c>(a, b, c, d));
404EIGEN_STRONG_INLINE Packet4uc pcast<Packet4f, Packet4uc>(
const Packet4f& a) {
405 return static_cast<Packet4uc
>(pcast<Packet4f, Packet4c>(a));
408#if EIGEN_ARCH_ARM64 && EIGEN_HAS_ARM64_FP16
413struct type_casting_traits<half, float> {
414 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
418EIGEN_STRONG_INLINE Packet4f pcast<Packet8hf, Packet4f>(
const Packet8hf& a) {
419 return vcvt_f32_f16(vget_low_f16(a));
423EIGEN_STRONG_INLINE Packet4f pcast<Packet4hf, Packet4f>(
const Packet4hf& a) {
424 return vcvt_f32_f16(a);
432struct type_casting_traits<numext::int8_t, float> {
433 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
436EIGEN_STRONG_INLINE Packet4f pcast<Packet16c, Packet4f>(
const Packet16c& a) {
438 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a)))));
441EIGEN_STRONG_INLINE Packet4f pcast<Packet4c, Packet4f>(
const Packet4c& a) {
442 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_s32(vdup_n_s32(a))))));
445EIGEN_STRONG_INLINE Packet2f pcast<Packet8c, Packet2f>(
const Packet8c& a) {
447 return vcvt_f32_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a)))));
451struct type_casting_traits<numext::int8_t, numext::int64_t> {
452 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
455EIGEN_STRONG_INLINE Packet2l pcast<Packet16c, Packet2l>(
const Packet16c& a) {
457 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))))));
461struct type_casting_traits<numext::int8_t, numext::uint64_t> {
462 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
465EIGEN_STRONG_INLINE Packet2ul pcast<Packet16c, Packet2ul>(
const Packet16c& a) {
466 return preinterpret<Packet2ul>(pcast<Packet16c, Packet2l>(a));
470struct type_casting_traits<numext::int8_t, numext::int32_t> {
471 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
474EIGEN_STRONG_INLINE Packet4i pcast<Packet16c, Packet4i>(
const Packet16c& a) {
476 return vmovl_s16(vget_low_s16(vmovl_s8(vget_low_s8(a))));
479EIGEN_STRONG_INLINE Packet4i pcast<Packet8c, Packet4i>(
const Packet8c& a) {
480 return vmovl_s16(vget_low_s16(vmovl_s8(a)));
483EIGEN_STRONG_INLINE Packet4i pcast<Packet4c, Packet4i>(
const Packet4c& a) {
484 return pcast<Packet8c, Packet4i>(vreinterpret_s8_s32(vdup_n_s32(a)));
487EIGEN_STRONG_INLINE Packet2i pcast<Packet8c, Packet2i>(
const Packet8c& a) {
489 return vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a))));
493struct type_casting_traits<numext::int8_t, numext::uint32_t> {
494 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
497EIGEN_STRONG_INLINE Packet4ui pcast<Packet16c, Packet4ui>(
const Packet16c& a) {
498 return preinterpret<Packet4ui>(pcast<Packet16c, Packet4i>(a));
501EIGEN_STRONG_INLINE Packet2ui pcast<Packet8c, Packet2ui>(
const Packet8c& a) {
502 return preinterpret<Packet2ui>(pcast<Packet8c, Packet2i>(a));
505EIGEN_STRONG_INLINE Packet4ui pcast<Packet4c, Packet4ui>(
const Packet4c& a) {
506 return preinterpret<Packet4ui>(pcast<Packet4c, Packet4i>(a));
510struct type_casting_traits<numext::int8_t, numext::int16_t> {
511 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
514EIGEN_STRONG_INLINE Packet8s pcast<Packet16c, Packet8s>(
const Packet16c& a) {
516 return vmovl_s8(vget_low_s8(a));
519EIGEN_STRONG_INLINE Packet8s pcast<Packet8c, Packet8s>(
const Packet8c& a) {
523EIGEN_STRONG_INLINE Packet4s pcast<Packet8c, Packet4s>(
const Packet8c& a) {
525 return vget_low_s16(vmovl_s8(a));
528EIGEN_STRONG_INLINE Packet4s pcast<Packet4c, Packet4s>(
const Packet4c& a) {
529 return pcast<Packet8c, Packet4s>(vreinterpret_s8_s32(vdup_n_s32(a)));
533struct type_casting_traits<numext::int8_t, numext::uint16_t> {
534 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
537EIGEN_STRONG_INLINE Packet8us pcast<Packet16c, Packet8us>(
const Packet16c& a) {
538 return preinterpret<Packet8us>(pcast<Packet16c, Packet8s>(a));
541EIGEN_STRONG_INLINE Packet8us pcast<Packet8c, Packet8us>(
const Packet8c& a) {
542 return preinterpret<Packet8us>(pcast<Packet8c, Packet8s>(a));
545EIGEN_STRONG_INLINE Packet4us pcast<Packet8c, Packet4us>(
const Packet8c& a) {
546 return preinterpret<Packet4us>(pcast<Packet8c, Packet4s>(a));
549EIGEN_STRONG_INLINE Packet4us pcast<Packet4c, Packet4us>(
const Packet4c& a) {
550 return preinterpret<Packet4us>(pcast<Packet4c, Packet4s>(a));
557struct type_casting_traits<numext::uint8_t, float> {
558 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
561EIGEN_STRONG_INLINE Packet4f pcast<Packet16uc, Packet4f>(
const Packet16uc& a) {
563 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a)))));
566EIGEN_STRONG_INLINE Packet4f pcast<Packet4uc, Packet4f>(
const Packet4uc& a) {
567 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))))));
570EIGEN_STRONG_INLINE Packet2f pcast<Packet8uc, Packet2f>(
const Packet8uc& a) {
572 return vcvt_f32_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a)))));
576struct type_casting_traits<numext::uint8_t, numext::uint64_t> {
577 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
580EIGEN_STRONG_INLINE Packet2ul pcast<Packet16uc, Packet2ul>(
const Packet16uc& a) {
582 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))))));
586struct type_casting_traits<numext::uint8_t, numext::int64_t> {
587 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
590EIGEN_STRONG_INLINE Packet2l pcast<Packet16uc, Packet2l>(
const Packet16uc& a) {
591 return preinterpret<Packet2l>(pcast<Packet16uc, Packet2ul>(a));
595struct type_casting_traits<numext::uint8_t, numext::uint32_t> {
596 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
599EIGEN_STRONG_INLINE Packet4ui pcast<Packet16uc, Packet4ui>(
const Packet16uc& a) {
601 return vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8(a))));
604EIGEN_STRONG_INLINE Packet4ui pcast<Packet8uc, Packet4ui>(
const Packet8uc& a) {
605 return vmovl_u16(vget_low_u16(vmovl_u8(a)));
608EIGEN_STRONG_INLINE Packet2ui pcast<Packet8uc, Packet2ui>(
const Packet8uc& a) {
610 return vget_low_u32(vmovl_u16(vget_low_u16(vmovl_u8(a))));
613EIGEN_STRONG_INLINE Packet4ui pcast<Packet4uc, Packet4ui>(
const Packet4uc& a) {
614 return pcast<Packet8uc, Packet4ui>(vreinterpret_u8_u32(vdup_n_u32(a)));
618struct type_casting_traits<numext::uint8_t, numext::int32_t> {
619 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
622EIGEN_STRONG_INLINE Packet4i pcast<Packet16uc, Packet4i>(
const Packet16uc& a) {
623 return preinterpret<Packet4i>(pcast<Packet16uc, Packet4ui>(a));
626EIGEN_STRONG_INLINE Packet2i pcast<Packet8uc, Packet2i>(
const Packet8uc& a) {
627 return preinterpret<Packet2i>(pcast<Packet8uc, Packet2ui>(a));
630EIGEN_STRONG_INLINE Packet4i pcast<Packet4uc, Packet4i>(
const Packet4uc& a) {
631 return preinterpret<Packet4i>(pcast<Packet4uc, Packet4ui>(a));
635struct type_casting_traits<numext::uint8_t, numext::uint16_t> {
636 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
639EIGEN_STRONG_INLINE Packet8us pcast<Packet16uc, Packet8us>(
const Packet16uc& a) {
641 return vmovl_u8(vget_low_u8(a));
644EIGEN_STRONG_INLINE Packet8us pcast<Packet8uc, Packet8us>(
const Packet8uc& a) {
648EIGEN_STRONG_INLINE Packet4us pcast<Packet4uc, Packet4us>(
const Packet4uc& a) {
649 return vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))));
653struct type_casting_traits<numext::uint8_t, numext::int16_t> {
654 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
657EIGEN_STRONG_INLINE Packet8s pcast<Packet16uc, Packet8s>(
const Packet16uc& a) {
658 return preinterpret<Packet8s>(pcast<Packet16uc, Packet8us>(a));
661EIGEN_STRONG_INLINE Packet8s pcast<Packet8uc, Packet8s>(
const Packet8uc& a) {
662 return preinterpret<Packet8s>(pcast<Packet8uc, Packet8us>(a));
665EIGEN_STRONG_INLINE Packet4s pcast<Packet4uc, Packet4s>(
const Packet4uc& a) {
666 return preinterpret<Packet4s>(pcast<Packet4uc, Packet4us>(a));
673struct type_casting_traits<numext::int16_t, float> {
674 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
677EIGEN_STRONG_INLINE Packet4f pcast<Packet8s, Packet4f>(
const Packet8s& a) {
679 return vcvtq_f32_s32(vmovl_s16(vget_low_s16(a)));
682EIGEN_STRONG_INLINE Packet4f pcast<Packet4s, Packet4f>(
const Packet4s& a) {
683 return vcvtq_f32_s32(vmovl_s16(a));
686EIGEN_STRONG_INLINE Packet2f pcast<Packet4s, Packet2f>(
const Packet4s& a) {
688 return vcvt_f32_s32(vget_low_s32(vmovl_s16(a)));
692struct type_casting_traits<numext::int16_t, numext::int64_t> {
693 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
696EIGEN_STRONG_INLINE Packet2l pcast<Packet8s, Packet2l>(
const Packet8s& a) {
698 return vmovl_s32(vget_low_s32(vmovl_s16(vget_low_s16(a))));
702struct type_casting_traits<numext::int16_t, numext::uint64_t> {
703 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
706EIGEN_STRONG_INLINE Packet2ul pcast<Packet8s, Packet2ul>(
const Packet8s& a) {
707 return preinterpret<Packet2ul>(pcast<Packet8s, Packet2l>(a));
711struct type_casting_traits<numext::int16_t, numext::int32_t> {
712 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
715EIGEN_STRONG_INLINE Packet4i pcast<Packet8s, Packet4i>(
const Packet8s& a) {
717 return vmovl_s16(vget_low_s16(a));
720EIGEN_STRONG_INLINE Packet4i pcast<Packet4s, Packet4i>(
const Packet4s& a) {
724EIGEN_STRONG_INLINE Packet2i pcast<Packet4s, Packet2i>(
const Packet4s& a) {
726 return vget_low_s32(vmovl_s16(a));
730struct type_casting_traits<numext::int16_t, numext::uint32_t> {
731 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
734EIGEN_STRONG_INLINE Packet4ui pcast<Packet8s, Packet4ui>(
const Packet8s& a) {
735 return preinterpret<Packet4ui>(pcast<Packet8s, Packet4i>(a));
738EIGEN_STRONG_INLINE Packet4ui pcast<Packet4s, Packet4ui>(
const Packet4s& a) {
739 return preinterpret<Packet4ui>(pcast<Packet4s, Packet4i>(a));
742EIGEN_STRONG_INLINE Packet2ui pcast<Packet4s, Packet2ui>(
const Packet4s& a) {
743 return preinterpret<Packet2ui>(pcast<Packet4s, Packet2i>(a));
747struct type_casting_traits<numext::int16_t, numext::int8_t> {
748 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
751EIGEN_STRONG_INLINE Packet16c pcast<Packet8s, Packet16c>(
const Packet8s& a,
const Packet8s& b) {
752 return vcombine_s8(vmovn_s16(a), vmovn_s16(b));
755EIGEN_STRONG_INLINE Packet8c pcast<Packet8s, Packet8c>(
const Packet8s& a) {
759EIGEN_STRONG_INLINE Packet8c pcast<Packet4s, Packet8c>(
const Packet4s& a,
const Packet4s& b) {
760 return vmovn_s16(vcombine_s16(a, b));
763EIGEN_STRONG_INLINE Packet4c pcast<Packet4s, Packet4c>(
const Packet4s& a) {
764 const int8x8_t aa_s8x8 = pcast<Packet4s, Packet8c>(a, a);
765 return vget_lane_s32(vreinterpret_s32_s8(aa_s8x8), 0);
769struct type_casting_traits<numext::int16_t, numext::uint8_t> {
770 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
773EIGEN_STRONG_INLINE Packet16uc pcast<Packet8s, Packet16uc>(
const Packet8s& a,
const Packet8s& b) {
774 return preinterpret<Packet16uc>(pcast<Packet8s, Packet16c>(a, b));
777EIGEN_STRONG_INLINE Packet8uc pcast<Packet8s, Packet8uc>(
const Packet8s& a) {
778 return preinterpret<Packet8uc>(pcast<Packet8s, Packet8c>(a));
781EIGEN_STRONG_INLINE Packet8uc pcast<Packet4s, Packet8uc>(
const Packet4s& a,
const Packet4s& b) {
782 return preinterpret<Packet8uc>(pcast<Packet4s, Packet8c>(a, b));
785EIGEN_STRONG_INLINE Packet4uc pcast<Packet4s, Packet4uc>(
const Packet4s& a) {
786 return static_cast<Packet4uc
>(pcast<Packet4s, Packet4c>(a));
793struct type_casting_traits<numext::uint16_t, float> {
794 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
797EIGEN_STRONG_INLINE Packet4f pcast<Packet8us, Packet4f>(
const Packet8us& a) {
799 return vcvtq_f32_u32(vmovl_u16(vget_low_u16(a)));
802EIGEN_STRONG_INLINE Packet4f pcast<Packet4us, Packet4f>(
const Packet4us& a) {
803 return vcvtq_f32_u32(vmovl_u16(a));
806EIGEN_STRONG_INLINE Packet2f pcast<Packet4us, Packet2f>(
const Packet4us& a) {
808 return vcvt_f32_u32(vget_low_u32(vmovl_u16(a)));
812struct type_casting_traits<numext::uint16_t, numext::uint64_t> {
813 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
816EIGEN_STRONG_INLINE Packet2ul pcast<Packet8us, Packet2ul>(
const Packet8us& a) {
818 return vmovl_u32(vget_low_u32(vmovl_u16(vget_low_u16(a))));
822struct type_casting_traits<numext::uint16_t, numext::int64_t> {
823 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
826EIGEN_STRONG_INLINE Packet2l pcast<Packet8us, Packet2l>(
const Packet8us& a) {
827 return preinterpret<Packet2l>(pcast<Packet8us, Packet2ul>(a));
831struct type_casting_traits<numext::uint16_t, numext::uint32_t> {
832 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
835EIGEN_STRONG_INLINE Packet4ui pcast<Packet8us, Packet4ui>(
const Packet8us& a) {
837 return vmovl_u16(vget_low_u16(a));
840EIGEN_STRONG_INLINE Packet4ui pcast<Packet4us, Packet4ui>(
const Packet4us& a) {
844EIGEN_STRONG_INLINE Packet2ui pcast<Packet4us, Packet2ui>(
const Packet4us& a) {
846 return vget_low_u32(vmovl_u16(a));
850struct type_casting_traits<numext::uint16_t, numext::int32_t> {
851 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
854EIGEN_STRONG_INLINE Packet4i pcast<Packet8us, Packet4i>(
const Packet8us& a) {
855 return preinterpret<Packet4i>(pcast<Packet8us, Packet4ui>(a));
858EIGEN_STRONG_INLINE Packet4i pcast<Packet4us, Packet4i>(
const Packet4us& a) {
859 return preinterpret<Packet4i>(pcast<Packet4us, Packet4ui>(a));
862EIGEN_STRONG_INLINE Packet2i pcast<Packet4us, Packet2i>(
const Packet4us& a) {
863 return preinterpret<Packet2i>(pcast<Packet4us, Packet2ui>(a));
867struct type_casting_traits<numext::uint16_t, numext::uint8_t> {
868 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
871EIGEN_STRONG_INLINE Packet16uc pcast<Packet8us, Packet16uc>(
const Packet8us& a,
const Packet8us& b) {
872 return vcombine_u8(vmovn_u16(a), vmovn_u16(b));
875EIGEN_STRONG_INLINE Packet8uc pcast<Packet8us, Packet8uc>(
const Packet8us& a) {
879EIGEN_STRONG_INLINE Packet8uc pcast<Packet4us, Packet8uc>(
const Packet4us& a,
const Packet4us& b) {
880 return vmovn_u16(vcombine_u16(a, b));
883EIGEN_STRONG_INLINE Packet4uc pcast<Packet4us, Packet4uc>(
const Packet4us& a) {
884 uint8x8_t aa_u8x8 = pcast<Packet4us, Packet8uc>(a, a);
885 return vget_lane_u32(vreinterpret_u32_u8(aa_u8x8), 0);
889struct type_casting_traits<numext::uint16_t, numext::int8_t> {
890 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
893EIGEN_STRONG_INLINE Packet16c pcast<Packet8us, Packet16c>(
const Packet8us& a,
const Packet8us& b) {
894 return preinterpret<Packet16c>(pcast<Packet8us, Packet16uc>(a, b));
897EIGEN_STRONG_INLINE Packet8c pcast<Packet8us, Packet8c>(
const Packet8us& a) {
898 return preinterpret<Packet8c>(pcast<Packet8us, Packet8uc>(a));
901EIGEN_STRONG_INLINE Packet8c pcast<Packet4us, Packet8c>(
const Packet4us& a,
const Packet4us& b) {
902 return preinterpret<Packet8c>(pcast<Packet4us, Packet8uc>(a, b));
905EIGEN_STRONG_INLINE Packet4c pcast<Packet4us, Packet4c>(
const Packet4us& a) {
906 return static_cast<Packet4c
>(pcast<Packet4us, Packet4uc>(a));
913struct type_casting_traits<numext::int32_t, float> {
914 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
917EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(
const Packet4i& a) {
918 return vcvtq_f32_s32(a);
921EIGEN_STRONG_INLINE Packet2f pcast<Packet2i, Packet2f>(
const Packet2i& a) {
922 return vcvt_f32_s32(a);
926struct type_casting_traits<numext::int32_t, numext::int64_t> {
927 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
930EIGEN_STRONG_INLINE Packet2l pcast<Packet4i, Packet2l>(
const Packet4i& a) {
932 return vmovl_s32(vget_low_s32(a));
935EIGEN_STRONG_INLINE Packet2l pcast<Packet2i, Packet2l>(
const Packet2i& a) {
940struct type_casting_traits<numext::int32_t, numext::uint64_t> {
941 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
944EIGEN_STRONG_INLINE Packet2ul pcast<Packet4i, Packet2ul>(
const Packet4i& a) {
945 return preinterpret<Packet2ul>(pcast<Packet4i, Packet2l>(a));
948EIGEN_STRONG_INLINE Packet2ul pcast<Packet2i, Packet2ul>(
const Packet2i& a) {
949 return preinterpret<Packet2ul>(pcast<Packet2i, Packet2l>(a));
953struct type_casting_traits<numext::int32_t, numext::int16_t> {
954 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
957EIGEN_STRONG_INLINE Packet8s pcast<Packet4i, Packet8s>(
const Packet4i& a,
const Packet4i& b) {
958 return vcombine_s16(vmovn_s32(a), vmovn_s32(b));
961EIGEN_STRONG_INLINE Packet4s pcast<Packet4i, Packet4s>(
const Packet4i& a) {
965EIGEN_STRONG_INLINE Packet4s pcast<Packet2i, Packet4s>(
const Packet2i& a,
const Packet2i& b) {
966 return vmovn_s32(vcombine_s32(a, b));
970struct type_casting_traits<numext::int32_t, numext::uint16_t> {
971 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
974EIGEN_STRONG_INLINE Packet8us pcast<Packet4i, Packet8us>(
const Packet4i& a,
const Packet4i& b) {
975 return vcombine_u16(vmovn_u32(vreinterpretq_u32_s32(a)), vmovn_u32(vreinterpretq_u32_s32(b)));
978EIGEN_STRONG_INLINE Packet4us pcast<Packet4i, Packet4us>(
const Packet4i& a) {
979 return vmovn_u32(vreinterpretq_u32_s32(a));
982EIGEN_STRONG_INLINE Packet4us pcast<Packet2i, Packet4us>(
const Packet2i& a,
const Packet2i& b) {
983 return vmovn_u32(vreinterpretq_u32_s32(vcombine_s32(a, b)));
987struct type_casting_traits<numext::int32_t, numext::int8_t> {
988 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
991EIGEN_STRONG_INLINE Packet16c pcast<Packet4i, Packet16c>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
993 const int16x8_t ab_s16 = pcast<Packet4i, Packet8s>(a, b);
994 const int16x8_t cd_s16 = pcast<Packet4i, Packet8s>(c, d);
995 return vcombine_s8(vmovn_s16(ab_s16), vmovn_s16(cd_s16));
998EIGEN_STRONG_INLINE Packet8c pcast<Packet4i, Packet8c>(
const Packet4i& a,
const Packet4i& b) {
999 const int16x8_t ab_s16 = pcast<Packet4i, Packet8s>(a, b);
1000 return vmovn_s16(ab_s16);
1003EIGEN_STRONG_INLINE Packet8c pcast<Packet2i, Packet8c>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
1004 const Packet2i& d) {
1005 const int16x4_t ab_s16 = vmovn_s32(vcombine_s32(a, b));
1006 const int16x4_t cd_s16 = vmovn_s32(vcombine_s32(c, d));
1007 return vmovn_s16(vcombine_s16(ab_s16, cd_s16));
1010EIGEN_STRONG_INLINE Packet4c pcast<Packet4i, Packet4c>(
const Packet4i& a) {
1011 const int16x4_t a_s16x4 = vmovn_s32(a);
1012 const int16x8_t aa_s16x8 = vcombine_s16(a_s16x4, a_s16x4);
1013 const int8x8_t aa_s8x8 = vmovn_s16(aa_s16x8);
1014 return vget_lane_s32(vreinterpret_s32_s8(aa_s8x8), 0);
1018struct type_casting_traits<numext::int32_t, numext::uint8_t> {
1019 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1022EIGEN_STRONG_INLINE Packet16uc pcast<Packet4i, Packet16uc>(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c,
1023 const Packet4i& d) {
1024 return preinterpret<Packet16uc>(pcast<Packet4i, Packet16c>(a, b, c, d));
1027EIGEN_STRONG_INLINE Packet8uc pcast<Packet4i, Packet8uc>(
const Packet4i& a,
const Packet4i& b) {
1028 return preinterpret<Packet8uc>(pcast<Packet4i, Packet8c>(a, b));
1031EIGEN_STRONG_INLINE Packet8uc pcast<Packet2i, Packet8uc>(
const Packet2i& a,
const Packet2i& b,
const Packet2i& c,
1032 const Packet2i& d) {
1033 return preinterpret<Packet8uc>(pcast<Packet2i, Packet8c>(a, b, c, d));
1036EIGEN_STRONG_INLINE Packet4uc pcast<Packet4i, Packet4uc>(
const Packet4i& a) {
1037 return static_cast<Packet4uc
>(pcast<Packet4i, Packet4c>(a));
1044struct type_casting_traits<numext::uint32_t, float> {
1045 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1048EIGEN_STRONG_INLINE Packet4f pcast<Packet4ui, Packet4f>(
const Packet4ui& a) {
1049 return vcvtq_f32_u32(a);
1052EIGEN_STRONG_INLINE Packet2f pcast<Packet2ui, Packet2f>(
const Packet2ui& a) {
1053 return vcvt_f32_u32(a);
1057struct type_casting_traits<numext::uint32_t, numext::uint64_t> {
1058 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1061EIGEN_STRONG_INLINE Packet2ul pcast<Packet4ui, Packet2ul>(
const Packet4ui& a) {
1063 return vmovl_u32(vget_low_u32(a));
1066EIGEN_STRONG_INLINE Packet2ul pcast<Packet2ui, Packet2ul>(
const Packet2ui& a) {
1067 return vmovl_u32(a);
1071struct type_casting_traits<numext::uint32_t, numext::int64_t> {
1072 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1075EIGEN_STRONG_INLINE Packet2l pcast<Packet4ui, Packet2l>(
const Packet4ui& a) {
1076 return preinterpret<Packet2l>(pcast<Packet4ui, Packet2ul>(a));
1079EIGEN_STRONG_INLINE Packet2l pcast<Packet2ui, Packet2l>(
const Packet2ui& a) {
1080 return preinterpret<Packet2l>(pcast<Packet2ui, Packet2ul>(a));
1084struct type_casting_traits<numext::uint32_t, numext::uint16_t> {
1085 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1088EIGEN_STRONG_INLINE Packet8us pcast<Packet4ui, Packet8us>(
const Packet4ui& a,
const Packet4ui& b) {
1089 return vcombine_u16(vmovn_u32(a), vmovn_u32(b));
1092EIGEN_STRONG_INLINE Packet4us pcast<Packet2ui, Packet4us>(
const Packet2ui& a,
const Packet2ui& b) {
1093 return vmovn_u32(vcombine_u32(a, b));
1096EIGEN_STRONG_INLINE Packet4us pcast<Packet4ui, Packet4us>(
const Packet4ui& a) {
1097 return vmovn_u32(a);
1101struct type_casting_traits<numext::uint32_t, numext::int16_t> {
1102 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1105EIGEN_STRONG_INLINE Packet8s pcast<Packet4ui, Packet8s>(
const Packet4ui& a,
const Packet4ui& b) {
1106 return preinterpret<Packet8s>(pcast<Packet4ui, Packet8us>(a, b));
1109EIGEN_STRONG_INLINE Packet4s pcast<Packet2ui, Packet4s>(
const Packet2ui& a,
const Packet2ui& b) {
1110 return preinterpret<Packet4s>(pcast<Packet2ui, Packet4us>(a, b));
1113EIGEN_STRONG_INLINE Packet4s pcast<Packet4ui, Packet4s>(
const Packet4ui& a) {
1114 return preinterpret<Packet4s>(pcast<Packet4ui, Packet4us>(a));
1118struct type_casting_traits<numext::uint32_t, numext::uint8_t> {
1119 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1122EIGEN_STRONG_INLINE Packet16uc pcast<Packet4ui, Packet16uc>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
1123 const Packet4ui& d) {
1124 const uint16x8_t ab_u16 = vcombine_u16(vmovn_u32(a), vmovn_u32(b));
1125 const uint16x8_t cd_u16 = vcombine_u16(vmovn_u32(c), vmovn_u32(d));
1126 return vcombine_u8(vmovn_u16(ab_u16), vmovn_u16(cd_u16));
1129EIGEN_STRONG_INLINE Packet8uc pcast<Packet4ui, Packet8uc>(
const Packet4ui& a,
const Packet4ui& b) {
1130 const uint16x8_t ab_u16 = vcombine_u16(vmovn_u32(a), vmovn_u32(b));
1131 return vmovn_u16(ab_u16);
1134EIGEN_STRONG_INLINE Packet8uc pcast<Packet2ui, Packet8uc>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
1135 const Packet2ui& d) {
1136 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(a, b));
1137 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(c, d));
1138 return vmovn_u16(vcombine_u16(ab_u16, cd_u16));
1141EIGEN_STRONG_INLINE Packet4uc pcast<Packet4ui, Packet4uc>(
const Packet4ui& a) {
1142 const uint16x4_t a_u16x4 = vmovn_u32(a);
1143 const uint16x8_t aa_u16x8 = vcombine_u16(a_u16x4, a_u16x4);
1144 const uint8x8_t aa_u8x8 = vmovn_u16(aa_u16x8);
1145 return vget_lane_u32(vreinterpret_u32_u8(aa_u8x8), 0);
1149struct type_casting_traits<numext::uint32_t, numext::int8_t> {
1150 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1153EIGEN_STRONG_INLINE Packet16c pcast<Packet4ui, Packet16c>(
const Packet4ui& a,
const Packet4ui& b,
const Packet4ui& c,
1154 const Packet4ui& d) {
1155 return preinterpret<Packet16c>(pcast<Packet4ui, Packet16uc>(a, b, c, d));
1158EIGEN_STRONG_INLINE Packet8c pcast<Packet4ui, Packet8c>(
const Packet4ui& a,
const Packet4ui& b) {
1159 return preinterpret<Packet8c>(pcast<Packet4ui, Packet8uc>(a, b));
1162EIGEN_STRONG_INLINE Packet8c pcast<Packet2ui, Packet8c>(
const Packet2ui& a,
const Packet2ui& b,
const Packet2ui& c,
1163 const Packet2ui& d) {
1164 return preinterpret<Packet8c>(pcast<Packet2ui, Packet8uc>(a, b, c, d));
1167EIGEN_STRONG_INLINE Packet4c pcast<Packet4ui, Packet4c>(
const Packet4ui& a) {
1168 return static_cast<Packet4c
>(pcast<Packet4ui, Packet4uc>(a));
1175struct type_casting_traits<numext::int64_t, float> {
1176 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1180EIGEN_STRONG_INLINE Packet4f pcast<Packet2l, Packet4f>(
const Packet2l& a,
const Packet2l& b) {
1182 return vcombine_f32(vcvt_f32_f64(vcvtq_f64_s64(a)), vcvt_f32_f64(vcvtq_f64_s64(b)));
1184 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet2l>::alignment) int64_t lvals[4];
1186 pstore(lvals + 2, b);
1187 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet4f>::alignment)
1188 float fvals[4] = {
static_cast<float>(lvals[0]),
static_cast<float>(lvals[1]),
static_cast<float>(lvals[2]),
1189 static_cast<float>(lvals[3])};
1190 return pload<Packet4f>(fvals);
1195EIGEN_STRONG_INLINE Packet2f pcast<Packet2l, Packet2f>(
const Packet2l& a) {
1197 return vcvt_f32_f64(vcvtq_f64_s64(a));
1199 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet2l>::alignment) int64_t lvals[2];
1201 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet2f>::alignment)
1202 float fvals[2] = {
static_cast<float>(lvals[0]),
static_cast<float>(lvals[1])};
1203 return pload<Packet2f>(fvals);
1208struct type_casting_traits<numext::int64_t, numext::int32_t> {
1209 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1212EIGEN_STRONG_INLINE Packet4i pcast<Packet2l, Packet4i>(
const Packet2l& a,
const Packet2l& b) {
1213 return vcombine_s32(vmovn_s64(a), vmovn_s64(b));
1216EIGEN_STRONG_INLINE Packet2i pcast<Packet2l, Packet2i>(
const Packet2l& a) {
1217 return vmovn_s64(a);
1221struct type_casting_traits<numext::int64_t, numext::uint32_t> {
1222 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1225EIGEN_STRONG_INLINE Packet4ui pcast<Packet2l, Packet4ui>(
const Packet2l& a,
const Packet2l& b) {
1226 return vcombine_u32(vmovn_u64(vreinterpretq_u64_s64(a)), vmovn_u64(vreinterpretq_u64_s64(b)));
1229EIGEN_STRONG_INLINE Packet2ui pcast<Packet2l, Packet2ui>(
const Packet2l& a) {
1230 return vmovn_u64(vreinterpretq_u64_s64(a));
1234struct type_casting_traits<numext::int64_t, numext::int16_t> {
1235 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1238EIGEN_STRONG_INLINE Packet8s pcast<Packet2l, Packet8s>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1239 const Packet2l& d) {
1240 const int32x4_t ab_s32 = pcast<Packet2l, Packet4i>(a, b);
1241 const int32x4_t cd_s32 = pcast<Packet2l, Packet4i>(c, d);
1242 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
1245EIGEN_STRONG_INLINE Packet4s pcast<Packet2l, Packet4s>(
const Packet2l& a,
const Packet2l& b) {
1246 const int32x4_t ab_s32 = pcast<Packet2l, Packet4i>(a, b);
1247 return vmovn_s32(ab_s32);
1251struct type_casting_traits<numext::int64_t, numext::uint16_t> {
1252 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1255EIGEN_STRONG_INLINE Packet8us pcast<Packet2l, Packet8us>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1256 const Packet2l& d) {
1257 return preinterpret<Packet8us>(pcast<Packet2l, Packet8s>(a, b, c, d));
1260EIGEN_STRONG_INLINE Packet4us pcast<Packet2l, Packet4us>(
const Packet2l& a,
const Packet2l& b) {
1261 return preinterpret<Packet4us>(pcast<Packet2l, Packet4s>(a, b));
1265struct type_casting_traits<numext::int64_t, numext::int8_t> {
1266 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1269EIGEN_STRONG_INLINE Packet16c pcast<Packet2l, Packet16c>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1270 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
1271 const Packet2l& g,
const Packet2l& h) {
1272 const int16x8_t abcd_s16 = pcast<Packet2l, Packet8s>(a, b, c, d);
1273 const int16x8_t efgh_s16 = pcast<Packet2l, Packet8s>(e, f, g, h);
1274 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
1277EIGEN_STRONG_INLINE Packet8c pcast<Packet2l, Packet8c>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1278 const Packet2l& d) {
1279 const int16x8_t abcd_s16 = pcast<Packet2l, Packet8s>(a, b, c, d);
1280 return vmovn_s16(abcd_s16);
1283EIGEN_STRONG_INLINE Packet4c pcast<Packet2l, Packet4c>(
const Packet2l& a,
const Packet2l& b) {
1284 const int16x4_t ab_s16 = pcast<Packet2l, Packet4s>(a, b);
1285 const int16x8_t abab_s16 = vcombine_s16(ab_s16, ab_s16);
1286 const int8x8_t abab_s8 = vmovn_s16(abab_s16);
1287 return vget_lane_s32(vreinterpret_s32_s8(abab_s8), 0);
1291struct type_casting_traits<numext::int64_t, numext::uint8_t> {
1292 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1295EIGEN_STRONG_INLINE Packet16uc pcast<Packet2l, Packet16uc>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1296 const Packet2l& d,
const Packet2l& e,
const Packet2l& f,
1297 const Packet2l& g,
const Packet2l& h) {
1298 const uint16x8_t abcd_u16 = pcast<Packet2l, Packet8us>(a, b, c, d);
1299 const uint16x8_t efgh_u16 = pcast<Packet2l, Packet8us>(e, f, g, h);
1300 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1303EIGEN_STRONG_INLINE Packet8uc pcast<Packet2l, Packet8uc>(
const Packet2l& a,
const Packet2l& b,
const Packet2l& c,
1304 const Packet2l& d) {
1305 return preinterpret<Packet8uc>(pcast<Packet2l, Packet8c>(a, b, c, d));
1308EIGEN_STRONG_INLINE Packet4uc pcast<Packet2l, Packet4uc>(
const Packet2l& a,
const Packet2l& b) {
1309 return static_cast<Packet4uc
>(pcast<Packet2l, Packet4c>(a, b));
1316struct type_casting_traits<numext::uint64_t, float> {
1317 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1320EIGEN_STRONG_INLINE Packet4f pcast<Packet2ul, Packet4f>(
const Packet2ul& a,
const Packet2ul& b) {
1322 return vcombine_f32(vcvt_f32_f64(vcvtq_f64_u64(a)), vcvt_f32_f64(vcvtq_f64_u64(b)));
1324 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet2ul>::alignment) uint64_t uvals[4];
1326 pstore(uvals + 2, b);
1327 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet4f>::alignment)
1328 float fvals[4] = {
static_cast<float>(uvals[0]),
static_cast<float>(uvals[1]),
static_cast<float>(uvals[2]),
1329 static_cast<float>(uvals[3])};
1330 return pload<Packet4f>(fvals);
1334EIGEN_STRONG_INLINE Packet2f pcast<Packet2ul, Packet2f>(
const Packet2ul& a) {
1336 return vcvt_f32_f64(vcvtq_f64_u64(a));
1338 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet2ul>::alignment) uint64_t uvals[2];
1340 EIGEN_ALIGN_TO_BOUNDARY(unpacket_traits<Packet2f>::alignment)
1341 float fvals[2] = {
static_cast<float>(uvals[0]),
static_cast<float>(uvals[1])};
1342 return pload<Packet2f>(fvals);
1347struct type_casting_traits<numext::uint64_t, numext::uint32_t> {
1348 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1351EIGEN_STRONG_INLINE Packet4ui pcast<Packet2ul, Packet4ui>(
const Packet2ul& a,
const Packet2ul& b) {
1352 return vcombine_u32(vmovn_u64(a), vmovn_u64(b));
1355EIGEN_STRONG_INLINE Packet2ui pcast<Packet2ul, Packet2ui>(
const Packet2ul& a) {
1356 return vmovn_u64(a);
1360struct type_casting_traits<numext::uint64_t, numext::int32_t> {
1361 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1364EIGEN_STRONG_INLINE Packet4i pcast<Packet2ul, Packet4i>(
const Packet2ul& a,
const Packet2ul& b) {
1365 return preinterpret<Packet4i>(pcast<Packet2ul, Packet4ui>(a, b));
1368EIGEN_STRONG_INLINE Packet2i pcast<Packet2ul, Packet2i>(
const Packet2ul& a) {
1369 return preinterpret<Packet2i>(pcast<Packet2ul, Packet2ui>(a));
1373struct type_casting_traits<numext::uint64_t, numext::uint16_t> {
1374 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1377EIGEN_STRONG_INLINE Packet8us pcast<Packet2ul, Packet8us>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1378 const Packet2ul& d) {
1379 const uint16x4_t ab_u16 = vmovn_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1380 const uint16x4_t cd_u16 = vmovn_u32(vcombine_u32(vmovn_u64(c), vmovn_u64(d)));
1381 return vcombine_u16(ab_u16, cd_u16);
1384EIGEN_STRONG_INLINE Packet4us pcast<Packet2ul, Packet4us>(
const Packet2ul& a,
const Packet2ul& b) {
1385 return vmovn_u32(vcombine_u32(vmovn_u64(a), vmovn_u64(b)));
1389struct type_casting_traits<numext::uint64_t, numext::int16_t> {
1390 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1393EIGEN_STRONG_INLINE Packet8s pcast<Packet2ul, Packet8s>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1394 const Packet2ul& d) {
1395 return preinterpret<Packet8s>(pcast<Packet2ul, Packet8us>(a, b, c, d));
1398EIGEN_STRONG_INLINE Packet4s pcast<Packet2ul, Packet4s>(
const Packet2ul& a,
const Packet2ul& b) {
1399 return preinterpret<Packet4s>(pcast<Packet2ul, Packet4us>(a, b));
1403struct type_casting_traits<numext::uint64_t, numext::uint8_t> {
1404 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1407EIGEN_STRONG_INLINE Packet16uc pcast<Packet2ul, Packet16uc>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1408 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1409 const Packet2ul& g,
const Packet2ul& h) {
1410 const uint16x8_t abcd_u16 = pcast<Packet2ul, Packet8us>(a, b, c, d);
1411 const uint16x8_t efgh_u16 = pcast<Packet2ul, Packet8us>(e, f, g, h);
1412 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1415EIGEN_STRONG_INLINE Packet8uc pcast<Packet2ul, Packet8uc>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1416 const Packet2ul& d) {
1417 const uint16x8_t abcd_u16 = pcast<Packet2ul, Packet8us>(a, b, c, d);
1418 return vmovn_u16(abcd_u16);
1421EIGEN_STRONG_INLINE Packet4uc pcast<Packet2ul, Packet4uc>(
const Packet2ul& a,
const Packet2ul& b) {
1422 const uint16x4_t ab_u16 = pcast<Packet2ul, Packet4us>(a, b);
1423 const uint16x8_t abab_u16 = vcombine_u16(ab_u16, ab_u16);
1424 const uint8x8_t abab_u8 = vmovn_u16(abab_u16);
1425 return vget_lane_u32(vreinterpret_u32_u8(abab_u8), 0);
1429struct type_casting_traits<numext::uint64_t, numext::int8_t> {
1430 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1433EIGEN_STRONG_INLINE Packet16c pcast<Packet2ul, Packet16c>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1434 const Packet2ul& d,
const Packet2ul& e,
const Packet2ul& f,
1435 const Packet2ul& g,
const Packet2ul& h) {
1436 return preinterpret<Packet16c>(pcast<Packet2ul, Packet16uc>(a, b, c, d, e, f, g, h));
1439EIGEN_STRONG_INLINE Packet8c pcast<Packet2ul, Packet8c>(
const Packet2ul& a,
const Packet2ul& b,
const Packet2ul& c,
1440 const Packet2ul& d) {
1441 return preinterpret<Packet8c>(pcast<Packet2ul, Packet8uc>(a, b, c, d));
1444EIGEN_STRONG_INLINE Packet4c pcast<Packet2ul, Packet4c>(
const Packet2ul& a,
const Packet2ul& b) {
1445 return static_cast<Packet4c
>(pcast<Packet2ul, Packet4uc>(a, b));
1455EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2l>(
const Packet2l& a) {
1456 return Packet2d(vreinterpretq_f64_s64(a));
1459EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet2ul>(
const Packet2ul& a) {
1460 return Packet2d(vreinterpretq_f64_u64(a));
1463EIGEN_STRONG_INLINE Packet2l preinterpret<Packet2l, Packet2d>(
const Packet2d& a) {
1464 return Packet2l(vreinterpretq_s64_f64(a));
1467EIGEN_STRONG_INLINE Packet2ul preinterpret<Packet2ul, Packet2d>(
const Packet2d& a) {
1468 return Packet2ul(vreinterpretq_u64_f64(a));
1471EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4i>(
const Packet4i& a) {
1472 return Packet2d(vreinterpretq_f64_s32(a));
1475EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet2d>(
const Packet2d& a) {
1476 return Packet4i(vreinterpretq_s32_f64(a));
1480struct type_casting_traits<double, float> {
1481 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1484EIGEN_STRONG_INLINE Packet4f pcast<Packet2d, Packet4f>(
const Packet2d& a,
const Packet2d& b) {
1485 return vcombine_f32(vcvt_f32_f64(a), vcvt_f32_f64(b));
1488EIGEN_STRONG_INLINE Packet2f pcast<Packet2d, Packet2f>(
const Packet2d& a) {
1489 return vcvt_f32_f64(a);
1493struct type_casting_traits<double, numext::int64_t> {
1494 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1497EIGEN_STRONG_INLINE Packet2l pcast<Packet2d, Packet2l>(
const Packet2d& a) {
1498 return vcvtq_s64_f64(a);
1502struct type_casting_traits<double, numext::uint64_t> {
1503 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1506EIGEN_STRONG_INLINE Packet2ul pcast<Packet2d, Packet2ul>(
const Packet2d& a) {
1507 return vcvtq_u64_f64(a);
1511struct type_casting_traits<double, numext::int32_t> {
1512 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1515EIGEN_STRONG_INLINE Packet4i pcast<Packet2d, Packet4i>(
const Packet2d& a,
const Packet2d& b) {
1516 return vcombine_s32(vmovn_s64(vcvtq_s64_f64(a)), vmovn_s64(vcvtq_s64_f64(b)));
1519EIGEN_STRONG_INLINE Packet2i pcast<Packet2d, Packet2i>(
const Packet2d& a) {
1520 return vmovn_s64(vcvtq_s64_f64(a));
1524struct type_casting_traits<double, numext::uint32_t> {
1525 enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
1528EIGEN_STRONG_INLINE Packet4ui pcast<Packet2d, Packet4ui>(
const Packet2d& a,
const Packet2d& b) {
1529 return vcombine_u32(vmovn_u64(vcvtq_u64_f64(a)), vmovn_u64(vcvtq_u64_f64(b)));
1532EIGEN_STRONG_INLINE Packet2ui pcast<Packet2d, Packet2ui>(
const Packet2d& a) {
1533 return vmovn_u64(vcvtq_u64_f64(a));
1537struct type_casting_traits<double, numext::int16_t> {
1538 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1541EIGEN_STRONG_INLINE Packet8s pcast<Packet2d, Packet8s>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1542 const Packet2d& d) {
1543 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1544 const int32x4_t cd_s32 = pcast<Packet2d, Packet4i>(c, d);
1545 return vcombine_s16(vmovn_s32(ab_s32), vmovn_s32(cd_s32));
1548EIGEN_STRONG_INLINE Packet4s pcast<Packet2d, Packet4s>(
const Packet2d& a,
const Packet2d& b) {
1549 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1550 return vmovn_s32(ab_s32);
1554struct type_casting_traits<double, numext::uint16_t> {
1555 enum { VectorizedCast = 1, SrcCoeffRatio = 4, TgtCoeffRatio = 1 };
1558EIGEN_STRONG_INLINE Packet8us pcast<Packet2d, Packet8us>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1559 const Packet2d& d) {
1560 return preinterpret<Packet8us>(pcast<Packet2d, Packet8s>(a, b, c, d));
1563EIGEN_STRONG_INLINE Packet4us pcast<Packet2d, Packet4us>(
const Packet2d& a,
const Packet2d& b) {
1564 return preinterpret<Packet4us>(pcast<Packet2d, Packet4s>(a, b));
1568struct type_casting_traits<double, numext::int8_t> {
1569 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1572EIGEN_STRONG_INLINE Packet16c pcast<Packet2d, Packet16c>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1573 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1574 const Packet2d& g,
const Packet2d& h) {
1575 const int16x8_t abcd_s16 = pcast<Packet2d, Packet8s>(a, b, c, d);
1576 const int16x8_t efgh_s16 = pcast<Packet2d, Packet8s>(e, f, g, h);
1577 return vcombine_s8(vmovn_s16(abcd_s16), vmovn_s16(efgh_s16));
1580EIGEN_STRONG_INLINE Packet8c pcast<Packet2d, Packet8c>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1581 const Packet2d& d) {
1582 const int16x8_t abcd_s16 = pcast<Packet2d, Packet8s>(a, b, c, d);
1583 return vmovn_s16(abcd_s16);
1586EIGEN_STRONG_INLINE Packet4c pcast<Packet2d, Packet4c>(
const Packet2d& a,
const Packet2d& b) {
1587 const int32x4_t ab_s32 = pcast<Packet2d, Packet4i>(a, b);
1588 return pcast<Packet4i, Packet4c>(ab_s32);
1592struct type_casting_traits<double, numext::uint8_t> {
1593 enum { VectorizedCast = 1, SrcCoeffRatio = 8, TgtCoeffRatio = 1 };
1596EIGEN_STRONG_INLINE Packet16uc pcast<Packet2d, Packet16uc>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1597 const Packet2d& d,
const Packet2d& e,
const Packet2d& f,
1598 const Packet2d& g,
const Packet2d& h) {
1599 const uint16x8_t abcd_u16 = pcast<Packet2d, Packet8us>(a, b, c, d);
1600 const uint16x8_t efgh_u16 = pcast<Packet2d, Packet8us>(e, f, g, h);
1601 return vcombine_u8(vmovn_u16(abcd_u16), vmovn_u16(efgh_u16));
1604EIGEN_STRONG_INLINE Packet8uc pcast<Packet2d, Packet8uc>(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c,
1605 const Packet2d& d) {
1606 return preinterpret<Packet8uc>(pcast<Packet2d, Packet8c>(a, b, c, d));
1609EIGEN_STRONG_INLINE Packet4uc pcast<Packet2d, Packet4uc>(
const Packet2d& a,
const Packet2d& b) {
1610 return static_cast<Packet4uc
>(pcast<Packet2d, Packet4c>(a, b));
1614struct type_casting_traits<float, double> {
1615 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1618EIGEN_STRONG_INLINE Packet2d pcast<Packet4f, Packet2d>(
const Packet4f& a) {
1620 return vcvt_f64_f32(vget_low_f32(a));
1623EIGEN_STRONG_INLINE Packet2d pcast<Packet2f, Packet2d>(
const Packet2f& a) {
1624 return vcvt_f64_f32(a);
1628struct type_casting_traits<numext::int8_t, double> {
1629 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1632EIGEN_STRONG_INLINE Packet2d pcast<Packet16c, Packet2d>(
const Packet16c& a) {
1635 Packet2f tmp = pcast<Packet8c, Packet2f>(vget_low_s8(a));
1636 return vcvt_f64_f32(tmp);
1640struct type_casting_traits<numext::uint8_t, double> {
1641 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 8 };
1644EIGEN_STRONG_INLINE Packet2d pcast<Packet16uc, Packet2d>(
const Packet16uc& a) {
1646 Packet2f tmp = pcast<Packet8uc, Packet2f>(vget_low_u8(a));
1647 return vcvt_f64_f32(tmp);
1651struct type_casting_traits<numext::int16_t, double> {
1652 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1655EIGEN_STRONG_INLINE Packet2d pcast<Packet8s, Packet2d>(
const Packet8s& a) {
1657 Packet2f tmp = pcast<Packet4s, Packet2f>(vget_low_s16(a));
1658 return vcvt_f64_f32(tmp);
1662struct type_casting_traits<numext::uint16_t, double> {
1663 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
1666EIGEN_STRONG_INLINE Packet2d pcast<Packet8us, Packet2d>(
const Packet8us& a) {
1668 Packet2f tmp = pcast<Packet4us, Packet2f>(vget_low_u16(a));
1669 return vcvt_f64_f32(tmp);
1673struct type_casting_traits<numext::int32_t, double> {
1674 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1677EIGEN_STRONG_INLINE Packet2d pcast<Packet4i, Packet2d>(
const Packet4i& a) {
1679 return vcvtq_f64_s64(vmovl_s32(vget_low_s32(a)));
1682EIGEN_STRONG_INLINE Packet2d pcast<Packet2i, Packet2d>(
const Packet2i& a) {
1683 return vcvtq_f64_s64(vmovl_s32(a));
1687struct type_casting_traits<numext::uint32_t, double> {
1688 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
1691EIGEN_STRONG_INLINE Packet2d pcast<Packet4ui, Packet2d>(
const Packet4ui& a) {
1693 return vcvtq_f64_u64(vmovl_u32(vget_low_u32(a)));
1696EIGEN_STRONG_INLINE Packet2d pcast<Packet2ui, Packet2d>(
const Packet2ui& a) {
1697 return vcvtq_f64_u64(vmovl_u32(a));
1701struct type_casting_traits<numext::int64_t, double> {
1702 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1705EIGEN_STRONG_INLINE Packet2d pcast<Packet2l, Packet2d>(
const Packet2l& a) {
1706 return vcvtq_f64_s64(a);
1710struct type_casting_traits<numext::uint64_t, double> {
1711 enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
1714EIGEN_STRONG_INLINE Packet2d pcast<Packet2ul, Packet2d>(
const Packet2ul& a) {
1715 return vcvtq_f64_u64(a);