fixed

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

commit 96940abb678c1b3cfa9d6bae3bde43ac0fb584f9
parent 88976e2d05884d4e414d05373a261fc84f552e26
Author: Jared Tobin <jared@jtobin.io>
Date:   Mon,  3 Feb 2025 11:06:45 +0400

lib: mul_512#

Diffstat:
Mlib/Data/Word/Extended.hs | 28++++++++++++++++++++++++++++
1 file changed, 28 insertions(+), 0 deletions(-)

diff --git a/lib/Data/Word/Extended.hs b/lib/Data/Word/Extended.hs @@ -54,6 +54,7 @@ module Data.Word.Extended ( , mul_c# , umul_hop# , umul_step# + , mul_512# ) where import Control.DeepSeq @@ -351,6 +352,33 @@ mul (Word256 (W64# a0) (W64# a1) (W64# a2) (W64# a3)) (plusWord64# c0_2 (plusWord64# c1_1 c2))))) in Word256 (W64# s0) (W64# s1) (W64# s2) (W64# s3) +-- full 256-bit x 256-bit -> 512-bit multiplication +mul_512# + :: (# Word64#, Word64#, Word64#, Word64# #) + -> (# Word64#, Word64#, Word64#, Word64# #) + -> (# Word64#, Word64#, Word64#, Word64#, Word64#, Word64#, Word64#, Word64# #) +mul_512# (# x0, x1, x2, x3 #) (# y0, y1, y2, y3 #) = + let !(# c4_0, r0 #) = mul_c# x0 y0 + !(# c4_1, r0_1 #) = umul_hop# c4_0 x1 y0 + !(# c4_2, r0_2 #) = umul_hop# c4_1 x2 y0 + !(# c4, r0_3 #) = umul_hop# c4_2 x3 y0 + + !(# c5_0, r1 #) = umul_hop# r0_1 x0 y1 + !(# c5_1, r1_2 #) = umul_step# r0_2 x1 y1 c5_0 + !(# c5_2, r1_3 #) = umul_step# r0_3 x2 y1 c5_1 + !(# c5, r1_4 #) = umul_step# c4 x3 y1 c5_2 + + !(# c6_0, r2 #) = umul_hop# r1_2 x0 y2 + !(# c6_1, r2_3 #) = umul_step# r1_3 x1 y2 c6_0 + !(# c6_2, r2_4 #) = umul_step# r1_4 x2 y2 c6_1 + !(# c6, r2_5 #) = umul_step# c5 x3 y2 c6_2 + + !(# c7_0, r3 #) = umul_hop# r2_3 x0 y3 + !(# c7_1, r4 #) = umul_step# r2_4 x1 y3 c7_0 + !(# c7_2, r5 #) = umul_step# r2_5 x2 y3 c7_1 + !(# r7, r6 #) = umul_step# c6 x3 y3 c7_2 + in (# r0, r1, r2, r3, r4, r5, r6, r7 #) + -- division ------------------------------------------------------------------- -- quotient, remainder of (hi, lo) divided by y