commit 92b527cd0141dbd24b28e92290c0b5949d1a4a0c
parent a9d4855bedf548913fcfe1e4eaf6e5dca540f524
Author: Jared Tobin <jared@jtobin.io>
Date: Sun, 21 Dec 2025 10:36:41 -0330
lib: comparison allocation measurement
Diffstat:
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