[project @ 2000-04-12 15:32:11 by panne]
[ghc-hetmet.git] / ghc / lib / std / PrelAddr.lhs
index 70f4a7c..8bd90f2 100644 (file)
@@ -5,16 +5,21 @@
 \section[PrelAddr]{Module @PrelAddr@}
 
 \begin{code}
-{-# OPTIONS -fno-implicit-prelude #-}
+{-# OPTIONS -fcompiling-prelude -fno-implicit-prelude #-}
 
 module PrelAddr (
          Addr(..)
-       , nullAddr                      -- :: Addr
-       , plusAddr                      -- :: Addr -> Int -> Addr
-       , indexAddrOffAddr              -- :: Addr -> Int -> Addr
+       , AddrOff(..)
+       , nullAddr              -- :: Addr
+       , alignAddr             -- :: Addr -> Int -> Addr
+       , plusAddr              -- :: Addr -> AddrOff -> Addr
+       , minusAddr             -- :: Addr -> Addr -> AddrOff
+
+       , indexAddrOffAddr      -- :: Addr -> Int -> Addr
 
        , Word(..)
        , wordToInt
+       , intToWord
 
        , Word64(..)
        , Int64(..)
@@ -22,18 +27,31 @@ module PrelAddr (
 
 import PrelGHC
 import PrelBase
-import PrelCCall
+
+infixl 5 `plusAddr`, `minusAddr`
 \end{code}
 
 \begin{code}
 data Addr = A# Addr#   deriving (Eq, Ord)
 data Word = W# Word#   deriving (Eq, Ord)
 
+newtype AddrOff = AddrOff# Int
+
 nullAddr :: Addr
 nullAddr = A# (int2Addr# 0#)
 
-plusAddr :: Addr -> Int -> Addr
-plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
+alignAddr :: Addr -> Int -> Addr
+alignAddr addr@(A# a) (I# i)
+  = case addr2Int# a   of { ai ->
+    case remInt# ai i  of {
+      0# -> addr;
+      n  -> A# (int2Addr# (ai +# (i -# n))) }}
+
+plusAddr :: Addr -> AddrOff -> Addr
+plusAddr (A# addr) (AddrOff# (I# off)) = A# (int2Addr# (addr2Int# addr +# off))
+
+minusAddr :: Addr -> Addr -> AddrOff
+minusAddr (A# a1) (A# a2) = AddrOff# (I# (addr2Int# a1 -# addr2Int# a2))
 
 instance CCallable Addr
 instance CReturnable Addr
@@ -44,6 +62,9 @@ instance CReturnable Word
 wordToInt :: Word -> Int
 wordToInt (W# w#) = I# (word2Int# w#)
 
+intToWord :: Int -> Word
+intToWord (I# i#) = W# (int2Word# i#)
+
 #if WORD_SIZE_IN_BYTES == 8
 data Word64 = W64# Word#
 data Int64  = I64# Int#