Moved global register saving from the backend to codeGen
[ghc-hetmet.git] / compiler / cmm / PprC.hs
index d1536bf..d9bdca5 100644 (file)
@@ -51,9 +51,7 @@ import PprCmm         () -- instances only
 -- import Debug.Trace
 #endif
 
-#if __GLASGOW_HASKELL__ >= 504
 import Data.Array.ST
-#endif
 import Control.Monad.ST
 
 #if x86_64_TARGET_ARCH
@@ -200,11 +198,11 @@ pprStmt stmt = case stmt of
        where
          rep = cmmExprRep src
 
-    CmmCall (CmmForeignCall fn cconv) results args volatile -> 
+    CmmCall (CmmForeignCall fn cconv) results args ->
        -- Controversial: leave this out for now.
        -- pprUndef fn $$
 
-       pprCall ppr_fn cconv results args volatile
+       pprCall ppr_fn cconv results args
        where
        ppr_fn = case fn of
                   CmmLit (CmmLabel lbl) -> pprCLabel lbl
@@ -221,8 +219,8 @@ pprStmt stmt = case stmt of
           ptext SLIT("#undef") <+> pprCLabel lbl
        pprUndef _ = empty
 
-    CmmCall (CmmPrim op) results args volatile -> 
-       pprCall ppr_fn CCallConv results args volatile
+    CmmCall (CmmPrim op) results args ->
+       pprCall ppr_fn CCallConv results args
        where
        ppr_fn = pprCallishMachOp_for_C op
 
@@ -433,6 +431,9 @@ pprStatics (CmmStaticLit (CmmInt i I64) : rest)
 #endif
   where r = i .&. 0xffffffff
        q = i `shiftR` 32
+pprStatics (CmmStaticLit (CmmInt i rep) : rest)
+  | machRepByteWidth rep /= wORD_SIZE
+  = panic "pprStatics: cannot emit a non-word-sized static literal"
 pprStatics (CmmStaticLit lit : rest)
   = pprLit1 lit : pprStatics rest
 pprStatics (other : rest)
@@ -718,15 +719,14 @@ pprLocalReg (LocalReg uniq _rep) = char '_' <> ppr uniq
 -- Foreign Calls
 
 pprCall :: SDoc -> CCallConv -> [(CmmReg,MachHint)] -> [(CmmExpr,MachHint)]
-       -> Maybe [GlobalReg] -> SDoc
+       -> SDoc
 
-pprCall ppr_fn cconv results args vols
+pprCall ppr_fn cconv results args
   | not (is_cish cconv)
   = panic "pprCall: unknown calling convention"
 
   | otherwise
-  = save vols $$
-    ptext SLIT("CALLER_SAVE_SYSTEM") $$
+  =
 #if x86_64_TARGET_ARCH
        -- HACK around gcc optimisations.
        -- x86_64 needs a __DISCARD__() here, to create a barrier between
@@ -738,9 +738,7 @@ pprCall ppr_fn cconv results args vols
        then ptext SLIT("__DISCARD__();") 
        else empty) $$
 #endif
-    ppr_assign results (ppr_fn <> parens (commafy (map pprArg args))) <> semi $$
-    ptext SLIT("CALLER_RESTORE_SYSTEM") $$
-    restore vols
+    ppr_assign results (ppr_fn <> parens (commafy (map pprArg args))) <> semi
   where 
      ppr_assign []           rhs = rhs
      ppr_assign [(reg@(CmmGlobal BaseReg), hint)] rhs
@@ -768,15 +766,6 @@ pprCall ppr_fn cconv results args vols
      pprUnHint SignedHint rep = parens (machRepCType rep)
      pprUnHint _          _   = empty
 
-     save    = save_restore SLIT("CALLER_SAVE")
-     restore = save_restore SLIT("CALLER_RESTORE")
-
-       -- Nothing says "I don't know what's live; save everything"
-       -- CALLER_SAVE_USER is defined in ghc/includes/Regs.h
-     save_restore txt Nothing     = ptext txt <> ptext SLIT("_USER")
-     save_restore txt (Just these) = vcat (map saveRestoreGlobal these)
-       where saveRestoreGlobal r = ptext txt <> char '_' <> pprGlobalRegName r
-
 pprGlobalRegName :: GlobalReg -> SDoc
 pprGlobalRegName gr = case gr of
     VanillaReg n   -> char 'R' <> int n  -- without the .w suffix
