3c9fb0a02ffa5a2a70aee36ed44d48a153c20a26
[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 -fno-implicit-prelude #-}
9
10 module PrelAddr (
11           Addr(..)
12         , AddrOff(..)
13         , nullAddr              -- :: Addr
14         , alignAddr             -- :: Addr -> Int -> Addr
15         , plusAddr              -- :: Addr -> AddrOff -> Addr
16         , minusAddr             -- :: Addr -> Addr -> AddrOff
17
18         , indexAddrOffAddr      -- :: Addr -> Int -> Addr
19
20         , Word(..)
21         , wordToInt
22         , intToWord
23
24         , Word64(..)
25         , Int64(..)
26    ) where
27
28 import PrelGHC
29 import PrelBase
30
31 infixl 5 `plusAddr`, `minusAddr`
32 \end{code}
33
34 \begin{code}
35 data Addr = A# Addr#    deriving (Eq, Ord)
36 data Word = W# Word#    deriving (Eq, Ord)
37
38 newtype AddrOff = AddrOff# Int
39
40 nullAddr :: Addr
41 nullAddr = A# (int2Addr# 0#)
42
43 alignAddr :: Addr -> Int -> Addr
44 alignAddr addr@(A# a) (I# i)
45   = case addr2Int# a    of { ai ->
46     case remInt# ai i   of {
47       0# -> addr;
48       n  -> A# (int2Addr# (ai +# (i -# n))) }}
49
50 plusAddr :: Addr -> AddrOff -> Addr
51 plusAddr (A# addr) (AddrOff# (I# off)) = A# (int2Addr# (addr2Int# addr +# off))
52
53 minusAddr :: Addr -> Addr -> AddrOff
54 minusAddr (A# a1) (A# a2) = AddrOff# (I# (addr2Int# a1 -# addr2Int# a2))
55
56 instance CCallable Addr
57 instance CReturnable Addr
58
59 instance CCallable Word
60 instance CReturnable Word
61
62 wordToInt :: Word -> Int
63 wordToInt (W# w#) = I# (word2Int# w#)
64
65 intToWord :: Int -> Word
66 intToWord (I# i#) = W# (int2Word# i#)
67
68 #if WORD_SIZE_IN_BYTES == 8
69 data Word64 = W64# Word#
70 data Int64  = I64# Int#
71 #else
72 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
73 data Int64  = I64# Int64#  --deriving (Eq, Ord) -- Glasgow extension
74 #endif
75
76 instance CCallable   Word64
77 instance CReturnable Word64
78
79 instance CCallable   Int64
80 instance CReturnable Int64
81
82 indexAddrOffAddr   :: Addr -> Int -> Addr
83 indexAddrOffAddr (A# addr#) n
84   = case n                              of { I# n# ->
85     case indexAddrOffAddr# addr# n#     of { r# ->
86     (A# r#)}}
87
88 \end{code}
89