1 % -----------------------------------------------------------------------------
2 % $Id: PrelAddr.lhs,v 1.17 2000/06/30 13:39:35 simonmar Exp $
4 % (c) The University of Glasgow, 1994-2000
7 \section[PrelAddr]{Module @PrelAddr@}
10 {-# OPTIONS -fno-implicit-prelude #-}
16 , alignAddr -- :: Addr -> Int -> Addr
17 , plusAddr -- :: Addr -> AddrOff -> Addr
18 , minusAddr -- :: Addr -> Addr -> AddrOff
20 , indexAddrOffAddr -- :: Addr -> Int -> Addr
33 infixl 5 `plusAddr`, `minusAddr`
37 data Addr = A# Addr# deriving (Eq, Ord)
38 data Word = W# Word# deriving (Eq, Ord)
40 newtype AddrOff = AddrOff# Int
43 nullAddr = A# (int2Addr# 0#)
45 alignAddr :: Addr -> Int -> Addr
46 alignAddr addr@(A# a) (I# i)
47 = case addr2Int# a of { ai ->
48 case remInt# ai i of {
50 n -> A# (int2Addr# (ai +# (i -# n))) }}
52 plusAddr :: Addr -> AddrOff -> Addr
53 plusAddr (A# addr) (AddrOff# (I# off)) = A# (int2Addr# (addr2Int# addr +# off))
55 minusAddr :: Addr -> Addr -> AddrOff
56 minusAddr (A# a1) (A# a2) = AddrOff# (I# (addr2Int# a1 -# addr2Int# a2))
58 instance CCallable Addr
59 instance CReturnable Addr
61 instance CCallable Word
62 instance CReturnable Word
64 wordToInt :: Word -> Int
65 wordToInt (W# w#) = I# (word2Int# w#)
67 intToWord :: Int -> Word
68 intToWord (I# i#) = W# (int2Word# i#)
70 #if WORD_SIZE_IN_BYTES == 8
71 data Word64 = W64# Word#
72 data Int64 = I64# Int#
74 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
75 data Int64 = I64# Int64# --deriving (Eq, Ord) -- Glasgow extension
78 instance CCallable Word64
79 instance CReturnable Word64
81 instance CCallable Int64
82 instance CReturnable Int64
84 indexAddrOffAddr :: Addr -> Int -> Addr
85 indexAddrOffAddr (A# addr#) n
86 = case n of { I# n# ->
87 case indexAddrOffAddr# addr# n# of { r# ->