mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 03:39:01 +08:00
Fix typecasting for arm32
This commit is contained in:
parent
b2cb49e280
commit
dd8c71e628
@ -1109,15 +1109,32 @@ template <>
|
|||||||
struct type_casting_traits<numext::int64_t, float> {
|
struct type_casting_traits<numext::int64_t, float> {
|
||||||
enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
|
enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
EIGEN_STRONG_INLINE Packet4f pcast<Packet2l, Packet4f>(const Packet2l& a, const Packet2l& b) {
|
EIGEN_STRONG_INLINE Packet4f pcast<Packet2l, Packet4f>(const Packet2l& a, const Packet2l& b) {
|
||||||
|
#if EIGEN_ARCH_ARM64
|
||||||
return vcombine_f32(vcvt_f32_f64(vcvtq_f64_s64(a)), vcvt_f32_f64(vcvtq_f64_s64(b)));
|
return vcombine_f32(vcvt_f32_f64(vcvtq_f64_s64(a)), vcvt_f32_f64(vcvtq_f64_s64(b)));
|
||||||
}
|
#else
|
||||||
template <>
|
EIGEN_ALIGN_MAX int64_t lvals[4];
|
||||||
EIGEN_STRONG_INLINE Packet2f pcast<Packet2l, Packet2f>(const Packet2l& a) {
|
pstore(lvals, a);
|
||||||
return vcvt_f32_f64(vcvtq_f64_s64(a));
|
pstore(lvals + 2, b);
|
||||||
|
EIGEN_ALIGN_MAX float fvals[4] = {static_cast<float>(lvals[0]), static_cast<float>(lvals[1]),
|
||||||
|
static_cast<float>(lvals[2]), static_cast<float>(lvals[3])};
|
||||||
|
return pload<Packet4f>(fvals);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
EIGEN_STRONG_INLINE Packet2f pcast<Packet2l, Packet2f>(const Packet2l& a) {
|
||||||
|
#if EIGEN_ARCH_ARM64
|
||||||
|
return vcvt_f32_f64(vcvtq_f64_s64(a));
|
||||||
|
#else
|
||||||
|
EIGEN_ALIGN_MAX int64_t lvals[2];
|
||||||
|
pstore(lvals, a);
|
||||||
|
EIGEN_ALIGN_MAX float fvals[2] = {static_cast<float>(lvals[0]), static_cast<float>(lvals[1])};
|
||||||
|
return pload<Packet2f>(fvals);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct type_casting_traits<numext::int64_t, numext::int32_t> {
|
struct type_casting_traits<numext::int64_t, numext::int32_t> {
|
||||||
@ -1233,11 +1250,27 @@ struct type_casting_traits<numext::uint64_t, float> {
|
|||||||
};
|
};
|
||||||
template <>
|
template <>
|
||||||
EIGEN_STRONG_INLINE Packet4f pcast<Packet2ul, Packet4f>(const Packet2ul& a, const Packet2ul& b) {
|
EIGEN_STRONG_INLINE Packet4f pcast<Packet2ul, Packet4f>(const Packet2ul& a, const Packet2ul& b) {
|
||||||
|
#if EIGEN_ARCH_ARM64
|
||||||
return vcombine_f32(vcvt_f32_f64(vcvtq_f64_u64(a)), vcvt_f32_f64(vcvtq_f64_u64(b)));
|
return vcombine_f32(vcvt_f32_f64(vcvtq_f64_u64(a)), vcvt_f32_f64(vcvtq_f64_u64(b)));
|
||||||
|
#else
|
||||||
|
EIGEN_ALIGN_MAX uint64_t uvals[4];
|
||||||
|
pstore(uvals, a);
|
||||||
|
pstore(uvals + 2, b);
|
||||||
|
EIGEN_ALIGN_MAX float fvals[4] = {static_cast<float>(uvals[0]), static_cast<float>(uvals[1]),
|
||||||
|
static_cast<float>(uvals[2]), static_cast<float>(uvals[3])};
|
||||||
|
return pload<Packet4f>(fvals);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
template <>
|
template <>
|
||||||
EIGEN_STRONG_INLINE Packet2f pcast<Packet2ul, Packet2f>(const Packet2ul& a) {
|
EIGEN_STRONG_INLINE Packet2f pcast<Packet2ul, Packet2f>(const Packet2ul& a) {
|
||||||
|
#if EIGEN_ARCH_ARM64
|
||||||
return vcvt_f32_f64(vcvtq_f64_u64(a));
|
return vcvt_f32_f64(vcvtq_f64_u64(a));
|
||||||
|
#else
|
||||||
|
EIGEN_ALIGN_MAX uint64_t uvals[2];
|
||||||
|
pstore(uvals, a);
|
||||||
|
EIGEN_ALIGN_MAX float fvals[2] = {static_cast<float>(uvals[0]), static_cast<float>(uvals[1])};
|
||||||
|
return pload<Packet2f>(fvals);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user