fixed

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

commit 2814d79dbfacf3cb4de7b933e5f328ac07763b97
parent 025bfd6341d7f5db4b02cbc88299255b3929d9c7
Author: Jared Tobin <jared@jtobin.io>
Date:   Fri, 24 Jan 2025 14:48:09 +0400

lib: unroll fill256

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

diff --git a/lib/Data/Word/Extended.hs b/lib/Data/Word/Extended.hs @@ -602,10 +602,10 @@ quotrem_gen :: Word576 -> Word256 -> Word832 -quotrem_gen u@(Word576 u0 u1 u2 u3 u4 u5 u6 u7 u8) d@(Word256 d0 _ _ d3) = +quotrem_gen u@(Word576 u0 u1 u2 u3 u4 u5 u6 u7 u8) d@(Word256 d0 d1 d2 d3) = let !dlen = setlen_256 d !shift = B.countLeadingZeros d3 - !dn_pre = fill256 (dlen - 1) d zero shift + !dn_pre = fill256 (dlen - 1) shift !dn = set256 dn_pre 0 (d0 .<<. shift) !ulen = setlen_576 u in if ulen < dlen @@ -667,16 +667,16 @@ quotrem_gen u@(Word576 u0 u1 u2 u3 u4 u5 u6 u7 u8) d@(Word256 d0 _ _ d3) = 0 -> tar _ -> error "ppad-fixed (fill576): bad index" - fill256 !start !src !tar !s = - let loop !j !acc - | j == 0 = acc - | otherwise = - let !src_j = sel256 src j - !src_j_1 = sel256 src (j - 1) - !val = (src_j .<<. s) .|. (src_j_1 .>>. (64 - s)) - !nacc = set256 acc j val - in loop (pred j) nacc - in loop start tar + fill256 !start !s = + let v3 = (d3 .<<. s) .|. (d2 .>>. (64 - s)) + v2 = (d2 .<<. s) .|. (d1 .>>. (64 - s)) + v1 = (d1 .<<. s) .|. (d0 .>>. (64 - s)) + in case start of + 3 -> Word256 0 v1 v2 v3 + 2 -> Word256 0 v1 v2 0 + 1 -> Word256 0 v1 0 0 + 0 -> zero + _ -> error "ppad-fixed (fill576): bad index" setlen_256 :: Word256 -> Int setlen_256 (Word256 z0 z1 z2 z3)