Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions inc/zoo/swar/associative_iteration.h
Original file line number Diff line number Diff line change
Expand Up @@ -479,15 +479,16 @@ template <int NB, typename T> struct MultiplicationResult {
};

template <int NB, typename T>
constexpr auto
doublingMultiplication(SWAR<NB, T> multiplicand, SWAR<NB, T> multiplier) {
using S = SWAR<NB, T>; using D = SWAR<NB * 2, T>;
auto [l_even, l_odd] = doublePrecision(multiplicand);
auto [r_even, r_odd] = doublePrecision(multiplier);
constexpr
auto
doublePrecisionMultiplication(SWAR<NB, T> multiplicand, SWAR<NB, T> multiplier) {
auto
icand = doublePrecision(multiplicand),
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! never thought about omitting the prefix

plier = doublePrecision(multiplier);
auto
res_even = multiplication_OverflowUnsafe(l_even, r_even),
res_odd = multiplication_OverflowUnsafe(l_odd, r_odd);
return SWAR_Pair<NB * 2, T>{res_even, res_odd};
lower = multiplication_OverflowUnsafe(icand.even, plier.even),
upper = multiplication_OverflowUnsafe(icand.odd, plier.odd);
return SWAR_Pair<NB * 2, T>{lower, upper};
}

template <int NB, typename T>
Expand All @@ -497,7 +498,7 @@ wideningMultiplication(SWAR<NB, T> multiplicand, SWAR<NB, T> multiplier) {
constexpr auto
HalfLane = S::NBits,
UpperHalfOfLanes = SWAR<S::NBits, T>::oddLaneMask().value();
auto [lower, upper] = doublingMultiplication(multiplicand, multiplier);
auto [lower, upper] = doublePrecisionMultiplication(multiplicand, multiplier);
auto result = halvePrecision(lower, upper);
auto
over_even = D{(lower.value() & UpperHalfOfLanes) >> HalfLane},
Expand Down
Loading