| // This file is part of Eigen, a lightweight C++ template library |
| // for linear algebra. |
| // |
| // 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_NEON_UNARY_FUNCTORS_H |
| #define EIGEN_NEON_UNARY_FUNCTORS_H |
| |
| // IWYU pragma: private |
| #include "../../InternalHeaderCheck.h" |
| |
| namespace Eigen { |
| |
| namespace internal { |
| |
| #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC |
| /** \internal |
| * \brief Template specialization of the logistic function for Eigen::half. |
| */ |
| template <> |
| struct scalar_logistic_op<Eigen::half> { |
| EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half operator()(const Eigen::half& x) const { |
| // Convert to float and call scalar_logistic_op<float>. |
| const scalar_logistic_op<float> float_op; |
| return Eigen::half(float_op(float(x))); |
| } |
| |
| EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half packetOp(const Eigen::half& x) const { return this->operator()(x); } |
| |
| EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf packetOp(const Packet4hf& x) const { |
| const scalar_logistic_op<float> float_op; |
| return vcvt_f16_f32(float_op.packetOp(vcvt_f32_f16(x))); |
| } |
| |
| EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf packetOp(const Packet8hf& x) const { |
| const scalar_logistic_op<float> float_op; |
| return vcombine_f16(vcvt_f16_f32(float_op.packetOp(vcvt_f32_f16(vget_low_f16(x)))), |
| vcvt_f16_f32(float_op.packetOp(vcvt_high_f32_f16(x)))); |
| } |
| }; |
| |
| template <> |
| struct functor_traits<scalar_logistic_op<Eigen::half>> { |
| enum { |
| Cost = functor_traits<scalar_logistic_op<float>>::Cost, |
| PacketAccess = functor_traits<scalar_logistic_op<float>>::PacketAccess, |
| }; |
| }; |
| #endif // EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC |
| |
| } // end namespace internal |
| |
| } // end namespace Eigen |
| |
| #endif // EIGEN_NEON_UNARY_FUNCTORS_H |