fixed

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

commit 92b527cd0141dbd24b28e92290c0b5949d1a4a0c
parent a9d4855bedf548913fcfe1e4eaf6e5dca540f524
Author: Jared Tobin <jared@jtobin.io>
Date:   Sun, 21 Dec 2025 10:36:41 -0330

lib: comparison allocation measurement

Diffstat:
Mbench/Weight.hs | 21+++++++++++++++++++++
Mlib/Data/Word/Wider.hs | 11++++++++++-
Mppad-fixed.cabal | 1+
3 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/bench/Weight.hs b/bench/Weight.hs @@ -4,7 +4,9 @@ module Main where +import Control.DeepSeq import Data.Word.Wider (Wider) +import qualified Data.Word.Wider as W import qualified Numeric.Montgomery.Secp256k1.Curve as C import qualified Numeric.Montgomery.Secp256k1.Scalar as S import Prelude hiding (sqrt, exp) @@ -13,6 +15,8 @@ import Weigh -- note that 'weigh' doesn't work properly in a repl main :: IO () main = mainWith $ do + num_wider + cmp add sub mul @@ -23,6 +27,23 @@ main = mainWith $ do redc retr +num_wider :: Weigh () +num_wider = wgroup "num_wider" $ do + func "small" (force :: Wider -> Wider) 2 + func "large" (force :: Wider -> Wider) + 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed + +cmp :: Weigh () +cmp = + let !a = 1 + !b = 2 + !c = 2 ^ 255 - 19 + in wgroup "cmp" $ do + func "cmp: 1 < 2" (W.cmp a) b + func "cmp: 2 < 1" (W.cmp b) a + func "cmp: 2 < 2 ^ 255 - 19" (W.cmp b) c + func "cmp: 2 ^ 255 - 19 < 2" (W.cmp c) b + add :: Weigh () add = let !c1 = 1 :: C.Montgomery diff --git a/lib/Data/Word/Wider.hs b/lib/Data/Word/Wider.hs @@ -24,10 +24,12 @@ module Data.Word.Wider ( -- * Comparison , eq_vartime , cmp + , cmp# , eq# + , lt , lt# + , gt , gt# - , cmp# -- * Parity , odd# @@ -159,6 +161,9 @@ lt# a b = in C.from_word_mask# bor {-# INLINE lt# #-} +lt :: Wider -> Wider -> Bool +lt (Wider a) (Wider b) = C.decide (lt# a b) + gt# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) @@ -168,6 +173,9 @@ gt# a b = in C.from_word_mask# bor {-# INLINE gt# #-} +gt :: Wider -> Wider -> Bool +gt (Wider a) (Wider b) = C.decide (gt# a b) + cmp# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) @@ -199,6 +207,7 @@ cmp (Wider a) (Wider b) = case cmp# a b of 1# -> GT 0# -> EQ _ -> LT +{-# INLINABLE cmp #-} -- construction / conversion -------------------------------------------------- diff --git a/ppad-fixed.cabal b/ppad-fixed.cabal @@ -89,6 +89,7 @@ benchmark fixed-weigh build-depends: base + , deepseq , ppad-fixed , weigh