b9b789cb29c523645e6ae6f70536c2cf5248552a
[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         ( module PrelAddr
10         , module Word
11         , module Int
12         , module Addr 
13             
14         ) where
15
16 import PrelAddr
17 import PrelCCall  ( Word(..) )
18 import PrelBase
19 import Word     ( indexWord8OffAddr,  indexWord16OffAddr
20                 , indexWord32OffAddr, indexWord64OffAddr
21                 , readWord8OffAddr,   readWord16OffAddr
22                 , readWord32OffAddr,  readWord64OffAddr
23                 , writeWord8OffAddr,  writeWord16OffAddr
24                 , writeWord32OffAddr, writeWord64OffAddr
25                 )
26
27 import Int      ( indexInt8OffAddr,  indexInt16OffAddr
28                 , indexInt32OffAddr, indexInt64OffAddr
29                 , readInt8OffAddr,   readInt16OffAddr
30                 , readInt32OffAddr,  readInt64OffAddr
31                 , writeInt8OffAddr,  writeInt16OffAddr
32                 , writeInt32OffAddr, writeInt64OffAddr
33                 )
34
35 \end{code}
36
37 Indexing immutable memory:
38
39 \begin{code}
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
46
47 indexCharOffAddr (A# addr#) n
48   = case n                              of { I# n# ->
49     case indexCharOffAddr# addr# n#     of { r# ->
50     (C# r#)}}
51
52 indexIntOffAddr (A# addr#) n
53   = case n                              of { I# n# ->
54     case indexIntOffAddr# addr# n#      of { r# ->
55     (I# r#)}}
56
57 indexWordOffAddr (A# addr#) n
58   = case n                              of { I# n# ->
59     case indexWordOffAddr# addr# n#     of { r# ->
60     (W# r#)}}
61
62 indexFloatOffAddr (A# addr#) n
63   = case n                              of { I# n# ->
64     case indexFloatOffAddr# addr# n#    of { r# ->
65     (F# r#)}}
66
67 indexDoubleOffAddr (A# addr#) n
68   = case n                              of { I# n# ->
69     case indexDoubleOffAddr# addr# n#   of { r# ->
70     (D# r#)}}
71 \end{code}
72
73 Indexing mutable memory:
74
75 \begin{code}
76 readCharOffAddr    :: Addr -> Int -> IO Char
77 readCharOffAddr a i = _casm_ `` %r=(StgChar)(((StgChar*)%0)[(StgInt)%1]); '' a i
78
79 readIntOffAddr    :: Addr -> Int -> IO Int
80 readIntOffAddr a i = _casm_ `` %r=(StgInt)(((StgInt*)%0)[(StgInt)%1]); '' a i
81
82 readWordOffAddr    :: Addr -> Int -> IO Word
83 readWordOffAddr a i = _casm_ `` %r=(StgWord)(((StgWord*)%0)[(StgInt)%1]); '' a i
84
85 readAddrOffAddr    :: Addr -> Int -> IO Addr
86 readAddrOffAddr a i = _casm_ `` %r=(StgAddr)(((StgAddr*)%0)[(StgInt)%1]); '' a i
87
88 readFloatOffAddr    :: Addr -> Int -> IO Float
89 readFloatOffAddr a i = _casm_ `` %r=(StgFloat)(((StgFloat*)%0)[(StgInt)%1]); '' a i
90
91 readDoubleOffAddr  :: Addr -> Int -> IO Double
92 readDoubleOffAddr a i = _casm_ `` %r=(StgDouble)(((StgDouble*)%0)[(StgInt)%1]); '' a i
93 \end{code}
94
95
96 \begin{code}
97 writeCharOffAddr   :: Addr -> Int -> Char   -> IO ()
98 writeCharOffAddr a i e = _casm_ `` (((StgChar*)%0)[(StgInt)%1])=(StgChar)%2; '' a i e
99
100 writeIntOffAddr    :: Addr -> Int -> Int    -> IO ()
101 writeIntOffAddr a i e = _casm_ `` (((StgInt*)%0)[(StgInt)%1])=(StgInt)%2; '' a i e
102
103 writeWordOffAddr    :: Addr -> Int -> Word  -> IO ()
104 writeWordOffAddr a i e = _casm_ `` (((StgWord*)%0)[(StgInt)%1])=(StgWord)%2; '' a i e
105
106 writeAddrOffAddr   :: Addr -> Int -> Addr   -> IO ()
107 writeAddrOffAddr a i e = _casm_ `` (((StgAddr*)%0)[(StgInt)%1])=(StgAddr)%2; '' a i e
108
109 writeFloatOffAddr  :: Addr -> Int -> Float  -> IO ()
110 writeFloatOffAddr a i e = _casm_ `` (((StgFloat*)%0)[(StgInt)%1])=(StgFloat)%2; '' a i e
111
112 writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
113 writeDoubleOffAddr a i e = _casm_ `` (((StgDouble*)%0)[(StgInt)%1])=(StgDouble)%2; '' a i e
114 \end{code}