[project @ 1998-12-02 13:17:09 by simonm]
[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 PrelBase
29 import PrelIOBase ( IO(..) )
30 import Word     ( indexWord8OffAddr,  indexWord16OffAddr
31                 , indexWord32OffAddr, indexWord64OffAddr
32                 , readWord8OffAddr,   readWord16OffAddr
33                 , readWord32OffAddr,  readWord64OffAddr
34                 , writeWord8OffAddr,  writeWord16OffAddr
35                 , writeWord32OffAddr, writeWord64OffAddr
36                 )
37
38 import Int      ( indexInt8OffAddr,  indexInt16OffAddr
39                 , indexInt32OffAddr, indexInt64OffAddr
40                 , readInt8OffAddr,   readInt16OffAddr
41                 , readInt32OffAddr,  readInt64OffAddr
42                 , writeInt8OffAddr,  writeInt16OffAddr
43                 , writeInt32OffAddr, writeInt64OffAddr
44                 )
45 #endif
46
47 \end{code}
48
49 Coercing between machine ints and words
50
51 \begin{code}
52 addrToInt :: Addr -> Int
53 intToAddr :: Int -> Addr
54
55 #ifdef __HUGS__
56 addrToInt = primAddrToInt
57 intToAddr = primIntToAddr
58 #else
59 addrToInt (A# a#) = I# (addr2Int# a#)
60 intToAddr (I# i#) = A# (int2Addr# i#)
61 #endif
62 \end{code}
63
64 Indexing immutable memory:
65
66 \begin{code}
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
73
74 #ifdef __HUGS__
75 indexCharOffAddr   = primIndexCharOffAddr  
76 indexIntOffAddr    = primIndexIntOffAddr   
77 indexWordOffAddr   = primIndexWordOffAddr  
78 indexAddrOffAddr   = primIndexAddrOffAddr  
79 indexFloatOffAddr  = primIndexFloatOffAddr 
80 indexDoubleOffAddr = primIndexDoubleOffAddr
81 #else
82 indexCharOffAddr (A# addr#) n
83   = case n                              of { I# n# ->
84     case indexCharOffAddr# addr# n#     of { r# ->
85     (C# r#)}}
86
87 indexIntOffAddr (A# addr#) n
88   = case n                              of { I# n# ->
89     case indexIntOffAddr# addr# n#      of { r# ->
90     (I# r#)}}
91
92 indexWordOffAddr (A# addr#) n
93   = case n                              of { I# n# ->
94     case indexWordOffAddr# addr# n#     of { r# ->
95     (W# r#)}}
96
97 indexFloatOffAddr (A# addr#) n
98   = case n                              of { I# n# ->
99     case indexFloatOffAddr# addr# n#    of { r# ->
100     (F# r#)}}
101
102 indexDoubleOffAddr (A# addr#) n
103   = case n                              of { I# n# ->
104     case indexDoubleOffAddr# addr# n#   of { r# ->
105     (D# r#)}}
106 #endif
107 \end{code}
108
109 Indexing mutable memory:
110
111 \begin{code}
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
118
119 #ifdef __HUGS__
120 readCharOffAddr    = primReadCharOffAddr  
121 readIntOffAddr     = primReadIntOffAddr   
122 readWordOffAddr    = primReadWordOffAddr  
123 readAddrOffAddr    = primReadAddrOffAddr  
124 readFloatOffAddr   = primReadFloatOffAddr 
125 readDoubleOffAddr  = primReadDoubleOffAddr
126 #else
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
133 #endif
134 \end{code}
135
136
137 \begin{code}
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 ()
144
145 #ifdef __HUGS__
146 writeCharOffAddr    = primWriteCharOffAddr  
147 writeIntOffAddr     = primWriteIntOffAddr   
148 writeWordOffAddr    = primWriteWordOffAddr  
149 writeAddrOffAddr    = primWriteAddrOffAddr  
150 writeFloatOffAddr   = primWriteFloatOffAddr 
151 writeDoubleOffAddr  = primWriteDoubleOffAddr
152 #else
153 writeCharOffAddr (A# a#) (I# i#) (C# c#) = IO $ \ s# ->
154       case (writeCharOffAddr#  a# i# c# s#) of s2# -> (# s2#, () #)
155
156 writeIntOffAddr (A# a#) (I# i#) (I# e#) = IO $ \ s# ->
157       case (writeIntOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
158
159 writeWordOffAddr (A# a#) (I# i#) (W# e#) = IO $ \ s# ->
160       case (writeWordOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
161
162 writeAddrOffAddr (A# a#) (I# i#) (A# e#) = IO $ \ s# ->
163       case (writeAddrOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
164
165 writeFloatOffAddr (A# a#) (I# i#) (F# e#) = IO $ \ s# ->
166       case (writeFloatOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
167
168 writeDoubleOffAddr (A# a#) (I# i#) (D# e#) = IO $ \ s# ->
169       case (writeDoubleOffAddr#  a# i# e# s#) of s2# -> (# s2#, () #)
170 #endif
171 \end{code}