fixed

Pure Haskell large fixed-width integers.
git clone git://git.ppad.tech/fixed.git
Log | Files | Refs | README | LICENSE

commit 1dc440f55569398fb62484ddb85475e129dbcb4b
parent 11c1d6b5aff2a5cf8dbcca6cbc1478db6528da41
Author: Jared Tobin <jared@jtobin.io>
Date:   Sat, 15 Nov 2025 07:22:50 +0400

lib: optimize mul_add_c#

Diffstat:
Mlib/Data/Word/Limb.hs | 24+++++++-----------------
1 file changed, 7 insertions(+), 17 deletions(-)

diff --git a/lib/Data/Word/Limb.hs b/lib/Data/Word/Limb.hs @@ -77,27 +77,17 @@ mul_add_c# -> Word# -- ^ carry -> (# Word#, Word# #) -- ^ lhs * rhs + addend + carry mul_add_c# a b m c = - let !(# l_0, h_0 #) = wadd_w# (mul_c# a b) (# m, 0## #) - !(# l_1, d #) = add_c# l_0 c 0## + let !(# l_0, h_0 #) = wadd_w# (mul_c# a b) m + !(# d, l_1 #) = plusWord2# l_0 c !h_1 = plusWord# h_0 d in (# l_1, h_1 #) where - -- wide overflowing addition - wadd_c# - :: (# Word#, Word# #) - -> (# Word#, Word# #) - -> (# Word#, Word#, Word# #) - wadd_c# (# a0, a1 #) (# b0, b1 #) = - let !(# s0, c0 #) = add_c# a0 b0 0## - !(# s1, c1 #) = add_c# a1 b1 c0 - in (# s0, s1, c1 #) - {-# INLINE wadd_c# #-} - -- wide wrapping addition - wadd_w# :: (# Word#, Word# #) -> (# Word#, Word# #) -> (# Word#, Word# #) - wadd_w# x y = - let !(# c0, c1, _ #) = wadd_c# x y - in (# c0, c1 #) + wadd_w# :: (# Word#, Word# #) -> Word# -> (# Word#, Word# #) + wadd_w# (# x_lo, x_hi #) y_lo = + let !(# c0, s0 #) = plusWord2# x_lo y_lo + !(# _, s1 #) = plusWord2# x_hi c0 + in (# s0, s1 #) {-# INLINE wadd_w# #-} {-# INLINE mul_add_c# #-}