14#ifndef EIGEN_PACKET_MATH_MSA_H
15#define EIGEN_PACKET_MATH_MSA_H
21#include "../../InternalHeaderCheck.h"
27#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
28#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
31#ifndef EIGEN_HAS_SINGLE_INSTRUCTION_MADD
32#define EIGEN_HAS_SINGLE_INSTRUCTION_MADD
35#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
36#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 32
39#define EIGEN_MSA_DEBUG
41#define EIGEN_MSA_SHF_I8(a, b, c, d) (((d) << 6) | ((c) << 4) | ((b) << 2) | (a))
43typedef v4f32 Packet4f;
44typedef v4i32 Packet4i;
45typedef v4u32 Packet4ui;
47#define EIGEN_DECLARE_CONST_Packet4f(NAME, X) const Packet4f p4f_##NAME = {X, X, X, X}
48#define EIGEN_DECLARE_CONST_Packet4i(NAME, X) const Packet4i p4i_##NAME = {X, X, X, X}
49#define EIGEN_DECLARE_CONST_Packet4ui(NAME, X) const Packet4ui p4ui_##NAME = {X, X, X, X}
51inline std::ostream& operator<<(std::ostream& os,
const Packet4f& value) {
52 os <<
"[ " << value[0] <<
", " << value[1] <<
", " << value[2] <<
", " << value[3] <<
" ]";
56inline std::ostream& operator<<(std::ostream& os,
const Packet4i& value) {
57 os <<
"[ " << value[0] <<
", " << value[1] <<
", " << value[2] <<
", " << value[3] <<
" ]";
61inline std::ostream& operator<<(std::ostream& os,
const Packet4ui& value) {
62 os <<
"[ " << value[0] <<
", " << value[1] <<
", " << value[2] <<
", " << value[3] <<
" ]";
67struct packet_traits<float> : default_packet_traits {
68 typedef Packet4f type;
69 typedef Packet4f half;
76 HasSin = EIGEN_FAST_MATH,
77 HasCos = EIGEN_FAST_MATH,
78 HasTanh = EIGEN_FAST_MATH,
79 HasErf = EIGEN_FAST_MATH,
88struct packet_traits<int32_t> : default_packet_traits {
89 typedef Packet4i type;
90 typedef Packet4i half;
101struct unpacket_traits<Packet4f> {
107 masked_load_available =
false,
108 masked_store_available =
false
110 typedef Packet4f half;
114struct unpacket_traits<Packet4i> {
115 typedef int32_t type;
120 masked_load_available =
false,
121 masked_store_available =
false
123 typedef Packet4i half;
127EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(
const float& from) {
130 Packet4f v = {from, from, from, from};
135EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(
const int32_t& from) {
138 return __builtin_msa_fill_w(from);
142EIGEN_STRONG_INLINE Packet4f pload1<Packet4f>(
const float* from) {
146 Packet4f v = {f, f, f, f};
151EIGEN_STRONG_INLINE Packet4i pload1<Packet4i>(
const int32_t* from) {
154 return __builtin_msa_fill_w(*from);
158EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
161 return __builtin_msa_fadd_w(a, b);
165EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
168 return __builtin_msa_addv_w(a, b);
172EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(
const float& a) {
175 static const Packet4f countdown = {0.0f, 1.0f, 2.0f, 3.0f};
176 return padd(pset1<Packet4f>(a), countdown);
180EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(
const int32_t& a) {
183 static const Packet4i countdown = {0, 1, 2, 3};
184 return padd(pset1<Packet4i>(a), countdown);
188EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
191 return __builtin_msa_fsub_w(a, b);
195EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
198 return __builtin_msa_subv_w(a, b);
202EIGEN_STRONG_INLINE Packet4f pnegate(
const Packet4f& a) {
205 return (Packet4f)__builtin_msa_bnegi_w((v4u32)a, 31);
209EIGEN_STRONG_INLINE Packet4i pnegate(
const Packet4i& a) {
212 return __builtin_msa_addvi_w((v4i32)__builtin_msa_nori_b((v16u8)a, 0), 1);
216EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
219 return __builtin_msa_fmul_w(a, b);
223EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
226 return __builtin_msa_mulv_w(a, b);
230EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
233 return __builtin_msa_fdiv_w(a, b);
237EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
240 return __builtin_msa_div_s_w(a, b);
244EIGEN_STRONG_INLINE Packet4f pmadd(
const Packet4f& a,
const Packet4f& b,
const Packet4f& c) {
247 return __builtin_msa_fmadd_w(c, a, b);
251EIGEN_STRONG_INLINE Packet4i pmadd(
const Packet4i& a,
const Packet4i& b,
const Packet4i& c) {
256 __asm__(
"maddv.w %w[value], %w[a], %w[b]\n"
258 : [value]
"+f"(value)
260 : [a]
"f"(a), [b]
"f"(b));
265EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
268 return (Packet4f)__builtin_msa_and_v((v16u8)a, (v16u8)b);
272EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
275 return (Packet4i)__builtin_msa_and_v((v16u8)a, (v16u8)b);
279EIGEN_STRONG_INLINE Packet4f por<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
282 return (Packet4f)__builtin_msa_or_v((v16u8)a, (v16u8)b);
286EIGEN_STRONG_INLINE Packet4i por<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
289 return (Packet4i)__builtin_msa_or_v((v16u8)a, (v16u8)b);
293EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
296 return (Packet4f)__builtin_msa_xor_v((v16u8)a, (v16u8)b);
300EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
303 return (Packet4i)__builtin_msa_xor_v((v16u8)a, (v16u8)b);
307EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
310 return pand(a, (Packet4f)__builtin_msa_xori_b((v16u8)b, 255));
314EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
317 return pand(a, (Packet4i)__builtin_msa_xori_b((v16u8)b, 255));
321EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
326 return __builtin_msa_fmin_w(a, b);
329 Packet4i aNaN = __builtin_msa_fcun_w(a, a);
330 Packet4i aMinOrNaN = por(__builtin_msa_fclt_w(a, b), aNaN);
331 return (Packet4f)__builtin_msa_bsel_v((v16u8)aMinOrNaN, (v16u8)b, (v16u8)a);
336EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
339 return __builtin_msa_min_s_w(a, b);
343EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
348 return __builtin_msa_fmax_w(a, b);
351 Packet4i aNaN = __builtin_msa_fcun_w(a, a);
352 Packet4i aMaxOrNaN = por(__builtin_msa_fclt_w(b, a), aNaN);
353 return (Packet4f)__builtin_msa_bsel_v((v16u8)aMaxOrNaN, (v16u8)b, (v16u8)a);
358EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(
const Packet4i& a,
const Packet4i& b) {
361 return __builtin_msa_max_s_w(a, b);
365EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(
const float* from) {
368 EIGEN_DEBUG_ALIGNED_LOAD
return (Packet4f)__builtin_msa_ld_w(
const_cast<float*
>(from), 0);
372EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(
const int32_t* from) {
375 EIGEN_DEBUG_ALIGNED_LOAD
return __builtin_msa_ld_w(
const_cast<int32_t*
>(from), 0);
379EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(
const float* from) {
382 EIGEN_DEBUG_UNALIGNED_LOAD
return (Packet4f)__builtin_msa_ld_w(
const_cast<float*
>(from), 0);
386EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(
const int32_t* from) {
389 EIGEN_DEBUG_UNALIGNED_LOAD
return (Packet4i)__builtin_msa_ld_w(
const_cast<int32_t*
>(from), 0);
393EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(
const float* from) {
396 float f0 = from[0], f1 = from[1];
397 Packet4f v0 = {f0, f0, f0, f0};
398 Packet4f v1 = {f1, f1, f1, f1};
399 return (Packet4f)__builtin_msa_ilvr_d((v2i64)v1, (v2i64)v0);
403EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(
const int32_t* from) {
406 int32_t i0 = from[0], i1 = from[1];
407 Packet4i v0 = {i0, i0, i0, i0};
408 Packet4i v1 = {i1, i1, i1, i1};
409 return (Packet4i)__builtin_msa_ilvr_d((v2i64)v1, (v2i64)v0);
413EIGEN_STRONG_INLINE
void pstore<float>(
float* to,
const Packet4f& from) {
416 EIGEN_DEBUG_ALIGNED_STORE __builtin_msa_st_w((Packet4i)from, to, 0);
420EIGEN_STRONG_INLINE
void pstore<int32_t>(int32_t* to,
const Packet4i& from) {
423 EIGEN_DEBUG_ALIGNED_STORE __builtin_msa_st_w(from, to, 0);
427EIGEN_STRONG_INLINE
void pstoreu<float>(
float* to,
const Packet4f& from) {
430 EIGEN_DEBUG_UNALIGNED_STORE __builtin_msa_st_w((Packet4i)from, to, 0);
434EIGEN_STRONG_INLINE
void pstoreu<int32_t>(int32_t* to,
const Packet4i& from) {
437 EIGEN_DEBUG_UNALIGNED_STORE __builtin_msa_st_w(from, to, 0);
441EIGEN_DEVICE_FUNC
inline Packet4f pgather<float, Packet4f>(
const float* from, Index stride) {
445 Packet4f v = {f, f, f, f};
447 v[2] = from[2 * stride];
448 v[3] = from[3 * stride];
453EIGEN_DEVICE_FUNC
inline Packet4i pgather<int32_t, Packet4i>(
const int32_t* from, Index stride) {
457 Packet4i v = {i, i, i, i};
459 v[2] = from[2 * stride];
460 v[3] = from[3 * stride];
465EIGEN_DEVICE_FUNC
inline void pscatter<float, Packet4f>(
float* to,
const Packet4f& from, Index stride) {
478EIGEN_DEVICE_FUNC
inline void pscatter<int32_t, Packet4i>(int32_t* to,
const Packet4i& from, Index stride) {
491EIGEN_STRONG_INLINE
void prefetch<float>(
const float* addr) {
494 __builtin_prefetch(addr);
498EIGEN_STRONG_INLINE
void prefetch<int32_t>(
const int32_t* addr) {
501 __builtin_prefetch(addr);
505EIGEN_STRONG_INLINE
float pfirst<Packet4f>(
const Packet4f& a) {
512EIGEN_STRONG_INLINE int32_t pfirst<Packet4i>(
const Packet4i& a) {
519EIGEN_STRONG_INLINE Packet4f preverse(
const Packet4f& a) {
522 return (Packet4f)__builtin_msa_shf_w((v4i32)a, EIGEN_MSA_SHF_I8(3, 2, 1, 0));
526EIGEN_STRONG_INLINE Packet4i preverse(
const Packet4i& a) {
529 return __builtin_msa_shf_w(a, EIGEN_MSA_SHF_I8(3, 2, 1, 0));
533EIGEN_STRONG_INLINE Packet4f pabs(
const Packet4f& a) {
536 return (Packet4f)__builtin_msa_bclri_w((v4u32)a, 31);
540EIGEN_STRONG_INLINE Packet4i pabs(
const Packet4i& a) {
543 Packet4i zero = __builtin_msa_ldi_w(0);
544 return __builtin_msa_add_a_w(zero, a);
548EIGEN_STRONG_INLINE
float predux<Packet4f>(
const Packet4f& a) {
551 Packet4f s = padd(a, (Packet4f)__builtin_msa_shf_w((v4i32)a, EIGEN_MSA_SHF_I8(2, 3, 0, 1)));
552 s = padd(s, (Packet4f)__builtin_msa_shf_w((v4i32)s, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
557EIGEN_STRONG_INLINE
bool predux_any(
const Packet4f& a) {
558 return __builtin_msa_bnz_v((v16u8)a);
562EIGEN_STRONG_INLINE int32_t predux<Packet4i>(
const Packet4i& a) {
565 Packet4i s = padd(a, __builtin_msa_shf_w(a, EIGEN_MSA_SHF_I8(2, 3, 0, 1)));
566 s = padd(s, __builtin_msa_shf_w(s, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
571EIGEN_STRONG_INLINE
bool predux_any(
const Packet4i& a) {
572 return __builtin_msa_bnz_v((v16u8)a);
578EIGEN_STRONG_INLINE
float predux_mul<Packet4f>(
const Packet4f& a) {
581 Packet4f p = pmul(a, (Packet4f)__builtin_msa_shf_w((v4i32)a, EIGEN_MSA_SHF_I8(2, 3, 0, 1)));
582 p = pmul(p, (Packet4f)__builtin_msa_shf_w((v4i32)p, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
587EIGEN_STRONG_INLINE int32_t predux_mul<Packet4i>(
const Packet4i& a) {
590 Packet4i p = pmul(a, __builtin_msa_shf_w(a, EIGEN_MSA_SHF_I8(2, 3, 0, 1)));
591 p = pmul(p, __builtin_msa_shf_w(p, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
597EIGEN_STRONG_INLINE
float predux_min<Packet4f>(
const Packet4f& a) {
601 Packet4f swapped = (Packet4f)__builtin_msa_shf_w((Packet4i)a, EIGEN_MSA_SHF_I8(2, 3, 0, 1));
605 v16u8 unord = (v16u8)__builtin_msa_fcun_w(a, swapped);
607 unord = (v16u8)__builtin_msa_ceqi_d((v2i64)unord, 0);
610 Packet4f v = __builtin_msa_fmin_w(a, swapped);
611 v = __builtin_msa_fmin_w(v, (Packet4f)__builtin_msa_shf_w((Packet4i)v, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
614 v16u8 qnans = (v16u8)__builtin_msa_fill_w(0x7FC00000);
615 v = (Packet4f)__builtin_msa_bsel_v(unord, qnans, (v16u8)v);
621EIGEN_STRONG_INLINE int32_t predux_min<Packet4i>(
const Packet4i& a) {
624 Packet4i m = pmin(a, __builtin_msa_shf_w(a, EIGEN_MSA_SHF_I8(2, 3, 0, 1)));
625 m = pmin(m, __builtin_msa_shf_w(m, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
631EIGEN_STRONG_INLINE
float predux_max<Packet4f>(
const Packet4f& a) {
635 Packet4f swapped = (Packet4f)__builtin_msa_shf_w((Packet4i)a, EIGEN_MSA_SHF_I8(2, 3, 0, 1));
639 v16u8 unord = (v16u8)__builtin_msa_fcun_w(a, swapped);
641 unord = (v16u8)__builtin_msa_ceqi_d((v2i64)unord, 0);
644 Packet4f v = __builtin_msa_fmax_w(a, swapped);
645 v = __builtin_msa_fmax_w(v, (Packet4f)__builtin_msa_shf_w((Packet4i)v, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
648 v16u8 qnans = (v16u8)__builtin_msa_fill_w(0x7FC00000);
649 v = (Packet4f)__builtin_msa_bsel_v(unord, qnans, (v16u8)v);
655EIGEN_STRONG_INLINE int32_t predux_max<Packet4i>(
const Packet4i& a) {
658 Packet4i m = pmax(a, __builtin_msa_shf_w(a, EIGEN_MSA_SHF_I8(2, 3, 0, 1)));
659 m = pmax(m, __builtin_msa_shf_w(m, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
663inline std::ostream& operator<<(std::ostream& os,
const PacketBlock<Packet4f, 4>& value) {
664 os <<
"[ " << value.packet[0] <<
"," << std::endl
665 <<
" " << value.packet[1] <<
"," << std::endl
666 <<
" " << value.packet[2] <<
"," << std::endl
667 <<
" " << value.packet[3] <<
" ]";
671EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<Packet4f, 4>& kernel) {
674 v4i32 tmp1, tmp2, tmp3, tmp4;
676 tmp1 = __builtin_msa_ilvr_w((v4i32)kernel.packet[1], (v4i32)kernel.packet[0]);
677 tmp2 = __builtin_msa_ilvr_w((v4i32)kernel.packet[3], (v4i32)kernel.packet[2]);
678 tmp3 = __builtin_msa_ilvl_w((v4i32)kernel.packet[1], (v4i32)kernel.packet[0]);
679 tmp4 = __builtin_msa_ilvl_w((v4i32)kernel.packet[3], (v4i32)kernel.packet[2]);
681 kernel.packet[0] = (Packet4f)__builtin_msa_ilvr_d((v2i64)tmp2, (v2i64)tmp1);
682 kernel.packet[1] = (Packet4f)__builtin_msa_ilvod_d((v2i64)tmp2, (v2i64)tmp1);
683 kernel.packet[2] = (Packet4f)__builtin_msa_ilvr_d((v2i64)tmp4, (v2i64)tmp3);
684 kernel.packet[3] = (Packet4f)__builtin_msa_ilvod_d((v2i64)tmp4, (v2i64)tmp3);
687inline std::ostream& operator<<(std::ostream& os,
const PacketBlock<Packet4i, 4>& value) {
688 os <<
"[ " << value.packet[0] <<
"," << std::endl
689 <<
" " << value.packet[1] <<
"," << std::endl
690 <<
" " << value.packet[2] <<
"," << std::endl
691 <<
" " << value.packet[3] <<
" ]";
695EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<Packet4i, 4>& kernel) {
698 v4i32 tmp1, tmp2, tmp3, tmp4;
700 tmp1 = __builtin_msa_ilvr_w(kernel.packet[1], kernel.packet[0]);
701 tmp2 = __builtin_msa_ilvr_w(kernel.packet[3], kernel.packet[2]);
702 tmp3 = __builtin_msa_ilvl_w(kernel.packet[1], kernel.packet[0]);
703 tmp4 = __builtin_msa_ilvl_w(kernel.packet[3], kernel.packet[2]);
705 kernel.packet[0] = (Packet4i)__builtin_msa_ilvr_d((v2i64)tmp2, (v2i64)tmp1);
706 kernel.packet[1] = (Packet4i)__builtin_msa_ilvod_d((v2i64)tmp2, (v2i64)tmp1);
707 kernel.packet[2] = (Packet4i)__builtin_msa_ilvr_d((v2i64)tmp4, (v2i64)tmp3);
708 kernel.packet[3] = (Packet4i)__builtin_msa_ilvod_d((v2i64)tmp4, (v2i64)tmp3);
712EIGEN_STRONG_INLINE Packet4f psqrt(
const Packet4f& a) {
715 return __builtin_msa_fsqrt_w(a);
719EIGEN_STRONG_INLINE Packet4f prsqrt(
const Packet4f& a) {
723 return __builtin_msa_frsqrt_w(a);
725 Packet4f ones = __builtin_msa_ffint_s_w(__builtin_msa_ldi_w(1));
726 return pdiv(ones, psqrt(a));
731EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(
const Packet4f& a) {
733 int32_t old_mode, new_mode;
735 "cfcmsa %[old_mode], $1\n"
736 "ori %[new_mode], %[old_mode], 3\n"
737 "ctcmsa $1, %[new_mode]\n"
738 "frint.w %w[v], %w[v]\n"
739 "ctcmsa $1, %[old_mode]\n"
741 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
750EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(
const Packet4f& a) {
752 int32_t old_mode, new_mode;
754 "cfcmsa %[old_mode], $1\n"
755 "ori %[new_mode], %[old_mode], 3\n"
756 "xori %[new_mode], %[new_mode], 1\n"
757 "ctcmsa $1, %[new_mode]\n"
758 "frint.w %w[v], %w[v]\n"
759 "ctcmsa $1, %[old_mode]\n"
761 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
770EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(
const Packet4f& a) {
772 int32_t old_mode, new_mode;
774 "cfcmsa %[old_mode], $1\n"
775 "ori %[new_mode], %[old_mode], 3\n"
776 "xori %[new_mode], %[new_mode], 3\n"
777 "ctcmsa $1, %[new_mode]\n"
778 "frint.w %w[v], %w[v]\n"
779 "ctcmsa $1, %[old_mode]\n"
781 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
790EIGEN_STRONG_INLINE Packet4f print<Packet4f>(
const Packet4f& a) {
793 asm volatile(
"frint.w %w[v], %w[v]\n" : [v]
"+f"(v));
798EIGEN_STRONG_INLINE Packet4f ptrunc<Packet4f>(
const Packet4f& a) {
800 int32_t old_mode, new_mode;
802 "cfcmsa %[old_mode], $1\n"
803 "ori %[new_mode], %[old_mode], 3\n"
804 "xori %[new_mode], %[new_mode], 2\n"
805 "ctcmsa $1, %[new_mode]\n"
806 "frint.w %w[v], %w[v]\n"
807 "ctcmsa $1, %[old_mode]\n"
809 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
818EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan<Packet4f>(
const Packet4f& a,
const Packet4f& b) {
819 return (Packet4f)__builtin_msa_fcult_w(a, b);
824typedef v2f64 Packet2d;
825typedef v2i64 Packet2l;
826typedef v2u64 Packet2ul;
828#define EIGEN_DECLARE_CONST_Packet2d(NAME, X) const Packet2d p2d_##NAME = {X, X}
829#define EIGEN_DECLARE_CONST_Packet2l(NAME, X) const Packet2l p2l_##NAME = {X, X}
830#define EIGEN_DECLARE_CONST_Packet2ul(NAME, X) const Packet2ul p2ul_##NAME = {X, X}
832inline std::ostream& operator<<(std::ostream& os,
const Packet2d& value) {
833 os <<
"[ " << value[0] <<
", " << value[1] <<
" ]";
837inline std::ostream& operator<<(std::ostream& os,
const Packet2l& value) {
838 os <<
"[ " << value[0] <<
", " << value[1] <<
" ]";
842inline std::ostream& operator<<(std::ostream& os,
const Packet2ul& value) {
843 os <<
"[ " << value[0] <<
", " << value[1] <<
" ]";
848struct packet_traits<double> : default_packet_traits {
849 typedef Packet2d type;
850 typedef Packet2d half;
864struct unpacket_traits<Packet2d> {
870 masked_load_available =
false,
871 masked_store_available =
false
873 typedef Packet2d half;
877EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(
const double& from) {
880 Packet2d value = {from, from};
885EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
888 return __builtin_msa_fadd_d(a, b);
892EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(
const double& a) {
895 static const Packet2d countdown = {0.0, 1.0};
896 return padd(pset1<Packet2d>(a), countdown);
900EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
903 return __builtin_msa_fsub_d(a, b);
907EIGEN_STRONG_INLINE Packet2d pnegate(
const Packet2d& a) {
910 return (Packet2d)__builtin_msa_bnegi_d((v2u64)a, 63);
914EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
917 return __builtin_msa_fmul_d(a, b);
921EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
924 return __builtin_msa_fdiv_d(a, b);
928EIGEN_STRONG_INLINE Packet2d pmadd(
const Packet2d& a,
const Packet2d& b,
const Packet2d& c) {
931 return __builtin_msa_fmadd_d(c, a, b);
937EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
940 return (Packet2d)__builtin_msa_and_v((v16u8)a, (v16u8)b);
944EIGEN_STRONG_INLINE Packet2d por<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
947 return (Packet2d)__builtin_msa_or_v((v16u8)a, (v16u8)b);
951EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
954 return (Packet2d)__builtin_msa_xor_v((v16u8)a, (v16u8)b);
958EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
961 return pand(a, (Packet2d)__builtin_msa_xori_b((v16u8)b, 255));
965EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(
const double* from) {
968 EIGEN_DEBUG_UNALIGNED_LOAD
return (Packet2d)__builtin_msa_ld_d(
const_cast<double*
>(from), 0);
972EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
977 return __builtin_msa_fmin_d(a, b);
980 v2i64 aNaN = __builtin_msa_fcun_d(a, a);
981 v2i64 aMinOrNaN = por(__builtin_msa_fclt_d(a, b), aNaN);
982 return (Packet2d)__builtin_msa_bsel_v((v16u8)aMinOrNaN, (v16u8)b, (v16u8)a);
987EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
992 return __builtin_msa_fmax_d(a, b);
995 v2i64 aNaN = __builtin_msa_fcun_d(a, a);
996 v2i64 aMaxOrNaN = por(__builtin_msa_fclt_d(b, a), aNaN);
997 return (Packet2d)__builtin_msa_bsel_v((v16u8)aMaxOrNaN, (v16u8)b, (v16u8)a);
1002EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(
const double* from) {
1005 EIGEN_DEBUG_UNALIGNED_LOAD
return (Packet2d)__builtin_msa_ld_d(
const_cast<double*
>(from), 0);
1009EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(
const double* from) {
1012 Packet2d value = {*from, *from};
1017EIGEN_STRONG_INLINE
void pstore<double>(
double* to,
const Packet2d& from) {
1020 EIGEN_DEBUG_ALIGNED_STORE __builtin_msa_st_d((v2i64)from, to, 0);
1024EIGEN_STRONG_INLINE
void pstoreu<double>(
double* to,
const Packet2d& from) {
1027 EIGEN_DEBUG_UNALIGNED_STORE __builtin_msa_st_d((v2i64)from, to, 0);
1031EIGEN_DEVICE_FUNC
inline Packet2d pgather<double, Packet2d>(
const double* from, Index stride) {
1042EIGEN_DEVICE_FUNC
inline void pscatter<double, Packet2d>(
double* to,
const Packet2d& from, Index stride) {
1051EIGEN_STRONG_INLINE
void prefetch<double>(
const double* addr) {
1054 __builtin_prefetch(addr);
1058EIGEN_STRONG_INLINE
double pfirst<Packet2d>(
const Packet2d& a) {
1065EIGEN_STRONG_INLINE Packet2d preverse(
const Packet2d& a) {
1068 return (Packet2d)__builtin_msa_shf_w((v4i32)a, EIGEN_MSA_SHF_I8(2, 3, 0, 1));
1072EIGEN_STRONG_INLINE Packet2d pabs(
const Packet2d& a) {
1075 return (Packet2d)__builtin_msa_bclri_d((v2u64)a, 63);
1079EIGEN_STRONG_INLINE
double predux<Packet2d>(
const Packet2d& a) {
1082 Packet2d s = padd(a, preverse(a));
1087EIGEN_STRONG_INLINE
bool predux_any(
const Packet2d& a) {
1088 return __builtin_msa_bnz_v((v16u8)a);
1094EIGEN_STRONG_INLINE
double predux_mul<Packet2d>(
const Packet2d& a) {
1097 Packet2d p = pmul(a, preverse(a));
1103EIGEN_STRONG_INLINE
double predux_min<Packet2d>(
const Packet2d& a) {
1107 Packet2d swapped = (Packet2d)__builtin_msa_shf_w((Packet4i)a, EIGEN_MSA_SHF_I8(2, 3, 0, 1));
1108 Packet2d v = __builtin_msa_fmin_d(a, swapped);
1111 double a0 = a[0], a1 = a[1];
1112 return ((numext::isnan)(a0) || a0 < a1) ? a0 : a1;
1118EIGEN_STRONG_INLINE
double predux_max<Packet2d>(
const Packet2d& a) {
1122 Packet2d swapped = (Packet2d)__builtin_msa_shf_w((Packet4i)a, EIGEN_MSA_SHF_I8(2, 3, 0, 1));
1123 Packet2d v = __builtin_msa_fmax_d(a, swapped);
1126 double a0 = a[0], a1 = a[1];
1127 return ((numext::isnan)(a0) || a0 > a1) ? a0 : a1;
1132EIGEN_STRONG_INLINE Packet2d psqrt(
const Packet2d& a) {
1135 return __builtin_msa_fsqrt_d(a);
1139EIGEN_STRONG_INLINE Packet2d prsqrt(
const Packet2d& a) {
1143 return __builtin_msa_frsqrt_d(a);
1145 Packet2d ones = __builtin_msa_ffint_s_d(__builtin_msa_ldi_d(1));
1146 return pdiv(ones, psqrt(a));
1150inline std::ostream& operator<<(std::ostream& os,
const PacketBlock<Packet2d, 2>& value) {
1151 os <<
"[ " << value.packet[0] <<
"," << std::endl <<
" " << value.packet[1] <<
" ]";
1155EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<Packet2d, 2>& kernel) {
1158 Packet2d trn1 = (Packet2d)__builtin_msa_ilvev_d((v2i64)kernel.packet[1], (v2i64)kernel.packet[0]);
1159 Packet2d trn2 = (Packet2d)__builtin_msa_ilvod_d((v2i64)kernel.packet[1], (v2i64)kernel.packet[0]);
1160 kernel.packet[0] = trn1;
1161 kernel.packet[1] = trn2;
1165EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(
const Packet2d& a) {
1167 int32_t old_mode, new_mode;
1169 "cfcmsa %[old_mode], $1\n"
1170 "ori %[new_mode], %[old_mode], 3\n"
1171 "ctcmsa $1, %[new_mode]\n"
1172 "frint.d %w[v], %w[v]\n"
1173 "ctcmsa $1, %[old_mode]\n"
1175 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
1184EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(
const Packet2d& a) {
1186 int32_t old_mode, new_mode;
1188 "cfcmsa %[old_mode], $1\n"
1189 "ori %[new_mode], %[old_mode], 3\n"
1190 "xori %[new_mode], %[new_mode], 1\n"
1191 "ctcmsa $1, %[new_mode]\n"
1192 "frint.d %w[v], %w[v]\n"
1193 "ctcmsa $1, %[old_mode]\n"
1195 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
1204EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(
const Packet2d& a) {
1206 int32_t old_mode, new_mode;
1208 "cfcmsa %[old_mode], $1\n"
1209 "ori %[new_mode], %[old_mode], 3\n"
1210 "xori %[new_mode], %[new_mode], 3\n"
1211 "ctcmsa $1, %[new_mode]\n"
1212 "frint.d %w[v], %w[v]\n"
1213 "ctcmsa $1, %[old_mode]\n"
1215 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
1224EIGEN_STRONG_INLINE Packet2d print<Packet2d>(
const Packet2d& a) {
1227 asm volatile(
"frint.d %w[v], %w[v]\n" : [v]
"+f"(v));
1232EIGEN_STRONG_INLINE Packet2d ptrunc<Packet2d>(
const Packet2d& a) {
1234 int32_t old_mode, new_mode;
1236 "cfcmsa %[old_mode], $1\n"
1237 "ori %[new_mode], %[old_mode], 3\n"
1238 "xori %[new_mode], %[new_mode], 2\n"
1239 "ctcmsa $1, %[new_mode]\n"
1240 "frint.d %w[v], %w[v]\n"
1241 "ctcmsa $1, %[old_mode]\n"
1243 [old_mode]
"=r"(old_mode), [new_mode]
"=r"(new_mode),
1252EIGEN_STRONG_INLINE Packet2d pcmp_lt_or_nan<Packet2d>(
const Packet2d& a,
const Packet2d& b) {
1253 return (Packet2d)__builtin_msa_fcult_d(a, b);
@ Aligned16
Definition Constants.h:238