// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2018 Rasmus Munk Larsen // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN_TYPE_CASTING_NEON_H #define EIGEN_TYPE_CASTING_NEON_H 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 = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_cas0ing_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, 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 = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, 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 = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, SrcCoeffRatio = 1, TgtCoeffRatio = 1 }; }; template<> struct type_casting_traits { enum { VectorizedCast = 0, 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); } template<> EIGEN_STRONG_INLINE Packet2f preinterpret(const Packet2ui& a) { return vreinterpret_f32_u32(a); } template<> EIGEN_STRONG_INLINE Packet4f preinterpret(const Packet4i& a) { 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 } // end namespace Eigen #endif // EIGEN_TYPE_CASTING_NEON_H