minor changes to Cmm left over from September 2007
[ghc-hetmet.git] / compiler / cmm / CmmUtils.hs
index a04935b..c44cc3a 100644 (file)
@@ -1,8 +1,15 @@
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 -----------------------------------------------------------------------------
 --
 -- Cmm utilities.
 --
--- (c) The University of Glasgow 2004
+-- (c) The University of Glasgow 2004-2006
 --
 -----------------------------------------------------------------------------
 
@@ -18,15 +25,18 @@ module CmmUtils(
        mkIntCLit, zeroCLit,
 
        mkLblExpr,
+
+        loadArgsIntoTemps, maybeAssignTemp,
   ) where
 
 #include "HsVersions.h"
 
-import CLabel          ( CLabel )
+import CLabel
 import Cmm
 import MachOp
 import OrdList
 import Outputable
+import Unique
 
 ---------------------------------------------------
 --
@@ -118,6 +128,7 @@ cmmOffsetExpr e byte_off = CmmMachOp (MO_Add (cmmExprRep e)) [e, byte_off]
 -- a later optimisation step on Cmm).
 --
 cmmOffset :: CmmExpr -> Int -> CmmExpr
+cmmOffset e                 0        = e
 cmmOffset (CmmReg reg)      byte_off = cmmRegOff reg byte_off
 cmmOffset (CmmRegOff reg m) byte_off = cmmRegOff reg (m+byte_off)
 cmmOffset (CmmLit lit)      byte_off = CmmLit (cmmOffsetLit lit byte_off)
@@ -175,3 +186,28 @@ zeroCLit = CmmInt 0 wordRep
 
 mkLblExpr :: CLabel -> CmmExpr
 mkLblExpr lbl = CmmLit (CmmLabel lbl)
+
+---------------------------------------------------
+--
+--     Helpers for foreign call arguments
+--
+---------------------------------------------------
+
+loadArgsIntoTemps :: [Unique]
+                  -> CmmActuals
+                  -> ([Unique], [CmmStmt], CmmActuals)
+loadArgsIntoTemps uniques [] = (uniques, [], [])
+loadArgsIntoTemps uniques ((CmmHinted e hint):args) =
+    (uniques'',
+     new_stmts ++ remaining_stmts,
+     (CmmHinted new_e hint) : remaining_e)
+    where
+      (uniques', new_stmts, new_e) = maybeAssignTemp uniques e
+      (uniques'', remaining_stmts, remaining_e) =
+          loadArgsIntoTemps uniques' args
+
+maybeAssignTemp :: [Unique] -> CmmExpr -> ([Unique], [CmmStmt], CmmExpr)
+maybeAssignTemp uniques e
+    | hasNoGlobalRegs e = (uniques, [], e)
+    | otherwise         = (tail uniques, [CmmAssign local e], CmmReg local)
+    where local = CmmLocal (LocalReg (head uniques) (cmmExprRep e) GCKindNonPtr)