| #ifndef EIGEN_HVX_GENERAL_BLOCK_KERNEL_H | |
| #define EIGEN_HVX_GENERAL_BLOCK_KERNEL_H | |
| // Only support 128B HVX now. | |
| // Floating-point operations are only supported since V68. | |
| #if defined __HVX__ && (__HVX_LENGTH__ == 128) && __HVX_ARCH__ >= 68 | |
| namespace Eigen { | |
| namespace internal { | |
| template <bool ConjLhs_, bool ConjRhs_, int PacketSize_> | |
| class gebp_traits<float, float, ConjLhs_, ConjRhs_, Architecture::Target, PacketSize_> | |
| : public gebp_traits<float, float, ConjLhs_, ConjRhs_, Architecture::Generic, PacketSize_> { | |
| public: | |
| typedef Packet32qf AccPacket; | |
| EIGEN_STRONG_INLINE void initAcc(Packet32qf& p) { p = pzero<Packet32qf>(p); } | |
| template <typename LaneIdType> | |
| EIGEN_STRONG_INLINE void madd(const Packet32f& a, const Packet32f& b, Packet32qf& c, Packet32f& /*tmp*/, | |
| const LaneIdType&) const { | |
| c = pmadd_f32_to_qf32(a, b, c); | |
| } | |
| template <typename LaneIdType> | |
| EIGEN_STRONG_INLINE void madd(const Packet32f& a, const QuadPacket<Packet32f>& b, Packet32qf& c, Packet32f& tmp, | |
| const LaneIdType& lane) const { | |
| madd(a, b.get(lane), c, tmp, lane); | |
| } | |
| EIGEN_STRONG_INLINE void acc(const Packet32qf& c, const Packet32f& alpha, Packet32f& r) const { | |
| r = pmadd_qf32_to_f32(c, alpha, r); | |
| } | |
| }; | |
| } // end namespace internal | |
| } // end namespace Eigen | |
| #endif // __HVX__ && (__HVX_LENGTH__ == 128) && __HVX_ARCH__ >= 68 | |
| #endif // EIGEN_HVX_GENERAL_BLOCK_KERNEL_H |