2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[Addr]{Module @Addr@}
17 import PrelCCall ( Word(..) )
19 import Word ( indexWord8OffAddr, indexWord16OffAddr
20 , indexWord32OffAddr, indexWord64OffAddr
21 , readWord8OffAddr, readWord16OffAddr
22 , readWord32OffAddr, readWord64OffAddr
23 , writeWord8OffAddr, writeWord16OffAddr
24 , writeWord32OffAddr, writeWord64OffAddr
27 import Int ( indexInt8OffAddr, indexInt16OffAddr
28 , indexInt32OffAddr, indexInt64OffAddr
29 , readInt8OffAddr, readInt16OffAddr
30 , readInt32OffAddr, readInt64OffAddr
31 , writeInt8OffAddr, writeInt16OffAddr
32 , writeInt32OffAddr, writeInt64OffAddr
37 Indexing immutable memory:
40 indexCharOffAddr :: Addr -> Int -> Char
41 indexIntOffAddr :: Addr -> Int -> Int
42 indexWordOffAddr :: Addr -> Int -> Word
43 --in PrelAddr: indexAddrOffAddr :: Addr -> Int -> Addr
44 indexFloatOffAddr :: Addr -> Int -> Float
45 indexDoubleOffAddr :: Addr -> Int -> Double
47 indexCharOffAddr (A# addr#) n
48 = case n of { I# n# ->
49 case indexCharOffAddr# addr# n# of { r# ->
52 indexIntOffAddr (A# addr#) n
53 = case n of { I# n# ->
54 case indexIntOffAddr# addr# n# of { r# ->
57 indexWordOffAddr (A# addr#) n
58 = case n of { I# n# ->
59 case indexWordOffAddr# addr# n# of { r# ->
62 indexFloatOffAddr (A# addr#) n
63 = case n of { I# n# ->
64 case indexFloatOffAddr# addr# n# of { r# ->
67 indexDoubleOffAddr (A# addr#) n
68 = case n of { I# n# ->
69 case indexDoubleOffAddr# addr# n# of { r# ->
73 Indexing mutable memory:
76 readCharOffAddr :: Addr -> Int -> IO Char
77 readCharOffAddr a i = _casm_ `` %r=(StgChar)(((StgChar*)%0)[(StgInt)%1]); '' a i
79 readIntOffAddr :: Addr -> Int -> IO Int
80 readIntOffAddr a i = _casm_ `` %r=(StgInt)(((StgInt*)%0)[(StgInt)%1]); '' a i
82 readWordOffAddr :: Addr -> Int -> IO Word
83 readWordOffAddr a i = _casm_ `` %r=(StgWord)(((StgWord*)%0)[(StgInt)%1]); '' a i
85 readAddrOffAddr :: Addr -> Int -> IO Addr
86 readAddrOffAddr a i = _casm_ `` %r=(StgAddr)(((StgAddr*)%0)[(StgInt)%1]); '' a i
88 readFloatOffAddr :: Addr -> Int -> IO Float
89 readFloatOffAddr a i = _casm_ `` %r=(StgFloat)(((StgFloat*)%0)[(StgInt)%1]); '' a i
91 readDoubleOffAddr :: Addr -> Int -> IO Double
92 readDoubleOffAddr a i = _casm_ `` %r=(StgDouble)(((StgDouble*)%0)[(StgInt)%1]); '' a i
97 writeCharOffAddr :: Addr -> Int -> Char -> IO ()
98 writeCharOffAddr a i e = _casm_ `` (((StgChar*)%0)[(StgInt)%1])=(StgChar)%2; '' a i e
100 writeIntOffAddr :: Addr -> Int -> Int -> IO ()
101 writeIntOffAddr a i e = _casm_ `` (((StgInt*)%0)[(StgInt)%1])=(StgInt)%2; '' a i e
103 writeWordOffAddr :: Addr -> Int -> Word -> IO ()
104 writeWordOffAddr a i e = _casm_ `` (((StgWord*)%0)[(StgInt)%1])=(StgWord)%2; '' a i e
106 writeAddrOffAddr :: Addr -> Int -> Addr -> IO ()
107 writeAddrOffAddr a i e = _casm_ `` (((StgAddr*)%0)[(StgInt)%1])=(StgAddr)%2; '' a i e
109 writeFloatOffAddr :: Addr -> Int -> Float -> IO ()
110 writeFloatOffAddr a i e = _casm_ `` (((StgFloat*)%0)[(StgInt)%1])=(StgFloat)%2; '' a i e
112 writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
113 writeDoubleOffAddr a i e = _casm_ `` (((StgDouble*)%0)[(StgInt)%1])=(StgDouble)%2; '' a i e