packages feed

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