[project @ 2000-04-10 16:02:58 by simonpj]
[ghc-hetmet.git] / ghc / lib / std / PrelAddr.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1998
3 %
4
5 \section[PrelAddr]{Module @PrelAddr@}
6
7 \begin{code}
8 {-# OPTIONS -fcompiling-prelude -fno-implicit-prelude #-}
9
10 module PrelAddr (
11           Addr(..)
12         , nullAddr                      -- :: Addr
13         , plusAddr                      -- :: Addr -> Int -> Addr
14         , indexAddrOffAddr              -- :: Addr -> Int -> Addr
15
16         , Word(..)
17         , wordToInt
18         , intToWord
19
20         , Word64(..)
21         , Int64(..)
22    ) where
23
24 import PrelGHC
25 import PrelBase
26
27 infixl 5 `plusAddr`
28 \end{code}
29
30 \begin{code}
31 data Addr = A# Addr#    deriving (Eq, Ord)
32 data Word = W# Word#    deriving (Eq, Ord)
33
34 nullAddr :: Addr
35 nullAddr = A# (int2Addr# 0#)
36
37 plusAddr :: Addr -> Int -> Addr
38 plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
39
40 instance CCallable Addr
41 instance CReturnable Addr
42
43 instance CCallable Word
44 instance CReturnable Word
45
46 wordToInt :: Word -> Int
47 wordToInt (W# w#) = I# (word2Int# w#)
48
49 intToWord :: Int -> Word
50 intToWord (I# i#) = W# (int2Word# i#)
51
52 #if WORD_SIZE_IN_BYTES == 8
53 data Word64 = W64# Word#
54 data Int64  = I64# Int#
55 #else
56 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
57 data Int64  = I64# Int64#  --deriving (Eq, Ord) -- Glasgow extension
58 #endif
59
60 instance CCallable   Word64
61 instance CReturnable Word64
62
63 instance CCallable   Int64
64 instance CReturnable Int64
65
66 indexAddrOffAddr   :: Addr -> Int -> Addr
67 indexAddrOffAddr (A# addr#) n
68   = case n                              of { I# n# ->
69     case indexAddrOffAddr# addr# n#     of { r# ->
70     (A# r#)}}
71
72 \end{code}
73