~ubuntu-branches/ubuntu/precise/ghc/precise

« back to all changes in this revision

Viewing changes to libraries/ghc-binary/tests/NewBenchmark.hs

  • Committer: Bazaar Package Importer
  • Author(s): Joachim Breitner
  • Date: 2011-01-17 12:49:24 UTC
  • Revision ID: james.westby@ubuntu.com-20110117124924-do1pym1jlf5o636m
Tags: upstream-7.0.1
ImportĀ upstreamĀ versionĀ 7.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
--
 
2
-- benchmark NewBinary
 
3
--
 
4
 
 
5
module Main where
 
6
 
 
7
import System.IO
 
8
import Data.Word
 
9
import NewBinary
 
10
 
 
11
import Control.Exception
 
12
import System.CPUTime
 
13
import Numeric
 
14
 
 
15
mb :: Int
 
16
mb = 10
 
17
 
 
18
main :: IO ()
 
19
main = sequence_ 
 
20
  [ test wordSize chunkSize mb
 
21
  | wordSize  <- [1,2,4,8]
 
22
  , chunkSize <- [1,2,4,8,16] ]
 
23
 
 
24
time :: IO a -> IO Double
 
25
time action = do
 
26
    start <- getCPUTime
 
27
    action
 
28
    end   <- getCPUTime
 
29
    return $! (fromIntegral (end - start)) / (10^12)
 
30
 
 
31
test :: Int -> Int -> Int -> IO ()
 
32
test wordSize chunkSize mb = do
 
33
    let bytes :: Int
 
34
        bytes = mb * 2^20
 
35
        iterations = bytes `div` wordSize
 
36
    putStr $ show mb ++ "MB of Word" ++ show (8 * wordSize)
 
37
          ++ " in chunks of " ++ show chunkSize ++ ": "
 
38
    h <- openBinMem bytes undefined
 
39
    start <- tellBin h
 
40
    putSeconds <- time $ do
 
41
      doPut wordSize chunkSize h iterations
 
42
--      BinPtr n _ <- tellBin h
 
43
--      print n
 
44
    getSeconds <- time $ do
 
45
      seekBin h start
 
46
      sum <- doGet wordSize chunkSize h iterations
 
47
      evaluate sum
 
48
--      BinPtr n _ <- tellBin h
 
49
--      print (n, sum)
 
50
    let putThroughput = fromIntegral mb / putSeconds
 
51
        getThroughput = fromIntegral mb / getSeconds
 
52
    putStrLn $ showFFloat (Just 2) putThroughput "MB/s write, "
 
53
            ++ showFFloat (Just 2) getThroughput "MB/s read"
 
54
 
 
55
doPut :: Int -> Int -> BinHandle -> Int -> IO ()
 
56
doPut wordSize chunkSize =
 
57
  case (wordSize, chunkSize) of
 
58
    (1, 1)  -> putWord8N1
 
59
    (1, 2)  -> putWord8N2
 
60
    (1, 4)  -> putWord8N4
 
61
    (1, 8)  -> putWord8N8
 
62
    (1, 16) -> putWord8N16
 
63
    (2, 1)  -> putWord16N1
 
64
    (2, 2)  -> putWord16N2
 
65
    (2, 4)  -> putWord16N4
 
66
    (2, 8)  -> putWord16N8
 
67
    (2, 16) -> putWord16N16
 
68
    (4, 1)  -> putWord32N1
 
69
    (4, 2)  -> putWord32N2
 
70
    (4, 4)  -> putWord32N4
 
71
    (4, 8)  -> putWord32N8
 
72
    (4, 16) -> putWord32N16
 
73
    (8, 1)  -> putWord64N1
 
74
    (8, 2)  -> putWord64N2
 
75
    (8, 4)  -> putWord64N4
 
76
    (8, 8)  -> putWord64N8
 
77
    (8, 16) -> putWord64N16
 
78
 
 
79
putWord8 :: BinHandle -> Word8 -> IO ()
 
80
putWord8 = put_
 
