blob: 7f8314c8df343d484aec59ce8679ffa133798037 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
{-# LANGUAGE MagicHash, UnboxedTuples #-}
import GHC.Prim
import Data.Vector.Storable.Mutable
import Foreign.Ptr
import GHC.ST
import Data.Primitive.ByteArray
import Control.Monad.Primitive
sameByteArray :: Control.Monad.Primitive.PrimMonad m => ByteArray -> ByteArray -> m Bool
sameByteArray ar1 ar2 =
do v1 <- unsafeThawByteArray ar1
v2 <- unsafeThawByteArray ar2
return $ sameMutableByteArray v1 v2
pf0 (ByteArray by) = ByteArray ( prefetchByteArray0# by 1#)
pf1 (ByteArray by) = ByteArray (prefetchByteArray1# by 1#)
pf2 (ByteArray by) = ByteArray ( prefetchByteArray2# by 1#)
pf3 (ByteArray by) = ByteArray ( prefetchByteArray3# by 1#)
monoSame v f = sameByteArray v (f v)
main :: IO ()
main = do
mv1 <- newByteArray 17
v1 <- unsafeFreezeByteArray mv1
return ()
t0<- monoSame v1 pf0
t1 <- monoSame v1 pf1
t2 <- monoSame v1 pf2
t3 <- monoSame v1 pf3
if t0 && t1 && t2 && t3 then putStrLn "success" else error "bad prefetch operation! please report"
|