@@ -86,7 +86,7 @@ BOOST_DECIMAL_EXPORT class decimal128_fast final
8686 template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetType, BOOST_DECIMAL_DECIMAL_FLOATING_TYPE Decimal>
8787 friend constexpr auto to_decimal (Decimal val) noexcept -> TargetType;
8888
89- friend constexpr auto d128f_div_impl (decimal128_fast lhs, decimal128_fast rhs, decimal128_fast& q, decimal128_fast& r) noexcept -> void;
89+ friend constexpr auto d128f_div_impl (const decimal128_fast& lhs, const decimal128_fast& rhs, decimal128_fast& q, decimal128_fast& r) noexcept -> void;
9090
9191 // Equality template between any integer type and decimal128
9292 template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE Decimal, BOOST_DECIMAL_INTEGRAL Integer>
@@ -242,11 +242,11 @@ BOOST_DECIMAL_EXPORT class decimal128_fast final
242242 friend constexpr auto operator -(decimal128_fast rhs) noexcept -> decimal128_fast;
243243
244244 // Binary arithmetic operators
245- friend constexpr auto operator +(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast;
246- friend constexpr auto operator -(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast;
247- friend constexpr auto operator *(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast;
248- friend constexpr auto operator /(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast;
249- friend constexpr auto operator %(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast;
245+ friend constexpr auto operator +(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast;
246+ friend constexpr auto operator -(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast;
247+ friend constexpr auto operator *(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast;
248+ friend constexpr auto operator /(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast;
249+ friend constexpr auto operator %(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast;
250250
251251 // Mixed type binary arithmetic operators
252252 template <typename Integer>
@@ -355,13 +355,13 @@ BOOST_DECIMAL_EXPORT class decimal128_fast final
355355
356356 // Decimal functions
357357 // 3.6.4 Same Quantum
358- friend constexpr auto samequantumd128f (decimal128_fast lhs, decimal128_fast rhs) noexcept -> bool;
358+ friend constexpr auto samequantumd128f (const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> bool;
359359
360360 // 3.6.5 Quantum exponent
361361 friend constexpr auto quantexpd128f (decimal128_fast x) noexcept -> int;
362362
363363 // 3.6.6 Quantize
364- friend constexpr auto quantized128f (decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast;
364+ friend constexpr auto quantized128f (const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast;
365365};
366366
367367#ifdef BOOST_DECIMAL_HAS_CONCEPTS
@@ -526,7 +526,7 @@ constexpr auto isfinite(decimal128_fast val) noexcept -> bool
526526 #endif
527527}
528528
529- constexpr auto not_finite (const decimal128_fast& val) noexcept -> bool
529+ BOOST_DECIMAL_FORCE_INLINE constexpr auto not_finite (const decimal128_fast& val) noexcept -> bool
530530{
531531 #ifndef BOOST_DECIMAL_FAST_MATH
532532 return val.significand_ .high >= detail::d128_fast_inf_high_bits;
@@ -772,7 +772,7 @@ constexpr auto operator-(decimal128_fast rhs) noexcept -> decimal128_fast
772772 return rhs;
773773}
774774
775- constexpr auto operator +(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast
775+ constexpr auto operator +(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast
776776{
777777 #ifndef BOOST_DECIMAL_FAST_MATH
778778 if (not_finite (lhs) || not_finite (rhs))
@@ -818,7 +818,7 @@ constexpr auto operator+(Integer lhs, decimal128_fast rhs) noexcept
818818 return rhs + lhs;
819819}
820820
821- constexpr auto operator -(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast
821+ constexpr auto operator -(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast
822822{
823823 #ifndef BOOST_DECIMAL_FAST_MATH
824824 if (not_finite (lhs) || not_finite (rhs))
@@ -883,7 +883,7 @@ constexpr auto operator-(Integer lhs, decimal128_fast rhs) noexcept
883883 abs_lhs_bigger);
884884}
885885
886- constexpr auto operator *(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast
886+ constexpr auto operator *(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast
887887{
888888 #ifndef BOOST_DECIMAL_FAST_MATH
889889 if (not_finite (lhs) || not_finite (rhs))
@@ -892,21 +892,8 @@ constexpr auto operator*(decimal128_fast lhs, decimal128_fast rhs) noexcept -> d
892892 }
893893 #endif
894894
895- auto lhs_sig {lhs.full_significand ()};
896- auto lhs_exp {lhs.biased_exponent ()};
897- const auto lhs_zeros {detail::remove_trailing_zeros (lhs_sig)};
898- lhs_sig = lhs_zeros.trimmed_number ;
899- lhs_exp += static_cast <std::int32_t >(lhs_zeros.number_of_removed_zeros );
900-
901- auto rhs_sig {rhs.full_significand ()};
902- auto rhs_exp {rhs.biased_exponent ()};
903- const auto rhs_zeros {detail::remove_trailing_zeros (rhs_sig)};
904- rhs_sig = rhs_zeros.trimmed_number ;
905- rhs_exp += static_cast <std::int32_t >(rhs_zeros.number_of_removed_zeros );
906-
907- return detail::d128_mul_impl<decimal128_fast>(
908- lhs_sig, lhs_exp, lhs.sign_ ,
909- rhs_sig, rhs_exp, rhs.sign_ );
895+ return detail::d128_mul_impl<decimal128_fast>(lhs.significand_ , lhs.biased_exponent (), lhs.sign_ ,
896+ rhs.significand_ , rhs.biased_exponent (), rhs.sign_ );
910897}
911898
912899template <typename Integer>
@@ -938,7 +925,7 @@ constexpr auto operator*(Integer lhs, decimal128_fast rhs) noexcept
938925 return rhs * lhs;
939926}
940927
941- constexpr auto d128f_div_impl (decimal128_fast lhs, decimal128_fast rhs, decimal128_fast& q, decimal128_fast& r) noexcept -> void
928+ constexpr auto d128f_div_impl (const decimal128_fast& lhs, const decimal128_fast& rhs, decimal128_fast& q, decimal128_fast& r) noexcept -> void
942929{
943930 #ifndef BOOST_DECIMAL_FAST_MATH
944931 // Check pre-conditions
@@ -1005,15 +992,15 @@ constexpr auto d128f_div_impl(decimal128_fast lhs, decimal128_fast rhs, decimal1
1005992 q = decimal128_fast (q_components.sig , q_components.exp , q_components.sign );
1006993}
1007994
1008- constexpr auto d128f_mod_impl (decimal128_fast lhs, decimal128_fast rhs, const decimal128_fast& q, decimal128_fast& r) -> void
995+ constexpr auto d128f_mod_impl (const decimal128_fast& lhs, const decimal128_fast& rhs, const decimal128_fast& q, decimal128_fast& r) -> void
1009996{
1010997 constexpr decimal128_fast zero {0 , 0 };
1011998
1012999 auto q_trunc {q > zero ? floor (q) : ceil (q)};
10131000 r = lhs - (decimal128_fast (q_trunc) * rhs);
10141001};
10151002
1016- constexpr auto operator /(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast
1003+ constexpr auto operator /(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast
10171004{
10181005 decimal128_fast q {};
10191006 decimal128_fast r {};
@@ -1104,7 +1091,7 @@ constexpr auto operator/(Integer lhs, decimal128_fast rhs) noexcept
11041091 return {q_components.sig , q_components.exp , q_components.sign };
11051092}
11061093
1107- constexpr auto operator %(decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast
1094+ constexpr auto operator %(const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast
11081095{
11091096 decimal128_fast q {};
11101097 decimal128_fast r {};
@@ -1318,7 +1305,7 @@ constexpr auto scalbnd128f(decimal128_fast num, int exp) noexcept -> decimal128_
13181305// If both x and y are NaN, or infinity, they have the same quantum exponents;
13191306// if exactly one operand is infinity or exactly one operand is NaN, they do not have the same quantum exponents.
13201307// The samequantum functions raise no exception.
1321- constexpr auto samequantumd128f (decimal128_fast lhs, decimal128_fast rhs) noexcept -> bool
1308+ constexpr auto samequantumd128f (const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> bool
13221309{
13231310 #ifndef BOOST_DECIMAL_FAST_MATH
13241311 const auto lhs_fp {fpclassify (lhs)};
@@ -1363,7 +1350,7 @@ constexpr auto quantexpd128f(decimal128_fast x) noexcept -> int
13631350// Otherwise, if only one operand is infinity, the "invalid" floating-point exception is raised and the result is NaN.
13641351// If both operands are infinity, the result is DEC_INFINITY, with the same sign as x, converted to the type of x.
13651352// The quantize functions do not signal underflow.
1366- constexpr auto quantized128f (decimal128_fast lhs, decimal128_fast rhs) noexcept -> decimal128_fast
1353+ constexpr auto quantized128f (const decimal128_fast& lhs, const decimal128_fast& rhs) noexcept -> decimal128_fast
13671354{
13681355 #ifndef BOOST_DECIMAL_FAST_MATH
13691356 // Return the correct type of nan
0 commit comments