[project @ 2000-04-12 15:32:11 by panne]
[ghc-hetmet.git] / ghc / lib / std / PrelAddr.lhs
index c0b5939..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,43 +27,50 @@ module PrelAddr (
 
 import PrelGHC
 import PrelBase
-import PrelShow
-import PrelCCall
+
+infixl 5 `plusAddr`, `minusAddr`
 \end{code}
 
 \begin{code}
 data Addr = A# Addr#   deriving (Eq, Ord)
 data Word = W# Word#   deriving (Eq, Ord)
 
-instance Show Addr where
-   showsPrec p (A# a) = showsPrec p (I# (addr2Int# a))
+newtype AddrOff = AddrOff# Int
 
 nullAddr :: Addr
-nullAddr = ``NULL''
+nullAddr = A# (int2Addr# 0#)
+
+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 -> Int -> Addr
-plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
+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 CCallable Addr#
 instance CReturnable Addr
 
 instance CCallable Word
-instance CCallable Word#
 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#
 #else
 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
 data Int64  = I64# Int64#  --deriving (Eq, Ord) -- Glasgow extension
-
-instance CCallable   Word64#
-instance CCallable   Int64#
 #endif
 
 instance CCallable   Word64