81
{-# INLINE putWord8 #-}
 
82
 
 
83
putWord16be :: BinHandle -> Word16 -> IO ()
 
84
putWord16be = put_
 
85
{-# INLINE putWord16be #-}
 
86
 
 
87
putWord32be :: BinHandle -> Word32 -> IO ()
 
88
putWord32be = put_
 
89
{-# INLINE putWord32be #-}
 
90
 
 
91
putWord64be :: BinHandle -> Word64 -> IO ()
 
92
putWord64be = put_
 
93
{-# INLINE putWord64be #-}
 
94
 
 
95
getWord8 :: BinHandle -> IO Word8
 
96
getWord8 = get
 
97
{-# INLINE getWord8 #-}
 
98
 
 
99
getWord16be :: BinHandle -> IO Word16
 
100
getWord16be = get
 
101
{-# INLINE getWord16be #-}
 
102
 
 
103
getWord32be :: BinHandle -> IO Word32
 
104
getWord32be = get
 
105
{-# INLINE getWord32be #-}
 
106
 
 
107
getWord64be :: BinHandle -> IO Word64
 
108
getWord64be = get
 
109
{-# INLINE getWord64be #-}
 
110
 
 
111
putWord8N1 hnd = loop 0
 
112
  where loop s n | s `seq` n `seq` False = undefined
 
113
        loop _ 0 = return ()
 
114
        loop s n = do
 
115
          putWord8 hnd (s+0)
 
116
          loop (s+1) (n-1)
 
117
 
 
118
putWord8N2 hnd = loop 0
 
119
  where loop s n | s `seq` n `seq` False = undefined
 
120
        loop _ 0 = return ()
 
121
        loop s n = do
 
122
          putWord8 hnd (s+0)
 
123
          putWord8 hnd (s+1)
 
124
          loop (s+2) (n-2)
 
125
 
 
126
putWord8N4 hnd = loop 0
 
127
  where loop s n | s `seq` n `seq` False = undefined
 
128
        loop _ 0 = return ()
 
129
        loop s n = do
 
130
          putWord8 hnd (s+0)
 
131
          putWord8 hnd (s+1)
 
132
          putWord8 hnd (s+2)
 
133
          putWord8 hnd (s+3)
 
134
          loop (s+4) (n-4)
 
135
 
 
136
putWord8N8 hnd = loop 0
 
137
  where loop s n | s `seq` n `seq` False = undefined
 
138
        loop _ 0 = return ()
 
139
        loop s n = do
 
140
          putWord8 hnd (s+0)
 
141
          putWord8 hnd (s+1)
 
142
          putWord8 hnd (s+2)
 
143
          putWord8 hnd (s+3)
 
144
          putWord8 hnd (s+4)
 
145
          putWord8 hnd (s+5)
 
146
          putWord8 hnd (s+6)
 
147
          putWord8 hnd (s+7)
 
148
          loop (s+8) (n-8)
 
149
 
 
150
putWord8N16 hnd = loop 0
 
151
  where loop s n | s `seq` n `seq` False = undefined
 
152
        loop _ 0 = return ()
 
153
        loop s n = do
 
154
          putWord8 hnd (s+0)
 
155
          putWord8 hnd (s+1)
 
156
          putWord8 hnd (s+2)
 
157
          putWord8 hnd (s+3)
 
158
          putWord8 hnd (s+4)
 
159
          putWord8 hnd (s+5)
 
160
          putWord8 hnd (s+6)
 
161
          putWord8 hnd (s+7)
 
162
          putWord8 hnd (s+8)
 
163
          putWord8 hnd (s+9)
 
164
          putWord8 hnd (s+10)
 
165
          putWord8 hnd (s+11)
 
166
          putWord8 hnd (s+12)
 
167
          putWord8 hnd (s+13)
 
168
          putWord8 hnd (s+14)
 
169
          putWord8 hnd (s+15)
 
170
          loop (s+16) (n-16)
 
171
 
 
172
 
 
173
putWord16N1 hnd = loop 0
 
174
  where loop s n | s `seq` n `seq` False = undefined
 
175
        loop _ 0 = return ()
 
176
        loop s n = do
 
177
          putWord16be hnd (s+0)
 
178
          loop (s+1) (n-1)
 
179
 
 
180
putWord16N2 hnd = loop 0
 
181
  where loop s n | s `seq` n `seq` False = undefined
 
182
        loop _ 0 = return ()
 
183
        loop s n = do
 
184
          putWord16be hnd (s+0)
 
185
          putWord16be hnd (s+1)
 
186
          loop (s+2) (n-2)
 
187
 
 
188
putWord16N4 hnd = loop 0
 
189
  where loop s n | s `seq` n `seq` False = undefined
 
190
        loop _ 0 = return ()
 
191
        loop s n = do
 
192
          putWord16be hnd (s+0)
 
193
          putWord16be hnd (s+1)
 
194
          putWord16be hnd (s+2)
 
195
          putWord16be hnd (s+3)
 
196
          loop (s+4) (n-4)
 
197
 
 
198
putWord16N8 hnd = loop 0
 
199
  where loop s n | s `seq` n `seq` False = undefined
 
200
        loop _ 0 = return ()
 
201
        loop s n = do
 
202
          putWord16be hnd (s+0)
 
203
          putWord16be hnd (s+1)
 
204
          putWord16be hnd (s+2)
 
205
          putWord16be hnd (s+3)
 
206
          putWord16be hnd (s+4)
 
207
          putWord16be hnd (s+5)
 
208
          putWord16be hnd (s+6)
 
209
          putWord16be hnd (s+7)
 
210
          loop (s+8) (n-8)
 
211
 
 
212
putWord16N16 hnd = loop 0
 
213
  where loop s n | s `seq` n `seq` False = undefined
 
214
        loop _ 0 = return ()
 
215
        loop s n = do
 
216
          putWord16be hnd (s+0)
 
217
          putWord16be hnd (s+1)
 
218
          putWord16be hnd (s+2)
 
219
          putWord16be hnd (s+3)
 
220
          putWord16be hnd (s+4)
 
221
          putWord16be hnd (s+5)
 
222
          putWord16be hnd (s+6)
 
223
          putWord16be hnd (s+7)
 
224
          putWord16be hnd (s+8)
 
225
          putWord16be hnd (s+9)
 
226
          putWord16be hnd (s+10)
 
227
          putWord16be hnd (s+11)
 
228
          putWord16be hnd (s+12)
 
229
          putWord16be hnd (s+13)
 
230
          putWord16be hnd (s+14)
 
231
          putWord16be hnd (s+15)
 
232
          loop (s+16) (n-16)
 
233
 
 
234
 
 
235
putWord32N1 hnd = loop 0
 
236
  where loop s n | s `seq` n `seq` False = undefined
 
237
        loop _ 0 = return ()
 
238
        loop s n = do
 
239
          putWord32be hnd (s+0)
 
240
          loop (s+1) (n-1)
 
241
 
 
242
putWord32N2 hnd = loop 0
 
243
  where loop s n | s `seq` n `seq` False = undefined
 
244
        loop _ 0 = return ()
 
245
        loop s n = do
 
246
          putWord32be hnd (s+0)
 
247
          putWord32be hnd (s+1)
 
248
          loop (s+2) (n-2)
 
249
 
 
250
putWord32N4 hnd = loop 0
 
251
  where loop s n | s `seq` n `seq` False = undefined
 
252
        loop _ 0 = return ()
 
253
        loop s n = do
 
254
          putWord32be hnd (s+0)
 
255
          putWord32be hnd (s+1)
 
256
          putWord32be hnd (s+2)
 
257
          putWord32be hnd (s+3)
 
258
          loop (s+4) (n-4)
 
259
 
 
260
putWord32N8 hnd = loop 0
 
261
  where loop s n | s `seq` n `seq` False = undefined
 
262
        loop _ 0 = return ()
 
263
        loop s n = do
 
264
          putWord32be hnd (s+0)
 
265
          putWord32be hnd (s+1)
 
266
          putWord32be hnd (s+2)
 
267
          putWord32be hnd (s+3)
 
268
          putWord32be hnd (s+4)
 
269
          putWord32be hnd (s+5)
 
270
          putWord32be hnd (s+6)
 
271
          putWord32be hnd (s+7)
 
272
          loop (s+8) (n-8)
 
273
 
 
274
putWord32N16 hnd = loop 0
 
275
  where loop s n | s `seq` n `seq` False = undefined
 
276
        loop _ 0 = return ()
 
277
        loop s n = do
 
278
          putWord32be hnd (s+0)
 
279
          putWord32be hnd (s+1)
 
280
          putWord32be hnd (s+2)
 
281
          putWord32be hnd (s+3)
 
282
          putWord32be hnd (s+4)
 
283
          putWord32be hnd (s+5)
 
284
          putWord32be hnd (s+6)
 
285
          putWord32be hnd (s+7)
 
286
          putWord32be hnd (s+8)
 
287
          putWord32be hnd (s+9)
 
288
          putWord32be hnd (s+10)
 
289
          putWord32be hnd (s+11)
 
290
          putWord32be hnd (s+12)
 
291
          putWord32be hnd (s+13)
 
292
          putWord32be hnd (s+14)
 
293
          putWord32be hnd (s+15)
 
294
          loop (s+16) (n-16)
 
295
 
 
296
putWord64N1 hnd = loop 0
 
297
  where loop s n | s `seq` n `seq` False = undefined
 
298
        loop _ 0 = return ()
 
299
        loop s n = do
 
300
          putWord64be hnd (s+0)
 
301
          loop (s+1) (n-1)
 
302
 
 
303
putWord64N2 hnd = loop 0
 
304
  where loop s n | s `seq` n `seq` False = undefined
 
305
        loop _ 0 = return ()
 
306
        loop s n = do
 
307
          putWord64be hnd (s+0)
 
308
          putWord64be hnd (s+1)
 
309
          loop (s+2) (n-2)
 
310
 
 
311
putWord64N4 hnd = loop 0
 
312
  where loop s n | s `seq` n `seq` False = undefined
 
313
        loop _ 0 = return ()
 
314
        loop s n = do
 
315
          putWord64be hnd (s+0)
 
316
          putWord64be hnd (s+1)
 
317
          putWord64be hnd (s+2)
 
318
          putWord64be hnd (s+3)
 
319
          loop (s+4) (n-4)
 
320
 
 
321
putWord64N8 hnd = loop 0
 
322
  where loop s n | s `seq` n `seq` False = undefined
 
323
        loop _ 0 = return ()
 
324
        loop s n = do
 
325
          putWord64be hnd (s+0)
 
326
          putWord64be hnd (s+1)
 
327
          putWord64be hnd (s+2)
 
328
          putWord64be hnd (s+3)
 
329
          putWord64be hnd (s+4)
 
330
          putWord64be hnd (s+5)
 
331
          putWord64be hnd (s+6)
 
332
          putWord64be hnd (s+7)
 
333
          loop (s+8) (n-8)
 
334
 
 
335
putWord64N16 hnd = loop 0
 
336
  where loop s n | s `seq` n `seq` False = undefined
 
337
        loop _ 0 = return ()
 
338
        loop s n = do
 
339
          putWord64be hnd (s+0)
 
340
          putWord64be hnd (s+1)
 
341
          putWord64be hnd (s+2)
 
342
          putWord64be hnd (s+3)
 
343
          putWord64be hnd (s+4)
 
344
          putWord64be hnd (s+5)
 
345
          putWord64be hnd (s+6)
 
346
          putWord64be hnd (s+7)
 
347
          putWord64be hnd (s+8)
 
348
          putWord64be hnd (s+9)
 
349
          putWord64be hnd (s+10)
 
350
          putWord64be hnd (s+11)
 
351
          putWord64be hnd (s+12)
 
352
          putWord64be hnd (s+13)
 
353
          putWord64be hnd (s+14)
 
354
          putWord64be hnd (s+15)
 
355
          loop (s+16) (n-16)
 
356
 
 
357
doGet :: Int -> Int -> BinHandle -> Int ->  IO Int
 
358
doGet wordSize chunkSize hnd =
 
359
  case (wordSize, chunkSize) of
 
360
    (1, 1)  -> fmap fromIntegral . getWord8N1 hnd
 
361
    (1, 2)  -> fmap fromIntegral . getWord8N2 hnd
 
362
    (1, 4)  -> fmap fromIntegral . getWord8N4 hnd
 
363
    (1, 8)  -> fmap fromIntegral . getWord8N8 hnd
 
364
    (1, 16) -> fmap fromIntegral . getWord8N16 hnd
 
365
    (2, 1)  -> fmap fromIntegral . getWord16N1 hnd
 
366
    (2, 2)  -> fmap fromIntegral . getWord16N2 hnd
 
367
    (2, 4)  -> fmap fromIntegral . getWord16N4 hnd
 
368
    (2, 8)  -> fmap fromIntegral . getWord16N8 hnd
 
369
    (2, 16) -> fmap fromIntegral . getWord16N16 hnd
 
370
    (4, 1)  -> fmap fromIntegral . getWord32N1 hnd
 
371
    (4, 2)  -> fmap fromIntegral . getWord32N2 hnd
 
372
    (4, 4)  -> fmap fromIntegral . getWord32N4 hnd
 
373
    (4, 8)  -> fmap fromIntegral . getWord32N8 hnd
 
374
    (4, 16) -> fmap fromIntegral . getWord32N16 hnd
 
375
    (8, 1)  -> fmap fromIntegral . getWord64N1 hnd
 
376
    (8, 2)  -> fmap fromIntegral . getWord64N2 hnd
 
377
    (8, 4)  -> fmap fromIntegral . getWord64N4 hnd
 
378
    (8, 8)  -> fmap fromIntegral . getWord64N8 hnd
 
379
    (8, 16) -> fmap fromIntegral . getWord64N16 hnd
 
380
 
 
381
getWord8N1 hnd = loop 0
 
382
  where loop s n | s `seq` n `seq` False = undefined
 
383
        loop s 0 = return s
 
384
        loop s n = do
 
385
          s0 <- getWord8 hnd
 
386
          loop (s+s0) (n-1)
 
387
 
 
388
getWord8N2 hnd = loop 0
 
389
  where loop s n | s `seq` n `seq` False = undefined
 
390
        loop s 0 = return s
 
391
        loop s n = do
 
392
          s0 <- getWord8 hnd
 
393
          s1 <- getWord8 hnd
 
394
          loop (s+s0+s1) (n-2)
 
395
 
 
396
getWord8N4 hnd = loop 0
 
397
  where loop s n | s `seq` n `seq` False = undefined
 
398
        loop s 0 = return s
 
399
        loop s n = do
 
400
          s0 <- getWord8 hnd
 
401
          s1 <- getWord8 hnd
 
402
          s2 <- getWord8 hnd
 
403
          s3 <- getWord8 hnd
 
404
          loop (s+s0+s1+s2+s3) (n-4)
 
405
 
 
406
getWord8N8 hnd = loop 0
 
407
  where loop s n | s `seq` n `seq` False = undefined
 
408
        loop s 0 = return s
 
409
        loop s n = do
 
410
          s0 <- getWord8 hnd
 
411
          s1 <- getWord8 hnd
 
412
          s2 <- getWord8 hnd
 
413
          s3 <- getWord8 hnd
 
414
          s4 <- getWord8 hnd
 
415
          s5 <- getWord8 hnd
 
416
          s6 <- getWord8 hnd
 
417
          s7 <- getWord8 hnd
 
418
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
 
419
 
 
420
getWord8N16 hnd = loop 0
 
421
  where loop s n | s `seq` n `seq` False = undefined
 
422
        loop s 0 = return s
 
423
        loop s n = do
 
424
          s0 <- getWord8 hnd
 
425
          s1 <- getWord8 hnd
 
426
          s2 <- getWord8 hnd
 
427
          s3 <- getWord8 hnd
 
428
          s4 <- getWord8 hnd
 
429
          s5 <- getWord8 hnd
 
430
          s6 <- getWord8 hnd
 
431
          s7 <- getWord8 hnd
 
432
          s8 <- getWord8 hnd
 
433
          s9 <- getWord8 hnd
 
434
          s10 <- getWord8 hnd
 
435
          s11 <- getWord8 hnd
 
436
          s12 <- getWord8 hnd
 
437
          s13 <- getWord8 hnd
 
438
          s14 <- getWord8 hnd
 
439
          s15 <- getWord8 hnd
 
440
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
 
441
 
 
442
 
 
443
getWord16N1 hnd = loop 0
 
444
  where loop s n | s `seq` n `seq` False = undefined
 
445
        loop s 0 = return s
 
446
        loop s n = do
 
447
          s0 <- getWord16be hnd
 
448
          loop (s+s0) (n-1)
 
449
 
 
450
getWord16N2 hnd = loop 0
 
451
  where loop s n | s `seq` n `seq` False = undefined
 
452
        loop s 0 = return s
 
453
        loop s n = do
 
454
          s0 <- getWord16be hnd
 
455
          s1 <- getWord16be hnd
 
456
          loop (s+s0+s1) (n-2)
 
457
 
 
458
getWord16N4 hnd = loop 0
 
459
  where loop s n | s `seq` n `seq` False = undefined
 
460
        loop s 0 = return s
 
461
        loop s n = do
 
462
          s0 <- getWord16be hnd
 
463
          s1 <- getWord16be hnd
 
464
          s2 <- getWord16be hnd
 
465
          s3 <- getWord16be hnd
 
466
          loop (s+s0+s1+s2+s3) (n-4)
 
467
 
 
468
getWord16N8 hnd = loop 0
 
469
  where loop s n | s `seq` n `seq` False = undefined
 
470
        loop s 0 = return s
 
471
        loop s n = do
 
472
          s0 <- getWord16be hnd
 
473
          s1 <- getWord16be hnd
 
474
          s2 <- getWord16be hnd
 
475
          s3 <- getWord16be hnd
 
476
          s4 <- getWord16be hnd
 
477
          s5 <- getWord16be hnd
 
478
          s6 <- getWord16be hnd
 
479
          s7 <- getWord16be hnd
 
480
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
 
481
 
 
482
getWord16N16 hnd = loop 0
 
483
  where loop s n | s `seq` n `seq` False = undefined
 
484
        loop s 0 = return s
 
485
        loop s n = do
 
486
          s0 <- getWord16be hnd
 
487
          s1 <- getWord16be hnd
 
488
          s2 <- getWord16be hnd
 
489
          s3 <- getWord16be hnd
 
490
          s4 <- getWord16be hnd
 
491
          s5 <- getWord16be hnd
 
492
          s6 <- getWord16be hnd
 
493
          s7 <- getWord16be hnd
 
494
          s8 <- getWord16be hnd
 
495
          s9 <- getWord16be hnd
 
496
          s10 <- getWord16be hnd
 
497
          s11 <- getWord16be hnd
 
498
          s12 <- getWord16be hnd
 
499
          s13 <- getWord16be hnd
 
500
          s14 <- getWord16be hnd
 
501
          s15 <- getWord16be hnd
 
502
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
 
503
 
 
504
 
 
505
getWord32N1 hnd = loop 0
 
506
  where loop s n | s `seq` n `seq` False = undefined
 
507
        loop s 0 = return s
 
508
        loop s n = do
 
509
          s0 <- getWord32be hnd
 
510
          loop (s+s0) (n-1)
 
511
 
 
512
getWord32N2 hnd = loop 0
 
513
  where loop s n | s `seq` n `seq` False = undefined
 
514
        loop s 0 = return s
 
515
        loop s n = do
 
516
          s0 <- getWord32be hnd
 
517
          s1 <- getWord32be hnd
 
518
          loop (s+s0+s1) (n-2)
 
519
 
 
520
getWord32N4 hnd = loop 0
 
521
  where loop s n | s `seq` n `seq` False = undefined
 
522
        loop s 0 = return s
 
523
        loop s n = do
 
524
          s0 <- getWord32be hnd
 
525
          s1 <- getWord32be hnd
 
526
          s2 <- getWord32be hnd
 
527
          s3 <- getWord32be hnd
 
528
          loop (s+s0+s1+s2+s3) (n-4)
 
529
 
 
530
getWord32N8 hnd = loop 0
 
531
  where loop s n | s `seq` n `seq` False = undefined
 
532
        loop s 0 = return s
 
533
        loop s n = do
 
534
          s0 <- getWord32be hnd
 
535
          s1 <- getWord32be hnd
 
536
          s2 <- getWord32be hnd
 
537
          s3 <- getWord32be hnd
 
538
          s4 <- getWord32be hnd
 
539
          s5 <- getWord32be hnd
 
540
          s6 <- getWord32be hnd
 
541
          s7 <- getWord32be hnd
 
542
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
 
543
 
 
544
getWord32N16 hnd = loop 0
 
545
  where loop s n | s `seq` n `seq` False = undefined
 
546
        loop s 0 = return s
 
547
        loop s n = do
 
548
          s0 <- getWord32be hnd
 
549
          s1 <- getWord32be hnd
 
550
          s2 <- getWord32be hnd
 
551
          s3 <- getWord32be hnd
 
552
          s4 <- getWord32be hnd
 
553
          s5 <- getWord32be hnd
 
554
          s6 <- getWord32be hnd
 
555
          s7 <- getWord32be hnd
 
556
          s8 <- getWord32be hnd
 
557
          s9 <- getWord32be hnd
 
558
          s10 <- getWord32be hnd
 
559
          s11 <- getWord32be hnd
 
560
          s12 <- getWord32be hnd
 
561
          s13 <- getWord32be hnd
 
562
          s14 <- getWord32be hnd
 
563
          s15 <- getWord32be hnd
 
564
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
 
565
 
 
566
getWord64N1 hnd = loop 0
 
567
  where loop s n | s `seq` n `seq` False = undefined
 
568
        loop s 0 = return s
 
569
        loop s n = do
 
570
          s0 <- getWord64be hnd
 
571
          loop (s+s0) (n-1)
 
572
 
 
573
getWord64N2 hnd = loop 0
 
574
  where loop s n | s `seq` n `seq` False = undefined
 
575
        loop s 0 = return s
 
576
        loop s n = do
 
577
          s0 <- getWord64be hnd
 
578
          s1 <- getWord64be hnd
 
579
          loop (s+s0+s1) (n-2)
 
580
 
 
581
getWord64N4 hnd = loop 0
 
582
  where loop s n | s `seq` n `seq` False = undefined
 
583
        loop s 0 = return s
 
584
        loop s n = do
 
585
          s0 <- getWord64be hnd
 
586
          s1 <- getWord64be hnd
 
587
          s2 <- getWord64be hnd
 
588
          s3 <- getWord64be hnd
 
589
          loop (s+s0+s1+s2+s3) (n-4)
 
590
 
 
591
getWord64N8 hnd = loop 0
 
592
  where loop s n | s `seq` n `seq` False = undefined
 
593
        loop s 0 = return s
 
594
        loop s n = do
 
595
          s0 <- getWord64be hnd
 
596
          s1 <- getWord64be hnd
 
597
          s2 <- getWord64be hnd
 
598
          s3 <- getWord64be hnd
 
599
          s4 <- getWord64be hnd
 
600
          s5 <- getWord64be hnd
 
601
          s6 <- getWord64be hnd
 
602
          s7 <- getWord64be hnd
 
603
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
 
604
 
 
605
getWord64N16 hnd = loop 0
 
606
  where loop s n | s `seq` n `seq` False = undefined
 
607
        loop s 0 = return s
 
608
        loop s n = do
 
609
          s0 <- getWord64be hnd
 
610
          s1 <- getWord64be hnd
 
611
          s2 <- getWord64be hnd
 
612
          s3 <- getWord64be hnd
 
613
          s4 <- getWord64be hnd
 
614
          s5 <- getWord64be hnd
 
615
          s6 <- getWord64be hnd
 
616
          s7 <- getWord64be hnd
 
617
          s8 <- getWord64be hnd
 
618
          s9 <- getWord64be hnd
 
619
          s10 <- getWord64be hnd
 
620
          s11 <- getWord64be hnd
 
621
          s12 <- getWord64be hnd
 
622
          s13 <- getWord64be hnd
 
623
          s14 <- getWord64be hnd
 
624
          s15 <- getWord64be hnd
 
625
          loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)