2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[Addr]{Module @Addr@}
18 -- (non-standard) coercions
19 , addrToInt -- :: Addr -> Int
20 , intToAddr -- :: Int -> Addr
29 import PrelIOBase ( IO(..) )
30 import Word ( indexWord8OffAddr, indexWord16OffAddr
31 , indexWord32OffAddr, indexWord64OffAddr
32 , readWord8OffAddr, readWord16OffAddr
33 , readWord32OffAddr, readWord64OffAddr
34 , writeWord8OffAddr, writeWord16OffAddr
35 , writeWord32OffAddr, writeWord64OffAddr
38 import Int ( indexInt8OffAddr, indexInt16OffAddr
39 , indexInt32OffAddr, indexInt64OffAddr
40 , readInt8OffAddr, readInt16OffAddr
41 , readInt32OffAddr, readInt64OffAddr
42 , writeInt8OffAddr, writeInt16OffAddr
43 , writeInt32OffAddr, writeInt64OffAddr
49 Coercing between machine ints and words
52 addrToInt :: Addr -> Int
53 intToAddr :: Int -> Addr
56 addrToInt = primAddrToInt
57 intToAddr = primIntToAddr
59 addrToInt (A# a#) = I# (addr2Int# a#)
60 intToAddr (I# i#) = A# (int2Addr# i#)
64 Indexing immutable memory:
67 indexCharOffAddr :: Addr -> Int -> Char
68 indexIntOffAddr :: Addr -> Int -> Int
69 indexWordOffAddr :: Addr -> Int -> Word
70 --in PrelAddr: indexAddrOffAddr :: Addr -> Int -> Addr
71 indexFloatOffAddr :: Addr -> Int -> Float
72 indexDoubleOffAddr :: Addr -> Int -> Double
75 indexCharOffAddr = primIndexCharOffAddr
76 indexIntOffAddr = primIndexIntOffAddr
77 indexWordOffAddr = primIndexWordOffAddr
78 indexAddrOffAddr = primIndexAddrOffAddr
79 indexFloatOffAddr = primIndexFloatOffAddr
80 indexDoubleOffAddr = primIndexDoubleOffAddr
82 indexCharOffAddr (A# addr#) n
83 = case n of { I# n# ->
84 case indexCharOffAddr# addr# n# of { r# ->
87 indexIntOffAddr (A# addr#) n
88 = case n of { I# n# ->
89 case indexIntOffAddr# addr# n# of { r# ->
92 indexWordOffAddr (A# addr#) n
93 = case n of { I# n# ->
94 case indexWordOffAddr# addr# n# of { r# ->
97 indexFloatOffAddr (A# addr#) n
98 = case n of { I# n# ->
99 case indexFloatOffAddr# addr# n# of { r# ->
102 indexDoubleOffAddr (A# addr#) n
103 = case n of { I# n# ->
104 case indexDoubleOffAddr# addr# n# of { r# ->
109 Indexing mutable memory:
112 readCharOffAddr :: Addr -> Int -> IO Char
113 readIntOffAddr :: Addr -> Int -> IO Int
114 readWordOffAddr :: Addr -> Int -> IO Word
115 readAddrOffAddr :: Addr -> Int -> IO Addr
116 readFloatOffAddr :: Addr -> Int -> IO Float
117 readDoubleOffAddr :: Addr -> Int -> IO Double
120 readCharOffAddr = primReadCharOffAddr
121 readIntOffAddr = primReadIntOffAddr
122 readWordOffAddr = primReadWordOffAddr
123 readAddrOffAddr = primReadAddrOffAddr
124 readFloatOffAddr = primReadFloatOffAddr
125 readDoubleOffAddr = primReadDoubleOffAddr
127 readCharOffAddr a i = _casm_ `` %r=(StgChar)(((StgChar*)%0)[(StgInt)%1]); '' a i
128 readIntOffAddr a i = _casm_ `` %r=(StgInt)(((StgInt*)%0)[(StgInt)%1]); '' a i
129 readWordOffAddr a i = _casm_ `` %r=(StgWord)(((StgWord*)%0)[(StgInt)%1]); '' a i
130 readAddrOffAddr a i = _casm_ `` %r=(StgAddr)(((StgAddr*)%0)[(StgInt)%1]); '' a i
131 readFloatOffAddr a i = _casm_ `` %r=(StgFloat)(((StgFloat*)%0)[(StgInt)%1]); '' a i
132 readDoubleOffAddr a i = _casm_ `` %r=(StgDouble)(((StgDouble*)%0)[(StgInt)%1]); '' a i
138 writeCharOffAddr :: Addr -> Int -> Char -> IO ()
139 writeIntOffAddr :: Addr -> Int -> Int -> IO ()
140 writeWordOffAddr :: Addr -> Int -> Word -> IO ()
141 writeAddrOffAddr :: Addr -> Int -> Addr -> IO ()
142 writeFloatOffAddr :: Addr -> Int -> Float -> IO ()
143 writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
146 writeCharOffAddr = primWriteCharOffAddr
147 writeIntOffAddr = primWriteIntOffAddr
148 writeWordOffAddr = primWriteWordOffAddr
149 writeAddrOffAddr = primWriteAddrOffAddr
150 writeFloatOffAddr = primWriteFloatOffAddr
151 writeDoubleOffAddr = primWriteDoubleOffAddr
153 writeCharOffAddr (A# a#) (I# i#) (C# c#) = IO $ \ s# ->
154 case (writeCharOffAddr# a# i# c# s#) of s2# -> (# s2#, () #)
156 writeIntOffAddr (A# a#) (I# i#) (I# e#) = IO $ \ s# ->
157 case (writeIntOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
159 writeWordOffAddr (A# a#) (I# i#) (W# e#) = IO $ \ s# ->
160 case (writeWordOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
162 writeAddrOffAddr (A# a#) (I# i#) (A# e#) = IO $ \ s# ->
163 case (writeAddrOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
165 writeFloatOffAddr (A# a#) (I# i#) (F# e#) = IO $ \ s# ->
166 case (writeFloatOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
168 writeDoubleOffAddr (A# a#) (I# i#) (D# e#) = IO $ \ s# ->
169 case (writeDoubleOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)