Skip to content

Commit

Permalink
Merge pull request #2446 from johnplatts:hwy_reduce_enh_011725
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 718362378
  • Loading branch information
copybara-github committed Jan 22, 2025
2 parents 21a6bb0 + aec1978 commit b5dd1c4
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 22 deletions.
39 changes: 39 additions & 0 deletions hwy/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -2420,6 +2420,45 @@ constexpr MakeSigned<T> MaxExponentField() {
return (MakeSigned<T>{1} << ExponentBits<T>()) - 1;
}

namespace detail {

template <typename T>
static HWY_INLINE HWY_MAYBE_UNUSED HWY_BITCASTSCALAR_CONSTEXPR T
NegativeInfOrLowestValue(hwy::FloatTag /* tag */) {
return BitCastScalar<T>(
static_cast<MakeUnsigned<T>>(SignMask<T>() | ExponentMask<T>()));
}

template <typename T>
static HWY_INLINE HWY_MAYBE_UNUSED HWY_BITCASTSCALAR_CONSTEXPR T
NegativeInfOrLowestValue(hwy::NonFloatTag /* tag */) {
return LowestValue<T>();
}

template <typename T>
static HWY_INLINE HWY_MAYBE_UNUSED HWY_BITCASTSCALAR_CONSTEXPR T
PositiveInfOrHighestValue(hwy::FloatTag /* tag */) {
return BitCastScalar<T>(ExponentMask<T>());
}

template <typename T>
static HWY_INLINE HWY_MAYBE_UNUSED HWY_BITCASTSCALAR_CONSTEXPR T
PositiveInfOrHighestValue(hwy::NonFloatTag /* tag */) {
return HighestValue<T>();
}

} // namespace detail

template <typename T>
HWY_API HWY_BITCASTSCALAR_CONSTEXPR T NegativeInfOrLowestValue() {
return detail::NegativeInfOrLowestValue<T>(IsFloatTag<T>());
}

template <typename T>
HWY_API HWY_BITCASTSCALAR_CONSTEXPR T PositiveInfOrHighestValue() {
return detail::PositiveInfOrHighestValue<T>(IsFloatTag<T>());
}

//------------------------------------------------------------------------------
// Additional F16/BF16 operators

Expand Down
16 changes: 16 additions & 0 deletions hwy/base_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,22 @@ struct TestLowestHighest {
if (!IsSpecialFloat<T>()) {
HWY_ASSERT_EQ(std::numeric_limits<T>::lowest(), LowestValue<T>());
HWY_ASSERT_EQ(std::numeric_limits<T>::max(), HighestValue<T>());

if (IsFloat<T>()) {
HWY_ASSERT(ScalarSignBit(NegativeInfOrLowestValue<T>()));
HWY_ASSERT(!ScalarIsFinite(NegativeInfOrLowestValue<T>()));
HWY_ASSERT(!ScalarSignBit(PositiveInfOrHighestValue<T>()));
HWY_ASSERT(!ScalarIsFinite(PositiveInfOrHighestValue<T>()));
HWY_ASSERT(NegativeInfOrLowestValue<T>() <
std::numeric_limits<T>::lowest());
HWY_ASSERT(PositiveInfOrHighestValue<T>() >
std::numeric_limits<T>::max());
} else {
HWY_ASSERT_EQ(std::numeric_limits<T>::lowest(),
NegativeInfOrLowestValue<T>());
HWY_ASSERT_EQ(std::numeric_limits<T>::max(),
PositiveInfOrHighestValue<T>());
}
}
}
};
Expand Down
24 changes: 2 additions & 22 deletions hwy/ops/emu128-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -2917,37 +2917,17 @@ HWY_API T ReduceSum(D d, VFromD<D> v) {
return sum;
}

namespace detail {
template <class D, typename T = TFromD<D>, HWY_IF_FLOAT_OR_SPECIAL(T)>
T InitReduceMin(D d) {
return GetLane(Inf(d));
}
template <class D, typename T = TFromD<D>, HWY_IF_NOT_FLOAT_NOR_SPECIAL(T)>
T InitReduceMin(D) {
return HighestValue<T>();
}

template <class D, typename T = TFromD<D>, HWY_IF_FLOAT_OR_SPECIAL(T)>
T InitReduceMax(D d) {
return -GetLane(Inf(d));
}
template <class D, typename T = TFromD<D>, HWY_IF_NOT_FLOAT_NOR_SPECIAL(T)>
T InitReduceMax(D) {
return LowestValue<T>();
}
} // namespace detail

template <class D, typename T = TFromD<D>, HWY_IF_REDUCE_D(D)>
HWY_API T ReduceMin(D d, VFromD<D> v) {
T min = detail::InitReduceMin(d);
T min = PositiveInfOrHighestValue<T>();
for (size_t i = 0; i < MaxLanes(d); ++i) {
min = HWY_MIN(min, v.raw[i]);
}
return min;
}
template <class D, typename T = TFromD<D>, HWY_IF_REDUCE_D(D)>
HWY_API T ReduceMax(D d, VFromD<D> v) {
T max = detail::InitReduceMax(d);
T max = NegativeInfOrLowestValue<T>();
for (size_t i = 0; i < MaxLanes(d); ++i) {
max = HWY_MAX(max, v.raw[i]);
}
Expand Down

0 comments on commit b5dd1c4

Please sign in to comment.