Program Listing for File vecOps.hpp#
↰ Return to documentation for file (librapid/include/librapid/simd/vecOps.hpp)
#ifndef LIBRAPID_SIMD_TRIGONOMETRY
#define LIBRAPID_SIMD_TRIGONOMETRY
namespace librapid {
namespace typetraits {
template<typename T>
struct IsSIMD : std::false_type {};
template<typename T, typename U>
struct IsSIMD<xsimd::batch<T, U>> : std::true_type {};
template<typename T>
struct IsSIMD<xsimd::batch_element_reference<T>> : std::true_type {};
} // namespace typetraits
#define REQUIRE_SIMD(TYPE) typename std::enable_if_t<typetraits::IsSIMD<TYPE>::value, int> = 0
#define IF_FLOATING(TYPE) if constexpr (std::is_floating_point_v<typename TYPE::value_type>)
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto sin(const T &x) {
return xsimd::sin(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto cos(const T &x) {
return xsimd::cos(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto tan(const T &x) {
return xsimd::tan(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto asin(const T &x) {
return xsimd::asin(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto acos(const T &x) {
return xsimd::acos(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto atan(const T &x) {
return xsimd::atan(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto sinh(const T &x) {
return xsimd::sinh(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto cosh(const T &x) {
return xsimd::cosh(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto tanh(const T &x) {
return xsimd::tanh(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto exp(const T &x) {
return xsimd::exp(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto log(const T &x) {
return xsimd::log(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto log2(const T &x) {
return xsimd::log2(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto log10(const T &x) {
return xsimd::log10(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto sqrt(const T &x) {
return xsimd::sqrt(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto cbrt(const T &x) {
return xsimd::cbrt(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto abs(const T &x) {
return xsimd::abs(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto floor(const T &x) {
return xsimd::floor(x);
}
template<typename T, REQUIRE_SIMD(T)>
LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE auto ceil(const T &x) {
return xsimd::ceil(x);
}
} // namespace librapid
#endif // LIBRAPID_SIMD_TRIGONOMETRY