mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-13 09:53:13 +08:00
Optimize psign
This commit is contained in:
parent
0e490d452d
commit
325e3063d9
@ -1097,31 +1097,23 @@ Packet psqrt_complex(const Packet& a) {
|
||||
|
||||
|
||||
template <typename Packet>
|
||||
struct psign_impl<
|
||||
Packet,
|
||||
std::enable_if_t<
|
||||
!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
||||
struct psign_impl<Packet, std::enable_if_t<!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
||||
!NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>> {
|
||||
static EIGEN_DEVICE_FUNC inline Packet run(const Packet& a) {
|
||||
using Scalar = typename unpacket_traits<Packet>::type;
|
||||
const Packet cst_one = pset1<Packet>(Scalar(1));
|
||||
const Packet cst_minus_one = pset1<Packet>(Scalar(-1));
|
||||
const Packet cst_zero = pzero(a);
|
||||
|
||||
const Packet not_nan_mask = pcmp_eq(a, a);
|
||||
const Packet positive_mask = pcmp_lt(cst_zero, a);
|
||||
const Packet positive = pand(positive_mask, cst_one);
|
||||
const Packet negative_mask = pcmp_lt(a, cst_zero);
|
||||
const Packet negative = pand(negative_mask, cst_minus_one);
|
||||
const Packet abs_a = pabs(a);
|
||||
const Packet sign_mask = pandnot(a, abs_a);
|
||||
const Packet nonzero_mask = pcmp_lt(cst_zero, abs_a);
|
||||
|
||||
return pselect(not_nan_mask, por(positive, negative), a);
|
||||
return pselect(nonzero_mask, por(sign_mask, cst_one), abs_a);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Packet>
|
||||
struct psign_impl<
|
||||
Packet, std::enable_if_t<
|
||||
!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
||||
struct psign_impl<Packet, std::enable_if_t<!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
||||
NumTraits<typename unpacket_traits<Packet>::type>::IsSigned &&
|
||||
NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>> {
|
||||
static EIGEN_DEVICE_FUNC inline Packet run(const Packet& a) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user