2 % (c) The AQUA Project, Glasgow University, 1994-1998
5 \section[PrelAddr]{Module @PrelAddr@}
8 {-# OPTIONS -fcompiling-prelude -fno-implicit-prelude #-}
14 , alignAddr -- :: Addr -> Int -> Addr
15 , plusAddr -- :: Addr -> AddrOff -> Addr
16 , minusAddr -- :: Addr -> Addr -> AddrOff
18 , indexAddrOffAddr -- :: Addr -> Int -> Addr
31 infixl 5 `plusAddr`, `minusAddr`
35 data Addr = A# Addr# deriving (Eq, Ord)
36 data Word = W# Word# deriving (Eq, Ord)
38 newtype AddrOff = AddrOff# Int
41 nullAddr = A# (int2Addr# 0#)
43 alignAddr :: Addr -> Int -> Addr
44 alignAddr addr@(A# a) (I# i)
45 = case addr2Int# a of { ai ->
46 case remInt# ai i of {
48 n -> A# (int2Addr# (ai +# (i -# n))) }}
50 plusAddr :: Addr -> AddrOff -> Addr
51 plusAddr (A# addr) (AddrOff# (I# off)) = A# (int2Addr# (addr2Int# addr +# off))
53 minusAddr :: Addr -> Addr -> AddrOff
54 minusAddr (A# a1) (A# a2) = AddrOff# (I# (addr2Int# a1 -# addr2Int# a2))
56 instance CCallable Addr
57 instance CReturnable Addr
59 instance CCallable Word
60 instance CReturnable Word
62 wordToInt :: Word -> Int
63 wordToInt (W# w#) = I# (word2Int# w#)
65 intToWord :: Int -> Word
66 intToWord (I# i#) = W# (int2Word# i#)
68 #if WORD_SIZE_IN_BYTES == 8
69 data Word64 = W64# Word#
70 data Int64 = I64# Int#
72 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
73 data Int64 = I64# Int64# --deriving (Eq, Ord) -- Glasgow extension
76 instance CCallable Word64
77 instance CReturnable Word64
79 instance CCallable Int64
80 instance CReturnable Int64
82 indexAddrOffAddr :: Addr -> Int -> Addr
83 indexAddrOffAddr (A# addr#) n
84 = case n of { I# n# ->
85 case indexAddrOffAddr# addr# n# of { r# ->