@@ -858,7 +847,7 @@ te_Lit _ = return ()
 te_Stmt :: CmmStmt -> TE ()
 te_Stmt (CmmAssign r e)                = te_Reg r >> te_Expr e
 te_Stmt (CmmStore l r)         = te_Expr l >> te_Expr r
-te_Stmt (CmmCall _ rs es _)    = mapM_ (te_Reg.fst) rs >>
+te_Stmt (CmmCall _ rs es)      = mapM_ (te_Reg.fst) rs >>
                                  mapM_ (te_Expr.fst) es
 te_Stmt (CmmCondBranch e _)    = te_Expr e
 te_Stmt (CmmSwitch e _)                = te_Expr e
@@ -962,46 +951,20 @@ big_doubles
   | machRepByteWidth F64 == wORD_SIZE      = False
   | otherwise = panic "big_doubles"
 
-#if __GLASGOW_HASKELL__ >= 504
-newFloatArray :: (Int,Int) -> ST s (STUArray s Int Float)
-newFloatArray = newArray_
-
-newDoubleArray :: (Int,Int) -> ST s (STUArray s Int Double)
-newDoubleArray = newArray_
-
 castFloatToIntArray :: STUArray s Int Float -> ST s (STUArray s Int Int)
 castFloatToIntArray = castSTUArray
 
 castDoubleToIntArray :: STUArray s Int Double -> ST s (STUArray s Int Int)
 castDoubleToIntArray = castSTUArray
 
-writeFloatArray :: STUArray s Int Float -> Int -> Float -> ST s ()
-writeFloatArray = writeArray
-
-writeDoubleArray :: STUArray s Int Double -> Int -> Double -> ST s ()
-writeDoubleArray = writeArray
-
-readIntArray :: STUArray s Int Int -> Int -> ST s Int
-readIntArray = readArray
-
-#else
-
-castFloatToIntArray :: MutableByteArray s t -> ST s (MutableByteArray s t)
-castFloatToIntArray = return
-
-castDoubleToIntArray :: MutableByteArray s t -> ST s (MutableByteArray s t)
-castDoubleToIntArray = return
-
-#endif
-
 -- floats are always 1 word
 floatToWord :: Rational -> CmmLit
 floatToWord r
   = runST (do
-       arr <- newFloatArray ((0::Int),0)
-       writeFloatArray arr 0 (fromRational r)
+       arr <- newArray_ ((0::Int),0)
+       writeArray arr 0 (fromRational r)
        arr' <- castFloatToIntArray arr
-       i <- readIntArray arr' 0
+       i <- readArray arr' 0
        return (CmmInt (toInteger i) wordRep)
     )
 
@@ -1009,21 +972,21 @@ doubleToWords :: Rational -> [CmmLit]
 doubleToWords r
   | big_doubles                                -- doubles are 2 words
   = runST (do
-       arr <- newDoubleArray ((0::Int),1)
-       writeDoubleArray arr 0 (fromRational r)
+       arr <- newArray_ ((0::Int),1)
+       writeArray arr 0 (fromRational r)
        arr' <- castDoubleToIntArray arr
-       i1 <- readIntArray arr' 0
-       i2 <- readIntArray arr' 1
+       i1 <- readArray arr' 0
+       i2 <- readArray arr' 1
        return [ CmmInt (toInteger i1) wordRep
               , CmmInt (toInteger i2) wordRep
               ]
     )
   | otherwise                          -- doubles are 1 word
   = runST (do
-       arr <- newDoubleArray ((0::Int),0)
-       writeDoubleArray arr 0 (fromRational r)
+       arr <- newArray_ ((0::Int),0)
+       writeArray arr 0 (fromRational r)
        arr' <- castDoubleToIntArray arr
-       i <- readIntArray arr' 0
+       i <- readArray arr' 0
        return [ CmmInt (toInteger i) wordRep ]
     )