Integrate Refactor solver sources and dual MSVC CMake builds
This commit is contained in:
@@ -144,11 +144,11 @@ bool TwoSum(__m256d left, __m256d right, VectorPair* output) {
|
||||
return true;
|
||||
}
|
||||
/// @brief Routes exceptional packets to baseline checked Add in lane order.
|
||||
VectorPair ScalarAdd(VectorPair left, VectorPair right, bool pair_shortcuts) {
|
||||
VectorPair ScalarAdd(VectorPair left, VectorPair right) {
|
||||
const auto a = Store(left);
|
||||
const auto b = Store(right);
|
||||
PairPacket result;
|
||||
ScalarPacketAdd(a, b, pair_shortcuts, &result);
|
||||
ScalarPacketAdd(a, b, &result);
|
||||
return Load(result);
|
||||
}
|
||||
/// @brief Routes exceptional packets to baseline checked MultiplyPair.
|
||||
@@ -160,7 +160,7 @@ VectorPair ScalarMultiply(const PairPacket& left, const PairPacket& right) {
|
||||
/// @brief Retains normalized/zero branches and the checked per-lane Add graph.
|
||||
VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) {
|
||||
if (!NormalizedInputs(left, right))
|
||||
return ScalarAdd(left, right, pair_shortcuts);
|
||||
return ScalarAdd(left, right);
|
||||
const int left_zero = _mm256_movemask_pd(
|
||||
_mm256_and_pd(Zero(left.high), Zero(left.low)));
|
||||
const int right_zero = _mm256_movemask_pd(
|
||||
@@ -171,7 +171,7 @@ VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) {
|
||||
if (right_zero == 15)
|
||||
return {left.high, Select(Zero(left.low), _mm256_setzero_pd(), left.low)};
|
||||
if (left_zero != 0 || right_zero != 0)
|
||||
return ScalarAdd(left, right, true);
|
||||
return ScalarAdd(left, right);
|
||||
}
|
||||
VectorPair head;
|
||||
VectorPair tail;
|
||||
@@ -181,7 +181,7 @@ VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) {
|
||||
!TwoSum(left.low, right.low, &tail) ||
|
||||
!TwoSum(head.low, tail.high, &middle) ||
|
||||
!TwoSum(head.high, middle.high, &joined))
|
||||
return ScalarAdd(left, right, pair_shortcuts);
|
||||
return ScalarAdd(left, right);
|
||||
const auto remainder = _mm256_add_pd(
|
||||
_mm256_add_pd(joined.low, middle.low), tail.low);
|
||||
const auto valid = _mm256_and_pd(Finite(remainder), _mm256_and_pd(
|
||||
@@ -193,7 +193,7 @@ VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) {
|
||||
VectorPair result;
|
||||
if (!TwoSum(Select(valid, joined.high, _mm256_setzero_pd()),
|
||||
Select(valid, remainder, _mm256_setzero_pd()), &result))
|
||||
return ScalarAdd(left, right, pair_shortcuts);
|
||||
return ScalarAdd(left, right);
|
||||
return InvalidOutside(result, valid);
|
||||
}
|
||||
/// @brief Checks finite/zero/tail premises before products; neutralizes rejected
|
||||
|
||||
Reference in New Issue
Block a user