ppad-fixed-0.1.0: bench/Weight.hs
{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns -fno-warn-type-defaults #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
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)
import Weigh
-- note that 'weigh' doesn't work properly in a repl
main :: IO ()
main = mainWith $ do
num_wider
cmp
add
sub
mul
sqr
inv
exp
sqrt
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
!c2 = 2 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
!s1 = 1 :: S.Montgomery
!s2 = 2 :: S.Montgomery
!s_big = (2 ^ 255 - 19) :: S.Montgomery
in wgroup "add" $ do
func "curve: M(1) + M(2)" (C.add c1) c2
func "curve: M(1) + M(2 ^ 255 - 19)" (C.add c1) c_big
func "scalar: M(1) + M(2)" (S.add s1) s2
func "scalar: M(1) + M(2 ^ 255 - 19)" (S.add s1) s_big
sub :: Weigh ()
sub =
let !c_max = (2 ^ 255 - 1) :: C.Montgomery
!c1 = 1 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
!s_max = (2 ^ 255 - 1) :: S.Montgomery
!s1 = 1 :: S.Montgomery
!s_big = (2 ^ 255 - 19) :: S.Montgomery
in wgroup "sub" $ do
func "curve: M(2 ^ 255 - 1) - M(1)" (C.sub c_max) c1
func "curve: M(2 ^ 255 - 1) - M(2 ^ 255 - 19)" (C.sub c_max) c_big
func "scalar: M(2 ^ 255 - 1) - M(1)" (S.sub s_max) s1
func "scalar: M(2 ^ 255 - 1) - M(2 ^ 255 - 19)" (S.sub s_max) s_big
mul :: Weigh ()
mul =
let !c2 = 2 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
!s2 = 2 :: S.Montgomery
!s_big = (2 ^ 255 - 19) :: S.Montgomery
in wgroup "mul" $ do
func "curve: M(2) * M(2)" (C.mul c2) c2
func "curve: M(2) * M(2 ^ 255 - 19)" (C.mul c2) c_big
func "scalar: M(2) * M(2)" (S.mul s2) s2
func "scalar: M(2) * M(2 ^ 255 - 19)" (S.mul s2) s_big
sqr :: Weigh ()
sqr =
let !c2 = 2 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
!s2 = 2 :: S.Montgomery
!s_big = (2 ^ 255 - 19) :: S.Montgomery
in wgroup "sqr" $ do
func "curve: M(2) ^ 2" C.sqr c2
func "curve: M(2 ^ 255 - 19) ^ 2" C.sqr c_big
func "scalar: M(2) ^ 2" S.sqr s2
func "scalar: M(2 ^ 255 - 19) ^ 2" S.sqr s_big
inv :: Weigh ()
inv =
let !c2 = 2 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
!s2 = 2 :: S.Montgomery
!s_big = (2 ^ 255 - 19) :: S.Montgomery
in wgroup "inv" $ do
func "curve: M(2) ^ -1" C.inv c2
func "curve: M(2 ^ 255 - 19) ^ -1" C.inv c_big
func "scalar: M(2) ^ -1" S.inv s2
func "scalar: M(2 ^ 255 - 19) ^ -1" S.inv s_big
exp :: Weigh ()
exp =
let !c2 = 2 :: C.Montgomery
!s2 = 2 :: S.Montgomery
!sma = 2 :: Wider
!big = (2 ^ 255 - 19) :: Wider
in wgroup "exp" $ do
func "curve: M(2) ^ 2" (C.exp c2) sma
func "curve: M(2) ^ (2 ^ 255 - 19)" (C.exp c2) big
func "scalar: M(2) ^ 2" (S.exp s2) sma
func "scalar: M(2) ^ (2 ^ 255 - 19)" (S.exp s2) big
sqrt :: Weigh ()
sqrt =
let !c2 = 2 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
in wgroup "sqrt" $ do
func "curve: sqrt M(2)" C.sqrt c2
func "curve: sqrt M(2 ^ 255 - 19)" C.sqrt c_big
redc :: Weigh ()
redc =
let !c2 = 2 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
!s2 = 2 :: S.Montgomery
!s_big = (2 ^ 255 - 19) :: S.Montgomery
in wgroup "redc" $ do
func "curve: REDC(M(2), M(2))" (C.redc c2) c2
func "curve: REDC(M(2), M(2 ^ 255 - 19))" (C.redc c2) c_big
func "scalar: REDC(M(2), M(2))" (S.redc s2) s2
func "scalar: REDC(M(2), M(2 ^ 255 - 19))" (S.redc s2) s_big
retr :: Weigh ()
retr =
let !c2 = 2 :: C.Montgomery
!c_big = (2 ^ 255 - 19) :: C.Montgomery
!s2 = 2 :: S.Montgomery
!s_big = (2 ^ 255 - 19) :: S.Montgomery
in wgroup "retr" $ do
func "curve: RETR(M(2))" C.retr c2
func "curve: RETR(M(2 ^ 255 - 19))" C.retr c_big
func "scalar: RETR(M(2))" S.retr s2
func "scalar: RETR(M(2 ^ 255 - 19))" S.retr s_big