1 % -----------------------------------------------------------------------------
2 % $Id: PrelAddr.lhs,v 1.18 2000/11/07 10:42:56 simonmar Exp $
4 % (c) The University of Glasgow, 1994-2000
7 \section[PrelAddr]{Module @PrelAddr@}
10 {-# OPTIONS -fno-implicit-prelude #-}
15 , alignAddr -- :: Addr -> Int -> Addr
16 , plusAddr -- :: Addr -> Int -> Addr
17 , minusAddr -- :: Addr -> Addr -> Int
19 , indexAddrOffAddr -- :: Addr -> Int -> Addr
32 infixl 5 `plusAddr`, `minusAddr`
36 data Addr = A# Addr# deriving (Eq, Ord)
37 data Word = W# Word# deriving (Eq, Ord)
40 nullAddr = A# (int2Addr# 0#)
42 alignAddr :: Addr -> Int -> Addr
43 alignAddr addr@(A# a) (I# i)
44 = case addr2Int# a of { ai ->
45 case remInt# ai i of {
47 n -> A# (int2Addr# (ai +# (i -# n))) }}
49 plusAddr :: Addr -> Int -> Addr
50 plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
52 minusAddr :: Addr -> Addr -> Int
53 minusAddr (A# a1) (A# a2) = I# (addr2Int# a1 -# addr2Int# a2)
55 instance CCallable Addr
56 instance CReturnable Addr
58 instance CCallable Word
59 instance CReturnable Word
61 wordToInt :: Word -> Int
62 wordToInt (W# w#) = I# (word2Int# w#)
64 intToWord :: Int -> Word
65 intToWord (I# i#) = W# (int2Word# i#)
67 #if WORD_SIZE_IN_BYTES == 8
68 data Word64 = W64# Word#
69 data Int64 = I64# Int#
71 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
72 data Int64 = I64# Int64# --deriving (Eq, Ord) -- Glasgow extension
75 instance CCallable Word64
76 instance CReturnable Word64
78 instance CCallable Int64
79 instance CReturnable Int64
81 indexAddrOffAddr :: Addr -> Int -> Addr
82 indexAddrOffAddr (A# addr#) n
83 = case n of { I# n# ->
84 case indexAddrOffAddr# addr# n# of { r# ->