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