SPARC NCG: Split up into chunks, and fix warnings.
[ghc-hetmet.git] / compiler / nativeGen / SPARC / Base.hs
index 1549ab5..fa79cec 100644 (file)
@@ -10,7 +10,9 @@ module SPARC.Base (
        wordLengthInBits,
        spillAreaLength,
        spillSlotSize,
+       extraStackArgsHere,
        fits13Bits,
+       is32BitInteger,
        largeOffsetError
 )
 
@@ -19,6 +21,9 @@ where
 import qualified Constants
 import Panic
 
+import Data.Int
+
+
 -- On 32 bit SPARC, pointers are 32 bits.
 wordLength :: Int
 wordLength = 4
@@ -37,11 +42,28 @@ spillSlotSize :: Int
 spillSlotSize = 8
 
 
+-- | We (allegedly) put the first six C-call arguments in registers;
+--     where do we start putting the rest of them?
+extraStackArgsHere :: Int
+extraStackArgsHere = 23
+
+
 {-# SPECIALIZE fits13Bits :: Int -> Bool, Integer -> Bool #-}
 -- | Check whether an offset is representable with 13 bits.
 fits13Bits :: Integral a => a -> Bool
 fits13Bits x = x >= -4096 && x < 4096
 
+-- | Check whether an integer will fit in 32 bits.
+--     A CmmInt is intended to be truncated to the appropriate 
+--     number of bits, so here we truncate it to Int64.  This is
+--     important because e.g. -1 as a CmmInt might be either
+--     -1 or 18446744073709551615.
+--
+is32BitInteger :: Integer -> Bool
+is32BitInteger i 
+       = i64 <= 0x7fffffff && i64 >= -0x80000000
+       where i64 = fromIntegral i :: Int64
+
 
 -- | Sadness.
 largeOffsetError :: Integral a => a -> b
@@ -49,3 +71,5 @@ largeOffsetError i
   = panic ("ERROR: SPARC native-code generator cannot handle large offset ("
                ++ show i ++ ");\nprobably because of large constant data structures;" ++ 
                "\nworkaround: use -fvia-C on this module.\n")
+
+