diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2013-10-01 11:37:59 +0200 |
---|---|---|
committer | Herbert Valerio Riedel <hvr@gnu.org> | 2013-10-01 11:40:36 +0200 |
commit | 82cd258f08def79774f6d859a534a36f786e2d10 (patch) | |
tree | 3d96b2a9d580844bcfd51d195e0bad74ca947216 /testsuite/tests/lib | |
parent | ba3ae9c630b754642e361a9768f710385554ae5a (diff) | |
download | haskell-82cd258f08def79774f6d859a534a36f786e2d10.tar.gz |
Add tests for new internal GMP primitives
See [ce8ec963/integer-gmp] and [97c101b7/integer-gmp] for more details
Diffstat (limited to 'testsuite/tests/lib')
-rw-r--r-- | testsuite/tests/lib/integer/all.T | 1 | ||||
-rw-r--r-- | testsuite/tests/lib/integer/integerGmpInternals.hs | 50 | ||||
-rw-r--r-- | testsuite/tests/lib/integer/integerGmpInternals.stdout | 9 |
3 files changed, 60 insertions, 0 deletions
diff --git a/testsuite/tests/lib/integer/all.T b/testsuite/tests/lib/integer/all.T index 61c061ecf8..9364f41bb4 100644 --- a/testsuite/tests/lib/integer/all.T +++ b/testsuite/tests/lib/integer/all.T @@ -1,5 +1,6 @@ test('integerBits', normal, compile_and_run, ['']) test('integerConversions', normal, compile_and_run, ['']) +test('integerGmpInternals', reqlib('integer-gmp'), compile_and_run, ['']) test('integerConstantFolding', extra_clean(['integerConstantFolding.simpl']), run_command, diff --git a/testsuite/tests/lib/integer/integerGmpInternals.hs b/testsuite/tests/lib/integer/integerGmpInternals.hs new file mode 100644 index 0000000000..48bdc344aa --- /dev/null +++ b/testsuite/tests/lib/integer/integerGmpInternals.hs @@ -0,0 +1,50 @@ +{-# LANGUAGE MagicHash, UnboxedTuples #-} + +module Main (main) where + +import GHC.Base +import GHC.Integer +import GHC.Integer.GMP.Internals + +gcdExtInteger' :: Integer -> Integer -> (Integer, Integer) +gcdExtInteger' a b = case gcdExtInteger a b of (# a, b #) -> (a,b) + +powInteger' :: Integer -> Word -> Integer +powInteger' b (W# w#) = powInteger b w# + +{- Reference implementation for 'powModInteger' + +powModIntegerHs :: Integer -> Integer -> Integer -> Integer +powModIntegerHs b0 e0 m + | e0 >= 0 = go b0 e0 1 + | otherwise = error "non-neg exponent required" + where + go !b e !r + | odd e = go b' e' (r*b `mod` m) + | e == 0 = r + | otherwise = go b' e' r + where + b' = b*b `mod` m + e' = e `unsafeShiftR` 1 -- slightly faster than "e `div` 2" + +-} + +main :: IO () +main = do + print $ powModInteger b e m + print $ gcdExtInteger' b e + print $ gcdExtInteger' e b + print $ gcdExtInteger' x y + print $ gcdExtInteger' y x + print $ powInteger' 12345 0 + print $ powInteger' 12345 1 + print $ powInteger' 12345 30 + print $ [ (x,i) | x <- [0..71], let i = recipModInteger x (2*3*11*11*17*17), i /= 0 ] + return () + where + b = 2988348162058574136915891421498819466320163312926952423791023078876139 + e = 2351399303373464486466122544523690094744975233415544072992656881240319 + m = 10^(40::Int) + + x = 5328841272400314897981163497728751426 + y = 32052182750761975518649228050096851724 diff --git a/testsuite/tests/lib/integer/integerGmpInternals.stdout b/testsuite/tests/lib/integer/integerGmpInternals.stdout new file mode 100644 index 0000000000..5a490bac18 --- /dev/null +++ b/testsuite/tests/lib/integer/integerGmpInternals.stdout @@ -0,0 +1,9 @@ +1527229998585248450016808958343740453059 +(1,-238164827888328100873319793437342927637138278785737103723156342382925) +(1,302679100340807588460107986194035692812415103244388831792688023418704) +(92889294,115110207004456909698806038261) +(92889294,-19137667681784054624628973533) +1 +12345 +555562377826831043419246079513769804614412256811161773362797946971665712715296306339052301636736176350153982639312744140625 +[(1,1),(5,41963),(7,59947),(13,177535),(19,143557),(23,182447),(25,134281),(29,7235),(31,33841),(35,95915),(37,113413),(41,61409),(43,24397),(47,174101),(49,158431),(53,193979),(59,188477),(61,185737),(65,35507),(67,118999),(71,186173)] |