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