fixed

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

commit cdec7e6b1b3d89ee484103b9dbc07dcd25f8b0af
parent 2814d79dbfacf3cb4de7b933e5f328ac07763b97
Author: Jared Tobin <jared@jtobin.io>
Date:   Fri, 24 Jan 2025 14:52:33 +0400

lib: do more work in fill functions

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

diff --git a/lib/Data/Word/Extended.hs b/lib/Data/Word/Extended.hs @@ -605,16 +605,14 @@ quotrem_gen 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) shift - !dn = set256 dn_pre 0 (d0 .<<. shift) + !dn = fill256 (dlen - 1) shift !ulen = setlen_576 u in if ulen < dlen then Word832 zero576 (Word256 u0 u1 u2 u3) else let !u_ulen = sel576 u (ulen - 1) !un_pre0 = set576 zero576 ulen (u_ulen .>>. (64 - shift)) - !un_pre1 = fill576 (ulen - 1) un_pre0 shift - !un = set576 un_pre1 0 (u0 .<<. shift) + !un = fill576 (ulen - 1) un_pre0 shift in if dlen == 1 then let !dn_0 = sel256 dn 0 @@ -645,7 +643,7 @@ quotrem_gen u@(Word576 u0 u1 u2 u3 u4 u5 u6 u7 u8) d@(Word256 d0 d1 d2 d3) = fill576 !start - !tar@(Word576 tar0 _ tar2 tar3 tar4 tar5 tar6 tar7 tar8) + (Word576 _ tar1 tar2 tar3 tar4 tar5 tar6 tar7 tar8) !s = let v8 = (u8 .<<. s) .|. (u7 .>>. (64 - s)) v7 = (u7 .<<. s) .|. (u6 .>>. (64 - s)) @@ -656,15 +654,15 @@ quotrem_gen u@(Word576 u0 u1 u2 u3 u4 u5 u6 u7 u8) d@(Word256 d0 d1 d2 d3) = v2 = (u2 .<<. s) .|. (u1 .>>. (64 - s)) v1 = (u1 .<<. s) .|. (u0 .>>. (64 - s)) in case start of - 8 -> Word576 tar0 v1 v2 v3 v4 v5 v6 v7 v8 - 7 -> Word576 tar0 v1 v2 v3 v4 v5 v6 v7 tar8 - 6 -> Word576 tar0 v1 v2 v3 v4 v5 v6 tar7 tar8 - 5 -> Word576 tar0 v1 v2 v3 v4 v5 tar6 tar7 tar8 - 4 -> Word576 tar0 v1 v2 v3 v4 tar5 tar6 tar7 tar8 - 3 -> Word576 tar0 v1 v2 v3 tar4 tar5 tar6 tar7 tar8 - 2 -> Word576 tar0 v1 v2 tar3 tar4 tar5 tar6 tar7 tar8 - 1 -> Word576 tar0 v1 tar2 tar3 tar4 tar5 tar6 tar7 tar8 - 0 -> tar + 8 -> Word576 (u0 .<<. s) v1 v2 v3 v4 v5 v6 v7 v8 + 7 -> Word576 (u0 .<<. s) v1 v2 v3 v4 v5 v6 v7 tar8 + 6 -> Word576 (u0 .<<. s) v1 v2 v3 v4 v5 v6 tar7 tar8 + 5 -> Word576 (u0 .<<. s) v1 v2 v3 v4 v5 tar6 tar7 tar8 + 4 -> Word576 (u0 .<<. s) v1 v2 v3 v4 tar5 tar6 tar7 tar8 + 3 -> Word576 (u0 .<<. s) v1 v2 v3 tar4 tar5 tar6 tar7 tar8 + 2 -> Word576 (u0 .<<. s) v1 v2 tar3 tar4 tar5 tar6 tar7 tar8 + 1 -> Word576 (u0 .<<. s) v1 tar2 tar3 tar4 tar5 tar6 tar7 tar8 + 0 -> Word576 (u0 .<<. s) tar1 tar2 tar3 tar4 tar5 tar6 tar7 tar8 _ -> error "ppad-fixed (fill576): bad index" fill256 !start !s = @@ -672,10 +670,10 @@ quotrem_gen u@(Word576 u0 u1 u2 u3 u4 u5 u6 u7 u8) d@(Word256 d0 d1 d2 d3) = 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 + 3 -> Word256 (d0 .<<. s) v1 v2 v3 + 2 -> Word256 (d0 .<<. s) v1 v2 0 + 1 -> Word256 (d0 .<<. s) v1 0 0 + 0 -> Word256 (d0 .<<. s) 0 0 0 _ -> error "ppad-fixed (fill576): bad index" setlen_256 :: Word256 -> Int