From 52d54278beefee8b2f19dcca4fd900916154e174 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Thu, 26 Mar 2020 20:18:19 +0000 Subject: Additional NEON packet-math operations --- Eigen/src/Core/arch/NEON/TypeCasting.h | 322 +++++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) (limited to 'Eigen/src/Core/arch/NEON/TypeCasting.h') diff --git a/Eigen/src/Core/arch/NEON/TypeCasting.h b/Eigen/src/Core/arch/NEON/TypeCasting.h index 298088c2d..4aa98e370 100644 --- a/Eigen/src/Core/arch/NEON/TypeCasting.h +++ b/Eigen/src/Core/arch/NEON/TypeCasting.h @@ -14,23 +14,289 @@ namespace Eigen { namespace internal { +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; +template<> struct type_casting_traits +{ enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> EIGEN_STRONG_INLINE Packet2f pcast(const Packet2i& a) { return vcvt_f32_s32(a); } template<> EIGEN_STRONG_INLINE Packet2f pcast(const Packet2ui& a) { return vcvt_f32_u32(a); } +template<> EIGEN_STRONG_INLINE Packet2f pcast(const Packet2l& a) +{ return vcvt_f32_s32(vmovn_s64(a)); } +template<> EIGEN_STRONG_INLINE Packet2f pcast(const Packet2ul& a) +{ return vcvt_f32_u32(vmovn_u64(a)); } +template<> EIGEN_STRONG_INLINE Packet4f pcast(const Packet4c& a) +{ return vcvtq_f32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_s32(vdup_n_s32(a)))))); } +template<> EIGEN_STRONG_INLINE Packet4f pcast(const Packet4uc& a) +{ return vcvtq_f32_s32(vreinterpretq_s32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))))))); } +template<> EIGEN_STRONG_INLINE Packet4f pcast(const Packet4s& a) +{ return vcvtq_f32_s32(vmovl_s16(a)); } +template<> EIGEN_STRONG_INLINE Packet4f pcast(const Packet4us& a) +{ return vcvtq_f32_s32(vreinterpretq_s32_u32(vmovl_u16(a))); } template<> EIGEN_STRONG_INLINE Packet4f pcast(const Packet4i& a) { return vcvtq_f32_s32(a); } template<> EIGEN_STRONG_INLINE Packet4f pcast(const Packet4ui& a) { return vcvtq_f32_u32(a); } +template<> EIGEN_STRONG_INLINE Packet4c pcast(const Packet4f& a) +{ + const int16x4_t b = vmovn_s32(vcvtq_s32_f32(a)); + return vget_lane_s32(vreinterpret_s32_s8(vmovn_s16(vcombine_s16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet4c pcast(const Packet4uc& a) +{ return static_cast(a); } +template<> EIGEN_STRONG_INLINE Packet4c pcast(const Packet4s& a) +{ return vget_lane_s32(vreinterpret_s32_s8(vmovn_s16(vcombine_s16(a, a))), 0); } +template<> EIGEN_STRONG_INLINE Packet4c pcast(const Packet4us& a) +{ + const int16x4_t b = vreinterpret_s16_u16(a); + return vget_lane_s32(vreinterpret_s32_s8(vmovn_s16(vcombine_s16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet4c pcast(const Packet4i& a) +{ + const int16x4_t b = vmovn_s32(a); + return vget_lane_s32(vreinterpret_s32_s8(vmovn_s16(vcombine_s16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet4c pcast(const Packet4ui& a) +{ + const int16x4_t b = vmovn_s32(vreinterpretq_s32_u32(a)); + return vget_lane_s32(vreinterpret_s32_s8(vmovn_s16(vcombine_s16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet8c pcast(const Packet8uc& a) { return vreinterpret_s8_u8(a); } +template<> EIGEN_STRONG_INLINE Packet8c pcast(const Packet8s& a) { return vmovn_s16(a); } +template<> EIGEN_STRONG_INLINE Packet8c pcast(const Packet8us& a) +{ return vreinterpret_s8_u8(vmovn_u16(a)); } +template<> EIGEN_STRONG_INLINE Packet16c pcast(const Packet16uc& a) +{ return vreinterpretq_s8_u8(a); } +template<> EIGEN_STRONG_INLINE Packet4uc pcast(const Packet4f& a) +{ + const uint16x4_t b = vmovn_u32(vreinterpretq_u32_s32(vcvtq_s32_f32(a))); + return vget_lane_u32(vreinterpret_u32_u8(vmovn_u16(vcombine_u16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet4uc pcast(const Packet4i& a) +{ + const uint16x4_t b = vmovn_u32(vreinterpretq_u32_s32(a)); + return vget_lane_u32(vreinterpret_u32_u8(vmovn_u16(vcombine_u16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet4uc pcast(const Packet4ui& a) +{ + const uint16x4_t b = vmovn_u32(a); + return vget_lane_u32(vreinterpret_u32_u8(vmovn_u16(vcombine_u16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet4uc pcast(const Packet4c& a) +{ return static_cast(a); } +template<> EIGEN_STRONG_INLINE Packet4uc pcast(const Packet4s& a) +{ + const uint16x4_t b = vreinterpret_u16_s16(a); + return vget_lane_u32(vreinterpret_u32_u8(vmovn_u16(vcombine_u16(b, b))), 0); +} +template<> EIGEN_STRONG_INLINE Packet4uc pcast(const Packet4us& a) +{ return vget_lane_u32(vreinterpret_u32_u8(vmovn_u16(vcombine_u16(a, a))), 0); } +template<> EIGEN_STRONG_INLINE Packet8uc pcast(const Packet8c& a) { return vreinterpret_u8_s8(a); } +template<> EIGEN_STRONG_INLINE Packet8uc pcast(const Packet8s& a) +{ return vreinterpret_u8_s8(vmovn_s16(a)); } +template<> EIGEN_STRONG_INLINE Packet8uc pcast(const Packet8us& a) { return vmovn_u16(a); } +template<> EIGEN_STRONG_INLINE Packet16uc pcast(const Packet16c& a) +{ return vreinterpretq_u8_s8(a); } +template<> EIGEN_STRONG_INLINE Packet4s pcast(const Packet4f& a) +{ return vmovn_s32(vcvtq_s32_f32(a)); } +template<> EIGEN_STRONG_INLINE Packet4s pcast(const Packet4c& a) +{ return vget_low_s16(vmovl_s8(vreinterpret_s8_s32(vdup_n_s32(a)))); } +template<> EIGEN_STRONG_INLINE Packet4s pcast(const Packet4uc& a) +{ return vget_low_s16(vreinterpretq_s16_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))))); } +template<> EIGEN_STRONG_INLINE Packet4s pcast(const Packet4us& a) +{ return vreinterpret_s16_u16(a); } +template<> EIGEN_STRONG_INLINE Packet4s pcast(const Packet4i& a) { return vmovn_s32(a); } +template<> EIGEN_STRONG_INLINE Packet4s pcast(const Packet4ui& a) +{ return vmovn_s32(vreinterpretq_s32_u32(a)); } +template<> EIGEN_STRONG_INLINE Packet8s pcast(const Packet8uc& a) +{ return vreinterpretq_s16_u16(vmovl_u8(a)); } +template<> EIGEN_STRONG_INLINE Packet8s pcast(const Packet8c& a) { return vmovl_s8(a); } +template<> EIGEN_STRONG_INLINE Packet8s pcast(const Packet8us& a) +{ return vreinterpretq_s16_u16(a); } +template<> EIGEN_STRONG_INLINE Packet4us pcast(const Packet4f& a) +{ return vmovn_u32(vreinterpretq_u32_s32(vcvtq_s32_f32(a))); } +template<> EIGEN_STRONG_INLINE Packet4us pcast(const Packet4c& a) +{ return vget_low_u16(vreinterpretq_u16_s16(vmovl_s8(vreinterpret_s8_s32(vdup_n_s32(a))))); } +template<> EIGEN_STRONG_INLINE Packet4us pcast(const Packet4uc& a) +{ return vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a)))); } +template<> EIGEN_STRONG_INLINE Packet4us pcast(const Packet4s& a) +{ return vreinterpret_u16_s16(a); } +template<> EIGEN_STRONG_INLINE Packet4us pcast(const Packet4i& a) +{ return vmovn_u32(vreinterpretq_u32_s32(a)); } +template<> EIGEN_STRONG_INLINE Packet4us pcast(const Packet4ui& a) { return vmovn_u32(a); } +template<> EIGEN_STRONG_INLINE Packet8us pcast(const Packet8c& a) +{ return vreinterpretq_u16_s16(vmovl_s8(a)); } +template<> EIGEN_STRONG_INLINE Packet8us pcast(const Packet8uc& a) { return vmovl_u8(a); } +template<> EIGEN_STRONG_INLINE Packet8us pcast(const Packet8s& a) +{ return vreinterpretq_u16_s16(a); } template<> EIGEN_STRONG_INLINE Packet2i pcast(const Packet2f& a) { return vcvt_s32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet2i pcast(const Packet2ui& a) +{ return vreinterpret_s32_u32(a); } +template<> EIGEN_STRONG_INLINE Packet2i pcast(const Packet2l& a) +{ return vmovn_s64(a); } +template<> EIGEN_STRONG_INLINE Packet2i pcast(const Packet2ul& a) +{ return vmovn_s64(vreinterpretq_s64_u64(a)); } template<> EIGEN_STRONG_INLINE Packet4i pcast(const Packet4f& a) { return vcvtq_s32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet4i pcast(const Packet4c& a) +{ return vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_s32(vdup_n_s32(a))))); } +template<> EIGEN_STRONG_INLINE Packet4i pcast(const Packet4uc& a) +{ return vreinterpretq_s32_u32(vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a)))))); } +template<> EIGEN_STRONG_INLINE Packet4i pcast(const Packet4s& a) { return vmovl_s16(a); } +template<> EIGEN_STRONG_INLINE Packet4i pcast(const Packet4us& a) +{ return vreinterpretq_s32_u32(vmovl_u16(a)); } +template<> EIGEN_STRONG_INLINE Packet4i pcast(const Packet4ui& a) +{ return vreinterpretq_s32_u32(a); } template<> EIGEN_STRONG_INLINE Packet2ui pcast(const Packet2f& a) { return vcvt_u32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet2ui pcast(const Packet2i& a) +{ return vreinterpret_u32_s32(a); } +template<> EIGEN_STRONG_INLINE Packet2ui pcast(const Packet2l& a) +{ return vmovn_u64(vreinterpretq_u64_s64(a)); } +template<> EIGEN_STRONG_INLINE Packet2ui pcast(const Packet2ul& a) +{ return vmovn_u64(a); } template<> EIGEN_STRONG_INLINE Packet4ui pcast(const Packet4f& a) { return vcvtq_u32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet4ui pcast(const Packet4c& a) +{ return vreinterpretq_u32_s32(vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_s32(vdup_n_s32(a)))))); } +template<> EIGEN_STRONG_INLINE Packet4ui pcast(const Packet4uc& a) +{ return vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))))); } +template<> EIGEN_STRONG_INLINE Packet4ui pcast(const Packet4s& a) +{ return vreinterpretq_u32_s32(vmovl_s16(a)); } +template<> EIGEN_STRONG_INLINE Packet4ui pcast(const Packet4us& a) { return vmovl_u16(a); } +template<> EIGEN_STRONG_INLINE Packet4ui pcast(const Packet4i& a) +{ return vreinterpretq_u32_s32(a); } +template<> EIGEN_STRONG_INLINE Packet2l pcast(const Packet2f& a) +{ return vmovl_s32(vcvt_s32_f32(a)); } +template<> EIGEN_STRONG_INLINE Packet2l pcast(const Packet2i& a) +{ return vmovl_s32(a); } +template<> EIGEN_STRONG_INLINE Packet2l pcast(const Packet2ui& a) +{ return vreinterpretq_s64_u64(vmovl_u32(a)); } +template<> EIGEN_STRONG_INLINE Packet2l pcast(const Packet2ul& a) +{ return vreinterpretq_s64_u64(a); } +template<> EIGEN_STRONG_INLINE Packet2ul pcast(const Packet2f& a) +{ return vmovl_u32(vcvt_u32_f32(a)); } +template<> EIGEN_STRONG_INLINE Packet2ul pcast(const Packet2i& a) +{ return vreinterpretq_u64_s64(vmovl_s32(a)); } +template<> EIGEN_STRONG_INLINE Packet2ul pcast(const Packet2ui& a) +{ return vmovl_u32(a); } +template<> EIGEN_STRONG_INLINE Packet2ul pcast(const Packet2l& a) +{ return vreinterpretq_u64_s64(a); } template<> EIGEN_STRONG_INLINE Packet2f preinterpret(const Packet2i& a) { return vreinterpret_f32_s32(a); } @@ -40,14 +306,70 @@ template<> EIGEN_STRONG_INLINE Packet4f preinterpret(const Pa { return vreinterpretq_f32_s32(a); } template<> EIGEN_STRONG_INLINE Packet4f preinterpret(const Packet4ui& a) { return vreinterpretq_f32_u32(a); } +template<> EIGEN_STRONG_INLINE Packet4c preinterpret(const Packet4uc& a) +{ return static_cast(a); } +template<> EIGEN_STRONG_INLINE Packet8c preinterpret(const Packet8uc& a) +{ return vreinterpret_s8_u8(a); } +template<> EIGEN_STRONG_INLINE Packet16c preinterpret(const Packet16uc& a) +{ return vreinterpretq_s8_u8(a); } +template<> EIGEN_STRONG_INLINE Packet4uc preinterpret(const Packet4c& a) +{ return static_cast(a); } +template<> EIGEN_STRONG_INLINE Packet8uc preinterpret(const Packet8c& a) +{ return vreinterpret_u8_s8(a); } +template<> EIGEN_STRONG_INLINE Packet16uc preinterpret(const Packet16c& a) +{ return vreinterpretq_u8_s8(a); } +template<> EIGEN_STRONG_INLINE Packet4s preinterpret(const Packet4us& a) +{ return vreinterpret_s16_u16(a); } +template<> EIGEN_STRONG_INLINE Packet8s preinterpret(const Packet8us& a) +{ return vreinterpretq_s16_u16(a); } +template<> EIGEN_STRONG_INLINE Packet4us preinterpret(const Packet4s& a) +{ return vreinterpret_u16_s16(a); } +template<> EIGEN_STRONG_INLINE Packet8us preinterpret(const Packet8s& a) +{ return vreinterpretq_u16_s16(a); } template<> EIGEN_STRONG_INLINE Packet2i preinterpret(const Packet2f& a) { return vreinterpret_s32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet2i preinterpret(const Packet2ui& a) +{ return vreinterpret_s32_u32(a); } template<> EIGEN_STRONG_INLINE Packet4i preinterpret(const Packet4f& a) { return vreinterpretq_s32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet4i preinterpret(const Packet4ui& a) +{ return vreinterpretq_s32_u32(a); } template<> EIGEN_STRONG_INLINE Packet2ui preinterpret(const Packet2f& a) { return vreinterpret_u32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet2ui preinterpret(const Packet2i& a) +{ return vreinterpret_u32_s32(a); } template<> EIGEN_STRONG_INLINE Packet4ui preinterpret(const Packet4f& a) { return vreinterpretq_u32_f32(a); } +template<> EIGEN_STRONG_INLINE Packet4ui preinterpret(const Packet4i& a) +{ return vreinterpretq_u32_s32(a); } +template<> EIGEN_STRONG_INLINE Packet2l preinterpret(const Packet2ul& a) +{ return vreinterpretq_s64_u64(a); } +template<> EIGEN_STRONG_INLINE Packet2ul preinterpret(const Packet2l& a) +{ return vreinterpretq_u64_s64(a); } + +#if EIGEN_ARCH_ARM64 + +template<> EIGEN_STRONG_INLINE Packet2f pcast(const Packet2d& a) { return vcvt_f32_f64(a); } +template<> EIGEN_STRONG_INLINE Packet2d pcast(const Packet2f& a) { return vcvt_f64_f32(a); } +template<> EIGEN_STRONG_INLINE Packet2d pcast(const Packet2i& a) { return vcvtq_f64_s64(vmovl_s32(a)); } +template<> EIGEN_STRONG_INLINE Packet2d pcast(const Packet2ui& a) { return vcvtq_f64_u64(vmovl_u32(a)); } +template<> EIGEN_STRONG_INLINE Packet2d pcast(const Packet2l& a) { return vcvtq_f64_s64(a); } +template<> EIGEN_STRONG_INLINE Packet2d pcast(const Packet2ul& a) { return vcvtq_f64_u64(a); } +template<> EIGEN_STRONG_INLINE Packet2i pcast(const Packet2d& a) { return vcvt_s32_f32(vcvt_f32_f64(a)); } +template<> EIGEN_STRONG_INLINE Packet2ui pcast(const Packet2d& a) { return vcvt_u32_f32(vcvt_f32_f64(a)); } +template<> EIGEN_STRONG_INLINE Packet2l pcast(const Packet2d& a) { return vcvtq_s64_f64(a); } +template<> EIGEN_STRONG_INLINE Packet2ul pcast(const Packet2d& a) { return vcvtq_u64_f64(a); } + +template<> EIGEN_STRONG_INLINE Packet2d preinterpret(const Packet2l& a) +{ return vreinterpretq_f64_s64(a); } +template<> EIGEN_STRONG_INLINE Packet2d preinterpret(const Packet2ul& a) +{ return vreinterpretq_f64_u64(a); } +template<> EIGEN_STRONG_INLINE Packet2l preinterpret(const Packet2d& a) +{ return vreinterpretq_s64_f64(a); } +template<> EIGEN_STRONG_INLINE Packet2ul preinterpret(const Packet2d& a) +{ return vreinterpretq_u64_f64(a); } + +#endif // EIGEN_ARCH_ARM64 } // end namespace internal -- cgit v1.2.3