10 #ifndef EIGEN_TYPE_CASTING_SSE_H 11 #define EIGEN_TYPE_CASTING_SSE_H 17 #ifndef EIGEN_VECTORIZE_AVX 19 struct type_casting_traits<float, int> {
28 struct type_casting_traits<int, float> {
37 struct type_casting_traits<double, float> {
46 struct type_casting_traits<float, double> {
55 template<> EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(
const Packet4f& a) {
56 return _mm_cvttps_epi32(a);
59 template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(
const Packet4i& a) {
60 return _mm_cvtepi32_ps(a);
63 template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet2d, Packet4f>(
const Packet2d& a,
const Packet2d& b) {
64 return _mm_shuffle_ps(_mm_cvtpd_ps(a), _mm_cvtpd_ps(b), (1 << 2) | (1 << 6));
67 template<> EIGEN_STRONG_INLINE Packet2d pcast<Packet4f, Packet2d>(
const Packet4f& a) {
69 return _mm_cvtps_pd(a);
72 template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i,Packet4f>(
const Packet4f& a) {
73 return _mm_castps_si128(a);
76 template<> EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f,Packet4i>(
const Packet4i& a) {
77 return _mm_castsi128_ps(a);
80 template<> EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d,Packet4i>(
const Packet4i& a) {
81 return _mm_castsi128_pd(a);
84 template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i,Packet2d>(
const Packet2d& a) {
85 return _mm_castpd_si128(a);
93 struct type_casting_traits<
Eigen::half, float> {
101 template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet4h, Packet4f>(
const Packet4h& a) {
102 __int64_t a64 = _mm_cvtm64_si64(a.x);
103 Eigen::half h = raw_uint16_to_half(static_cast<unsigned short>(a64));
104 float f1 =
static_cast<float>(h);
105 h = raw_uint16_to_half(static_cast<unsigned short>(a64 >> 16));
106 float f2 =
static_cast<float>(h);
107 h = raw_uint16_to_half(static_cast<unsigned short>(a64 >> 32));
108 float f3 =
static_cast<float>(h);
109 h = raw_uint16_to_half(static_cast<unsigned short>(a64 >> 48));
110 float f4 =
static_cast<float>(h);
111 return _mm_set_ps(f4, f3, f2, f1);
115 struct type_casting_traits<float,
Eigen::half> {
123 template<> EIGEN_STRONG_INLINE Packet4h pcast<Packet4f, Packet4h>(
const Packet4f& a) {
124 EIGEN_ALIGN16
float aux[4];
126 Eigen::half h0(aux[0]);
127 Eigen::half h1(aux[1]);
128 Eigen::half h2(aux[2]);
129 Eigen::half h3(aux[3]);
132 result.x = _mm_set_pi16(h3.x, h2.x, h1.x, h0.x);
142 #endif // EIGEN_TYPE_CASTING_SSE_H Namespace containing all symbols from the Eigen library.
Definition: Core:141
Definition: Eigen_Colamd.h:50