-
Lennart Kolmodin authored
Build them with: $ cabal configure --enable-benchmarks $ cabal build and run them: $ cabal bench
Lennart Kolmodin authoredBuild them with: $ cabal configure --enable-benchmarks $ cabal build and run them: $ cabal bench
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Benchmark.hs 42.34 KiB
{-# LANGUAGE BangPatterns #-}
module Main (main) where
import qualified Data.ByteString.Lazy as L
import Data.Binary
import Data.Binary.Put
import Data.Binary.Get
import Control.Exception
import System.CPUTime
import Numeric
import Text.Printf
import System.Environment
import MemBench
data Endian
= Big
| Little
| Host
deriving (Eq,Ord,Show)
main :: IO ()
main = do
args <- getArgs
mb <- case args of
(arg:_) -> readIO arg
_ -> return 100
memBench (mb*10)
putStrLn ""
putStrLn "Binary (de)serialisation benchmarks:"
-- do bytewise
sequence_
[ test wordSize chunkSize Host mb
| wordSize <- [1]
, chunkSize <- [16] --1,2,4,8,16]
]
-- now Word16 .. Word64
sequence_
[ test wordSize chunkSize end mb
| wordSize <- [2,4,8]
, chunkSize <- [16]
, end <- [Host] -- ,Big,Little]
]
------------------------------------------------------------------------
time :: IO a -> IO Double
time action = do
start <- getCPUTime
action
end <- getCPUTime
return $! (fromIntegral (end - start)) / (10^12)
------------------------------------------------------------------------
test :: Int -> Int -> Endian -> Int -> IO ()
test wordSize chunkSize end mb = do
let bytes :: Int
bytes = mb * 2^20
iterations = bytes `div` wordSize
bs = runPut (doPut wordSize chunkSize end iterations)
sum = runGet (doGet wordSize chunkSize end iterations) bs
case (chunkSize,end) of (1,Host) -> putStrLn "" ; _ -> return ()
printf "%dMB of Word%-2d in chunks of %2d (%6s endian): "
(mb :: Int) (8 * wordSize :: Int) (chunkSize :: Int) (show end)
putSeconds <- time $ evaluate (L.length bs)
getSeconds <- time $ evaluate sum
-- print (L.length bs, sum)
let putThroughput = fromIntegral mb / putSeconds
getThroughput = fromIntegral mb / getSeconds
printf "%6.1f MB/s write, %6.1f MB/s read, %5.1f get/put-ratio\n"
putThroughput
getThroughput
(getThroughput/putThroughput)
------------------------------------------------------------------------
doPut :: Int -> Int -> Endian -> Int -> Put
doPut wordSize chunkSize end = case (wordSize, chunkSize, end) of
(1, 1,_) -> putWord8N1
(1, 2,_) -> putWord8N2
(1, 4,_) -> putWord8N4
(1, 8,_) -> putWord8N8
(1, 16, _) -> putWord8N16
(2, 1, Big) -> putWord16N1Big
(2, 2, Big) -> putWord16N2Big
(2, 4, Big) -> putWord16N4Big
(2, 8, Big) -> putWord16N8Big
(2, 16, Big) -> putWord16N16Big
(2, 1, Little) -> putWord16N1Little
(2, 2, Little) -> putWord16N2Little
(2, 4, Little) -> putWord16N4Little
(2, 8, Little) -> putWord16N8Little
(2, 16, Little) -> putWord16N16Little
(2, 1, Host) -> putWord16N1Host
(2, 2, Host) -> putWord16N2Host
(2, 4, Host) -> putWord16N4Host
(2, 8, Host) -> putWord16N8Host
(2, 16, Host) -> putWord16N16Host
(4, 1, Big) -> putWord32N1Big
(4, 2, Big) -> putWord32N2Big
(4, 4, Big) -> putWord32N4Big
(4, 8, Big) -> putWord32N8Big
(4, 16, Big) -> putWord32N16Big
(4, 1, Little) -> putWord32N1Little
(4, 2, Little) -> putWord32N2Little
(4, 4, Little) -> putWord32N4Little
(4, 8, Little) -> putWord32N8Little
(4, 16, Little) -> putWord32N16Little
(4, 1, Host) -> putWord32N1Host
(4, 2, Host) -> putWord32N2Host
(4, 4, Host) -> putWord32N4Host
(4, 8, Host) -> putWord32N8Host
(4, 16, Host) -> putWord32N16Host
(8, 1, Host) -> putWord64N1Host
(8, 2, Host) -> putWord64N2Host
(8, 4, Host) -> putWord64N4Host
(8, 8, Host) -> putWord64N8Host
(8, 16, Host) -> putWord64N16Host
(8, 1, Big) -> putWord64N1Big
(8, 2, Big) -> putWord64N2Big
(8, 4, Big) -> putWord64N4Big
(8, 8, Big) -> putWord64N8Big
(8, 16, Big) -> putWord64N16Big
(8, 1, Little) -> putWord64N1Little
(8, 2, Little) -> putWord64N2Little
(8, 4, Little) -> putWord64N4Little
(8, 8, Little) -> putWord64N8Little
(8, 16, Little) -> putWord64N16Little
------------------------------------------------------------------------
doGet :: Int -> Int -> Endian -> Int -> Get Int
doGet wordSize chunkSize end =
case (wordSize, chunkSize, end) of
(1, 1,_) -> fmap fromIntegral . getWord8N1
(1, 2,_) -> fmap fromIntegral . getWord8N2
(1, 4,_) -> fmap fromIntegral . getWord8N4
(1, 8,_) -> fmap fromIntegral . getWord8N8
(1, 16,_) -> fmap fromIntegral . getWord8N16
(2, 1,Big) -> fmap fromIntegral . getWord16N1Big
(2, 2,Big) -> fmap fromIntegral . getWord16N2Big
(2, 4,Big) -> fmap fromIntegral . getWord16N4Big
(2, 8,Big) -> fmap fromIntegral . getWord16N8Big
(2, 16,Big) -> fmap fromIntegral . getWord16N16Big
(2, 1,Little) -> fmap fromIntegral . getWord16N1Little
(2, 2,Little) -> fmap fromIntegral . getWord16N2Little
(2, 4,Little) -> fmap fromIntegral . getWord16N4Little
(2, 8,Little) -> fmap fromIntegral . getWord16N8Little
(2, 16,Little) -> fmap fromIntegral . getWord16N16Little
(2, 1,Host) -> fmap fromIntegral . getWord16N1Host
(2, 2,Host) -> fmap fromIntegral . getWord16N2Host
(2, 4,Host) -> fmap fromIntegral . getWord16N4Host
(2, 8,Host) -> fmap fromIntegral . getWord16N8Host
(2, 16,Host) -> fmap fromIntegral . getWord16N16Host
(4, 1,Big) -> fmap fromIntegral . getWord32N1Big
(4, 2,Big) -> fmap fromIntegral . getWord32N2Big
(4, 4,Big) -> fmap fromIntegral . getWord32N4Big
(4, 8,Big) -> fmap fromIntegral . getWord32N8Big
(4, 16,Big) -> fmap fromIntegral . getWord32N16Big
(4, 1,Little) -> fmap fromIntegral . getWord32N1Little
(4, 2,Little) -> fmap fromIntegral . getWord32N2Little
(4, 4,Little) -> fmap fromIntegral . getWord32N4Little
(4, 8,Little) -> fmap fromIntegral . getWord32N8Little
(4, 16,Little) -> fmap fromIntegral . getWord32N16Little
(4, 1,Host) -> fmap fromIntegral . getWord32N1Host
(4, 2,Host) -> fmap fromIntegral . getWord32N2Host
(4, 4,Host) -> fmap fromIntegral . getWord32N4Host
(4, 8,Host) -> fmap fromIntegral . getWord32N8Host
(4, 16,Host) -> fmap fromIntegral . getWord32N16Host
(8, 1,Host) -> fmap fromIntegral . getWord64N1Host
(8, 2,Host) -> fmap fromIntegral . getWord64N2Host
(8, 4,Host) -> fmap fromIntegral . getWord64N4Host
(8, 8,Host) -> fmap fromIntegral . getWord64N8Host
(8, 16,Host) -> fmap fromIntegral . getWord64N16Host
(8, 1,Big) -> fmap fromIntegral . getWord64N1Big
(8, 2,Big) -> fmap fromIntegral . getWord64N2Big
(8, 4,Big) -> fmap fromIntegral . getWord64N4Big
(8, 8,Big) -> fmap fromIntegral . getWord64N8Big
(8, 16,Big) -> fmap fromIntegral . getWord64N16Big
(8, 1,Little) -> fmap fromIntegral . getWord64N1Little
(8, 2,Little) -> fmap fromIntegral . getWord64N2Little
(8, 4,Little) -> fmap fromIntegral . getWord64N4Little
(8, 8,Little) -> fmap fromIntegral . getWord64N8Little
(8, 16,Little) -> fmap fromIntegral . getWord64N16Little
------------------------------------------------------------------------
putWord8N1 bytes = loop 0 0
where loop :: Word8 -> Int -> Put
loop !s !n | n == bytes = return ()
| otherwise = do putWord8 s
loop (s+1) (n+1)
putWord8N2 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord8 (s+0)
putWord8 (s+1)
loop (s+2) (n-2)
putWord8N4 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord8 (s+0)
putWord8 (s+1)
putWord8 (s+2)
putWord8 (s+3)
loop (s+4) (n-4)
putWord8N8 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord8 (s+0)
putWord8 (s+1)
putWord8 (s+2)
putWord8 (s+3)
putWord8 (s+4)
putWord8 (s+5)
putWord8 (s+6)
putWord8 (s+7)
loop (s+8) (n-8)
putWord8N16 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord8 (s+0)
putWord8 (s+1)
putWord8 (s+2)
putWord8 (s+3)
putWord8 (s+4)
putWord8 (s+5)
putWord8 (s+6)
putWord8 (s+7)
putWord8 (s+8)
putWord8 (s+9)
putWord8 (s+10)
putWord8 (s+11)
putWord8 (s+12)
putWord8 (s+13)
putWord8 (s+14)
putWord8 (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
-- Big endian, word16 writes
putWord16N1Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16be (s+0)
loop (s+1) (n-1)
putWord16N2Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16be (s+0)
putWord16be (s+1)
loop (s+2) (n-2)
putWord16N4Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16be (s+0)
putWord16be (s+1)
putWord16be (s+2)
putWord16be (s+3)
loop (s+4) (n-4)
putWord16N8Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16be (s+0)
putWord16be (s+1)
putWord16be (s+2)
putWord16be (s+3)
putWord16be (s+4)
putWord16be (s+5)
putWord16be (s+6)
putWord16be (s+7)
loop (s+8) (n-8)
putWord16N16Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16be (s+0)
putWord16be (s+1)
putWord16be (s+2)
putWord16be (s+3)
putWord16be (s+4)
putWord16be (s+5)
putWord16be (s+6)
putWord16be (s+7)
putWord16be (s+8)
putWord16be (s+9)
putWord16be (s+10)
putWord16be (s+11)
putWord16be (s+12)
putWord16be (s+13)
putWord16be (s+14)
putWord16be (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
-- Little endian, word16 writes
putWord16N1Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16le (s+0)
loop (s+1) (n-1)
putWord16N2Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16le (s+0)
putWord16le (s+1)
loop (s+2) (n-2)
putWord16N4Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16le (s+0)
putWord16le (s+1)
putWord16le (s+2)
putWord16le (s+3)
loop (s+4) (n-4)
putWord16N8Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16le (s+0)
putWord16le (s+1)
putWord16le (s+2)
putWord16le (s+3)
putWord16le (s+4)
putWord16le (s+5)
putWord16le (s+6)
putWord16le (s+7)
loop (s+8) (n-8)
putWord16N16Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16le (s+0)
putWord16le (s+1)
putWord16le (s+2)
putWord16le (s+3)
putWord16le (s+4)
putWord16le (s+5)
putWord16le (s+6)
putWord16le (s+7)
putWord16le (s+8)
putWord16le (s+9)
putWord16le (s+10)
putWord16le (s+11)
putWord16le (s+12)
putWord16le (s+13)
putWord16le (s+14)
putWord16le (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
-- Host endian, unaligned, word16 writes
putWord16N1Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16host (s+0)
loop (s+1) (n-1)
putWord16N2Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16host (s+0)
putWord16host (s+1)
loop (s+2) (n-2)
putWord16N4Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16host (s+0)
putWord16host (s+1)
putWord16host (s+2)
putWord16host (s+3)
loop (s+4) (n-4)
putWord16N8Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16host (s+0)
putWord16host (s+1)
putWord16host (s+2)
putWord16host (s+3)
putWord16host (s+4)
putWord16host (s+5)
putWord16host (s+6)
putWord16host (s+7)
loop (s+8) (n-8)
putWord16N16Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord16host (s+0)
putWord16host (s+1)
putWord16host (s+2)
putWord16host (s+3)
putWord16host (s+4)
putWord16host (s+5)
putWord16host (s+6)
putWord16host (s+7)
putWord16host (s+8)
putWord16host (s+9)
putWord16host (s+10)
putWord16host (s+11)
putWord16host (s+12)
putWord16host (s+13)
putWord16host (s+14)
putWord16host (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
putWord32N1Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32be (s+0)
loop (s+1) (n-1)
putWord32N2Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32be (s+0)
putWord32be (s+1)
loop (s+2) (n-2)
putWord32N4Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32be (s+0)
putWord32be (s+1)
putWord32be (s+2)
putWord32be (s+3)
loop (s+4) (n-4)
putWord32N8Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32be (s+0)
putWord32be (s+1)
putWord32be (s+2)
putWord32be (s+3)
putWord32be (s+4)
putWord32be (s+5)
putWord32be (s+6)
putWord32be (s+7)
loop (s+8) (n-8)
putWord32N16Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32be (s+0)
putWord32be (s+1)
putWord32be (s+2)
putWord32be (s+3)
putWord32be (s+4)
putWord32be (s+5)
putWord32be (s+6)
putWord32be (s+7)
putWord32be (s+8)
putWord32be (s+9)
putWord32be (s+10)
putWord32be (s+11)
putWord32be (s+12)
putWord32be (s+13)
putWord32be (s+14)
putWord32be (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
putWord32N1Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32le (s+0)
loop (s+1) (n-1)
putWord32N2Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32le (s+0)
putWord32le (s+1)
loop (s+2) (n-2)
putWord32N4Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32le (s+0)
putWord32le (s+1)
putWord32le (s+2)
putWord32le (s+3)
loop (s+4) (n-4)
putWord32N8Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32le (s+0)
putWord32le (s+1)
putWord32le (s+2)
putWord32le (s+3)
putWord32le (s+4)
putWord32le (s+5)
putWord32le (s+6)
putWord32le (s+7)
loop (s+8) (n-8)
putWord32N16Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32le (s+0)
putWord32le (s+1)
putWord32le (s+2)
putWord32le (s+3)
putWord32le (s+4)
putWord32le (s+5)
putWord32le (s+6)
putWord32le (s+7)
putWord32le (s+8)
putWord32le (s+9)
putWord32le (s+10)
putWord32le (s+11)
putWord32le (s+12)
putWord32le (s+13)
putWord32le (s+14)
putWord32le (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
putWord32N1Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32host (s+0)
loop (s+1) (n-1)
putWord32N2Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32host (s+0)
putWord32host (s+1)
loop (s+2) (n-2)
putWord32N4Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32host (s+0)
putWord32host (s+1)
putWord32host (s+2)
putWord32host (s+3)
loop (s+4) (n-4)
putWord32N8Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32host (s+0)
putWord32host (s+1)
putWord32host (s+2)
putWord32host (s+3)
putWord32host (s+4)
putWord32host (s+5)
putWord32host (s+6)
putWord32host (s+7)
loop (s+8) (n-8)
putWord32N16Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord32host (s+0)
putWord32host (s+1)
putWord32host (s+2)
putWord32host (s+3)
putWord32host (s+4)
putWord32host (s+5)
putWord32host (s+6)
putWord32host (s+7)
putWord32host (s+8)
putWord32host (s+9)
putWord32host (s+10)
putWord32host (s+11)
putWord32host (s+12)
putWord32host (s+13)
putWord32host (s+14)
putWord32host (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
putWord64N1Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64be (s+0)
loop (s+1) (n-1)
putWord64N2Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64be (s+0)
putWord64be (s+1)
loop (s+2) (n-2)
putWord64N4Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64be (s+0)
putWord64be (s+1)
putWord64be (s+2)
putWord64be (s+3)
loop (s+4) (n-4)
putWord64N8Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64be (s+0)
putWord64be (s+1)
putWord64be (s+2)
putWord64be (s+3)
putWord64be (s+4)
putWord64be (s+5)
putWord64be (s+6)
putWord64be (s+7)
loop (s+8) (n-8)
putWord64N16Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64be (s+0)
putWord64be (s+1)
putWord64be (s+2)
putWord64be (s+3)
putWord64be (s+4)
putWord64be (s+5)
putWord64be (s+6)
putWord64be (s+7)
putWord64be (s+8)
putWord64be (s+9)
putWord64be (s+10)
putWord64be (s+11)
putWord64be (s+12)
putWord64be (s+13)
putWord64be (s+14)
putWord64be (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
putWord64N1Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64le (s+0)
loop (s+1) (n-1)
putWord64N2Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64le (s+0)
putWord64le (s+1)
loop (s+2) (n-2)
putWord64N4Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64le (s+0)
putWord64le (s+1)
putWord64le (s+2)
putWord64le (s+3)
loop (s+4) (n-4)
putWord64N8Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64le (s+0)
putWord64le (s+1)
putWord64le (s+2)
putWord64le (s+3)
putWord64le (s+4)
putWord64le (s+5)
putWord64le (s+6)
putWord64le (s+7)
loop (s+8) (n-8)
putWord64N16Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64le (s+0)
putWord64le (s+1)
putWord64le (s+2)
putWord64le (s+3)
putWord64le (s+4)
putWord64le (s+5)
putWord64le (s+6)
putWord64le (s+7)
putWord64le (s+8)
putWord64le (s+9)
putWord64le (s+10)
putWord64le (s+11)
putWord64le (s+12)
putWord64le (s+13)
putWord64le (s+14)
putWord64le (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
putWord64N1Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64host (s+0)
loop (s+1) (n-1)
putWord64N2Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64host (s+0)
putWord64host (s+1)
loop (s+2) (n-2)
putWord64N4Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64host (s+0)
putWord64host (s+1)
putWord64host (s+2)
putWord64host (s+3)
loop (s+4) (n-4)
putWord64N8Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64host (s+0)
putWord64host (s+1)
putWord64host (s+2)
putWord64host (s+3)
putWord64host (s+4)
putWord64host (s+5)
putWord64host (s+6)
putWord64host (s+7)
loop (s+8) (n-8)
putWord64N16Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop _ 0 = return ()
loop s n = do
putWord64host (s+0)
putWord64host (s+1)
putWord64host (s+2)
putWord64host (s+3)
putWord64host (s+4)
putWord64host (s+5)
putWord64host (s+6)
putWord64host (s+7)
putWord64host (s+8)
putWord64host (s+9)
putWord64host (s+10)
putWord64host (s+11)
putWord64host (s+12)
putWord64host (s+13)
putWord64host (s+14)
putWord64host (s+15)
loop (s+16) (n-16)
------------------------------------------------------------------------
------------------------------------------------------------------------
getWord8N1 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord8
loop (s+s0) (n-1)
getWord8N2 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord8
s1 <- getWord8
loop (s+s0+s1) (n-2)
getWord8N4 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord8
s1 <- getWord8
s2 <- getWord8
s3 <- getWord8
loop (s+s0+s1+s2+s3) (n-4)
getWord8N8 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord8
s1 <- getWord8
s2 <- getWord8
s3 <- getWord8
s4 <- getWord8
s5 <- getWord8
s6 <- getWord8
s7 <- getWord8
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
getWord8N16 = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord8
s1 <- getWord8
s2 <- getWord8
s3 <- getWord8
s4 <- getWord8
s5 <- getWord8
s6 <- getWord8
s7 <- getWord8
s8 <- getWord8
s9 <- getWord8
s10 <- getWord8
s11 <- getWord8
s12 <- getWord8
s13 <- getWord8
s14 <- getWord8
s15 <- getWord8
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord16N1Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16be
loop (s+s0) (n-1)
getWord16N2Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16be
s1 <- getWord16be
loop (s+s0+s1) (n-2)
getWord16N4Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16be
s1 <- getWord16be
s2 <- getWord16be
s3 <- getWord16be
loop (s+s0+s1+s2+s3) (n-4)
getWord16N8Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16be
s1 <- getWord16be
s2 <- getWord16be
s3 <- getWord16be
s4 <- getWord16be
s5 <- getWord16be
s6 <- getWord16be
s7 <- getWord16be
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
getWord16N16Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16be
s1 <- getWord16be
s2 <- getWord16be
s3 <- getWord16be
s4 <- getWord16be
s5 <- getWord16be
s6 <- getWord16be
s7 <- getWord16be
s8 <- getWord16be
s9 <- getWord16be
s10 <- getWord16be
s11 <- getWord16be
s12 <- getWord16be
s13 <- getWord16be
s14 <- getWord16be
s15 <- getWord16be
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord16N1Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16le
loop (s+s0) (n-1)
getWord16N2Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16le
s1 <- getWord16le
loop (s+s0+s1) (n-2)
getWord16N4Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16le
s1 <- getWord16le
s2 <- getWord16le
s3 <- getWord16le
loop (s+s0+s1+s2+s3) (n-4)
getWord16N8Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16le
s1 <- getWord16le
s2 <- getWord16le
s3 <- getWord16le
s4 <- getWord16le
s5 <- getWord16le
s6 <- getWord16le
s7 <- getWord16le
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
getWord16N16Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16le
s1 <- getWord16le
s2 <- getWord16le
s3 <- getWord16le
s4 <- getWord16le
s5 <- getWord16le
s6 <- getWord16le
s7 <- getWord16le
s8 <- getWord16le
s9 <- getWord16le
s10 <- getWord16le
s11 <- getWord16le
s12 <- getWord16le
s13 <- getWord16le
s14 <- getWord16le
s15 <- getWord16le
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord16N1Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16host
loop (s+s0) (n-1)
getWord16N2Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16host
s1 <- getWord16host
loop (s+s0+s1) (n-2)
getWord16N4Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16host
s1 <- getWord16host
s2 <- getWord16host
s3 <- getWord16host
loop (s+s0+s1+s2+s3) (n-4)
getWord16N8Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16host
s1 <- getWord16host
s2 <- getWord16host
s3 <- getWord16host
s4 <- getWord16host
s5 <- getWord16host
s6 <- getWord16host
s7 <- getWord16host
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
getWord16N16Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord16host
s1 <- getWord16host
s2 <- getWord16host
s3 <- getWord16host
s4 <- getWord16host
s5 <- getWord16host
s6 <- getWord16host
s7 <- getWord16host
s8 <- getWord16host
s9 <- getWord16host
s10 <- getWord16host
s11 <- getWord16host
s12 <- getWord16host
s13 <- getWord16host
s14 <- getWord16host
s15 <- getWord16host
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord32N1Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32be
loop (s+s0) (n-1)
getWord32N2Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32be
s1 <- getWord32be
loop (s+s0+s1) (n-2)
getWord32N4Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32be
s1 <- getWord32be
s2 <- getWord32be
s3 <- getWord32be
loop (s+s0+s1+s2+s3) (n-4)
getWord32N8Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32be
s1 <- getWord32be
s2 <- getWord32be
s3 <- getWord32be
s4 <- getWord32be
s5 <- getWord32be
s6 <- getWord32be
s7 <- getWord32be
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
-- getWordhostN16 = loop 0
getWord32N16Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32be
s1 <- getWord32be
s2 <- getWord32be
s3 <- getWord32be
s4 <- getWord32be
s5 <- getWord32be
s6 <- getWord32be
s7 <- getWord32be
s8 <- getWord32be
s9 <- getWord32be
s10 <- getWord32be
s11 <- getWord32be
s12 <- getWord32be
s13 <- getWord32be
s14 <- getWord32be
s15 <- getWord32be
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord32N1Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32le
loop (s+s0) (n-1)
getWord32N2Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32le
s1 <- getWord32le
loop (s+s0+s1) (n-2)
getWord32N4Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32le
s1 <- getWord32le
s2 <- getWord32le
s3 <- getWord32le
loop (s+s0+s1+s2+s3) (n-4)
getWord32N8Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32le
s1 <- getWord32le
s2 <- getWord32le
s3 <- getWord32le
s4 <- getWord32le
s5 <- getWord32le
s6 <- getWord32le
s7 <- getWord32le
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
-- getWordhostN16 = loop 0
getWord32N16Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32le
s1 <- getWord32le
s2 <- getWord32le
s3 <- getWord32le
s4 <- getWord32le
s5 <- getWord32le
s6 <- getWord32le
s7 <- getWord32le
s8 <- getWord32le
s9 <- getWord32le
s10 <- getWord32le
s11 <- getWord32le
s12 <- getWord32le
s13 <- getWord32le
s14 <- getWord32le
s15 <- getWord32le
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord32N1Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32host
loop (s+s0) (n-1)
getWord32N2Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32host
s1 <- getWord32host
loop (s+s0+s1) (n-2)
getWord32N4Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32host
s1 <- getWord32host
s2 <- getWord32host
s3 <- getWord32host
loop (s+s0+s1+s2+s3) (n-4)
getWord32N8Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32host
s1 <- getWord32host
s2 <- getWord32host
s3 <- getWord32host
s4 <- getWord32host
s5 <- getWord32host
s6 <- getWord32host
s7 <- getWord32host
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
-- getWordhostN16 = loop 0
getWord32N16Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord32host
s1 <- getWord32host
s2 <- getWord32host
s3 <- getWord32host
s4 <- getWord32host
s5 <- getWord32host
s6 <- getWord32host
s7 <- getWord32host
s8 <- getWord32host
s9 <- getWord32host
s10 <- getWord32host
s11 <- getWord32host
s12 <- getWord32host
s13 <- getWord32host
s14 <- getWord32host
s15 <- getWord32host
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord64N1Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64be
loop (s+s0) (n-1)
getWord64N2Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64be
s1 <- getWord64be
loop (s+s0+s1) (n-2)
getWord64N4Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64be
s1 <- getWord64be
s2 <- getWord64be
s3 <- getWord64be
loop (s+s0+s1+s2+s3) (n-4)
getWord64N8Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64be
s1 <- getWord64be
s2 <- getWord64be
s3 <- getWord64be
s4 <- getWord64be
s5 <- getWord64be
s6 <- getWord64be
s7 <- getWord64be
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
getWord64N16Big = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64be
s1 <- getWord64be
s2 <- getWord64be
s3 <- getWord64be
s4 <- getWord64be
s5 <- getWord64be
s6 <- getWord64be
s7 <- getWord64be
s8 <- getWord64be
s9 <- getWord64be
s10 <- getWord64be
s11 <- getWord64be
s12 <- getWord64be
s13 <- getWord64be
s14 <- getWord64be
s15 <- getWord64be
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord64N1Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64le
loop (s+s0) (n-1)
getWord64N2Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64le
s1 <- getWord64le
loop (s+s0+s1) (n-2)
getWord64N4Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64le
s1 <- getWord64le
s2 <- getWord64le
s3 <- getWord64le
loop (s+s0+s1+s2+s3) (n-4)
getWord64N8Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64le
s1 <- getWord64le
s2 <- getWord64le
s3 <- getWord64le
s4 <- getWord64le
s5 <- getWord64le
s6 <- getWord64le
s7 <- getWord64le
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
getWord64N16Little = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64le
s1 <- getWord64le
s2 <- getWord64le
s3 <- getWord64le
s4 <- getWord64le
s5 <- getWord64le
s6 <- getWord64le
s7 <- getWord64le
s8 <- getWord64le
s9 <- getWord64le
s10 <- getWord64le
s11 <- getWord64le
s12 <- getWord64le
s13 <- getWord64le
s14 <- getWord64le
s15 <- getWord64le
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
------------------------------------------------------------------------
getWord64N1Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64host
loop (s+s0) (n-1)
getWord64N2Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64host
s1 <- getWord64host
loop (s+s0+s1) (n-2)
getWord64N4Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64host
s1 <- getWord64host
s2 <- getWord64host
s3 <- getWord64host
loop (s+s0+s1+s2+s3) (n-4)
getWord64N8Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64host
s1 <- getWord64host
s2 <- getWord64host
s3 <- getWord64host
s4 <- getWord64host
s5 <- getWord64host
s6 <- getWord64host
s7 <- getWord64host
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
getWord64N16Host = loop 0
where loop s n | s `seq` n `seq` False = undefined
loop s 0 = return s
loop s n = do
s0 <- getWord64host
s1 <- getWord64host
s2 <- getWord64host
s3 <- getWord64host
s4 <- getWord64host
s5 <- getWord64host
s6 <- getWord64host
s7 <- getWord64host
s8 <- getWord64host
s9 <- getWord64host
s10 <- getWord64host
s11 <- getWord64host
s12 <- getWord64host
s13 <- getWord64host
s14 <- getWord64host
s15 <- getWord64host
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)