6d9149d60f018ee5d38e50c5a828d8c3602c0615
[ghc-hetmet.git] / ghc / lib / exts / Addr.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1996
3 %
4
5 \section[Addr]{Module @Addr@}
6
7 \begin{code}
8 module Addr 
9         ( Addr
10
11         , module Addr
12 #ifndef __HUGS__
13         , module Word
14         , module Int
15         , module PrelAddr 
16 #endif
17
18         -- (non-standard) coercions
19         , addrToInt             -- :: Addr -> Int  
20         , intToAddr             -- :: Int  -> Addr
21             
22         ) where
23
24 #ifdef __HUGS__
25 import PreludeBuiltin
26 #else
27 import PrelAddr
28 import PrelForeign
29 import PrelStable
30 import PrelBase
31 import PrelIOBase ( IO(..) )
32 import Word     ( indexWord8OffAddr,  indexWord16OffAddr
33                 , indexWord32OffAddr, indexWord64OffAddr
34                 , readWord8OffAddr,   readWord16OffAddr
35                 , readWord32OffAddr,  readWord64OffAddr
36                 , writeWord8OffAddr,  writeWord16OffAddr
37                 , writeWord32OffAddr, writeWord64OffAddr
38                 )
39
40 import Int      ( indexInt8OffAddr,  indexInt16OffAddr
41                 , indexInt32OffAddr, indexInt64OffAddr
42                 , readInt8OffAddr,   readInt16OffAddr
43                 , readInt32OffAddr,  readInt64OffAddr
44                 , writeInt8OffAddr,  writeInt16OffAddr
45                 , writeInt32OffAddr, writeInt64OffAddr
46                 )
47 #endif
48
49 \end{code}
50
51 Coercing between machine ints and words
52
53 \begin{code}
54 addrToInt :: Addr -> Int
55 intToAddr :: Int -> Addr
56
57 #ifdef __HUGS__
58 addrToInt = primAddrToInt
59 intToAddr = primIntToAddr
60 #else
61 addrToInt (A# a#) = I# (addr2Int# a#)
62 intToAddr (I# i#) = A# (int2Addr# i#)
63 #endif
64 \end{code}
65
66 Indexing immutable memory:
67
68 \begin{code}
69 indexCharOffAddr   :: Addr -> Int -> Char
70 indexIntOffAddr    :: Addr -> Int -> Int
71 indexWordOffAddr   :: Addr -> Int -> Word
72 --in PrelAddr: indexAddrOffAddr   :: Addr -> Int -> Addr
73 indexFloatOffAddr  :: Addr -> Int -> Float
74 indexDoubleOffAddr :: Addr -> Int -> Double
75
76 #ifdef __HUGS__
77 indexCharOffAddr   = primIndexCharOffAddr  
78 indexIntOffAddr    = primIndexIntOffAddr   
79 indexWordOffAddr   = primIndexWordOffAddr  
80 indexAddrOffAddr   = primIndexAddrOffAddr  
81 indexFloatOffAddr  = primIndexFloatOffAddr 
82 indexDoubleOffAddr = primIndexDoubleOffAddr
83 #else
84 indexCharOffAddr (A# addr#) n
85   = case n                              of { I# n# ->
86     case indexCharOffAddr# addr# n#     of { r# ->
87     (C# r#)}}
88
89 indexIntOffAddr (A# addr#) n
90   = case n                              of { I# n# ->
91     case indexIntOffAddr# addr# n#      of { r# ->
92     (I# r#)}}
93
94 indexWordOffAddr (A# addr#) n
95   = case n                              of { I# n# ->
96     case indexWordOffAddr# addr# n#     of { r# ->
97     (W# r#)}}
98
99 indexFloatOffAddr (A# addr#) n
100   = case n                              of { I# n# ->
101     case indexFloatOffAddr# addr# n#    of { r# ->
102     (F# r#)}}
103
104 indexDoubleOffAddr (A# addr#) n
105   = case n                              of { I# n# ->
106     case indexDoubleOffAddr# addr# n#   of { r# ->
107     (D# r#)}}
108 #endif
109 \end{code}
110
111 Indexing mutable memory:
112
113 \begin{code}
114 readCharOffAddr    :: Addr -> Int -> IO Char
115 readIntOffAddr     :: Addr -> Int -> IO Int
116 readWordOffAddr    :: Addr -> Int -> IO Word
117 readAddrOffAddr    :: Addr -> Int -> IO Addr
118 readFloatOffAddr   :: Addr -> Int -> IO Float
119 readDoubleOffAddr  :: Addr -> Int -> IO Double
120
121 #ifdef __HUGS__
122 readCharOffAddr    = primReadCharOffAddr  
123 readIntOffAddr     = primReadIntOffAddr   
124 readWordOffAddr    = primReadWordOffAddr  
125 readAddrOffAddr    = primReadAddrOffAddr  
126 readFloatOffAddr   = primReadFloatOffAddr 
127 readDoubleOffAddr  = primReadDoubleOffAddr
128 #else
129 readCharOffAddr   a i = _casm_ `` %r=(StgChar)(((StgChar*)%0)[(StgInt)%1]); '' a i
130 readIntOffAddr    a i = _casm_ `` %r=(StgInt)(((StgInt*)%0)[(StgInt)%1]); '' a i
131 readWordOffAddr   a i = _casm_ `` %r=(StgWord)(((StgWord*)%0)[(StgInt)%1]); '' a i
132 readAddrOffAddr   a i = _casm_ `` %r=(StgAddr)(((StgAddr*)%0)[(StgInt)%1]); '' a i
133 readFloatOffAddr  a i = _casm_ `` %r=(StgFloat)(((StgFloat*)%0)[(StgInt)%1]); '' a i
134 readDoubleOffAddr a i = _casm_ `` %r=(StgDouble)(((StgDouble*)%0)[(StgInt)%1]); '' a i
135
136 readStablePtrOffAddr    :: Addr -> Int -> IO (StablePtr a)
137 readStablePtrOffAddr a i = _casm_ `` %r=(StgStablePtr)(((StgStablePtr*)%0)[(StgInt)%1]); '' a i
138 #endif
139 \end{code}
140
141
142 \begin{code}
143 writeCharOffAddr   :: Addr -> Int -> Char   -> IO ()
144 writeIntOffAddr    :: Addr -> Int -> Int    -> IO ()
145 writeWordOffAddr   :: Addr -> Int -> Word  -> IO ()
146 writeAddrOffAddr   :: Addr -> Int -> Addr   -> IO ()
147 writeFloatOffAddr  :: Addr -> Int -> Float  -> IO ()
148 writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
149
150 #ifdef __HUGS__
151 writeCharOffAddr    = primWriteCharOffAddr  
152 writeIntOffAddr     = primWriteIntOffAddr   
153 writeWordOffAddr    = primWriteWordOffAddr  
154 writeAddrOffAddr    = primWriteAddrOffAddr  
155 writeFloatOffAddr   = primWriteFloatOffAddr 
156 writeDoubleOffAddr  = primWriteDoubleOffAddr
157 #else
158 writeCharOffAddr (A# a#) (I# i#) (C# c#) = IO $ \ s# ->
159       case (writeCharOffAddr#  a# i# c# s#) of s2# -> (# s2#, () #)
160
161 writeIntOffAddr (A# a#) (I# i#) (I# e#) = IO $ \ s# ->
162       case (writeIntOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
163
164 writeWordOffAddr (A# a#) (I# i#) (W# e#) = IO $ \ s# ->
165       case (writeWordOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
166
167 writeAddrOffAddr (A# a#) (I# i#) (A# e#) = IO $ \ s# ->
168       case (writeAddrOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
169
170 writeFloatOffAddr (A# a#) (I# i#) (F# e#) = IO $ \ s# ->
171       case (writeFloatOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
172
173 writeDoubleOffAddr (A# a#) (I# i#) (D# e#) = IO $ \ s# ->
174       case (writeDoubleOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
175
176 #ifndef __PARALLEL_HASKELL__
177 writeForeignObjOffAddr   :: Addr -> Int -> ForeignObj -> IO ()
178 writeForeignObjOffAddr (A# a#) (I# i#) (ForeignObj e#) = IO $ \ s# ->
179       case (writeForeignObjOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
180 #endif
181
182 writeStablePtrOffAddr    :: Addr -> Int -> StablePtr a -> IO ()
183 writeStablePtrOffAddr (A# a#) (I# i#) (StablePtr e#) = IO $ \ s# ->
184       case (writeStablePtrOffAddr#  a# i# e# s#) of s2# -> (# s2# , () #)
185
186 #endif
187 \end{code}