Rename a constructor CmmForeignCall to CmmCallee, and tidy Cmm code
[ghc-hetmet.git] / compiler / cmm / PprC.hs
index 1a909f2..238fd61 100644 (file)
@@ -199,7 +199,7 @@ pprStmt stmt = case stmt of
        where
          rep = cmmExprRep src
 
-    CmmCall (CmmForeignCall fn cconv) results args safety ->
+    CmmCall (CmmCallee fn cconv) results args safety ->
        -- Controversial: leave this out for now.
        -- pprUndef fn $$
 
@@ -322,8 +322,9 @@ pprExpr e = case e of
        -> char '*' <> pprAsPtrReg r
 
     CmmLoad (CmmRegOff r off) rep
-       | isPtrReg r && rep == wordRep 
+       | isPtrReg r && rep == wordRep && (off `rem` wORD_SIZE == 0)
        -- ToDo: check that the offset is a word multiple?
+        --       (For tagging to work, I had to avoid unaligned loads. --ARY)
        -> pprAsPtrReg r <> brackets (ppr (off `shiftR` wordShift))
 
     CmmLoad expr rep ->
@@ -632,12 +633,12 @@ pprAssign r1 (CmmRegOff r2 off)
 -- We can't cast the lvalue, so we have to cast the rhs if necessary.  Casting
 -- the lvalue elicits a warning from new GCC versions (3.4+).
 pprAssign r1 r2
-  | isFixedPtrReg r1
-  = pprReg r1 <> ptext SLIT(" = ") <> mkP_ <> pprExpr1 r2 <> semi
-  | Just ty <- strangeRegType r1
-  = pprReg r1 <> ptext SLIT(" = ") <> parens ty <> pprExpr1 r2 <> semi
-  | otherwise
-  = pprReg r1 <> ptext SLIT(" = ") <> pprExpr r2 <> semi
+  | isFixedPtrReg r1             = mkAssign (mkP_ <> pprExpr1 r2)
+  | Just ty <- strangeRegType r1 = mkAssign (parens ty <> pprExpr1 r2)
+  | otherwise                    = mkAssign (pprExpr r2)
+    where mkAssign x = if r1 == CmmGlobal BaseReg
+                       then ptext SLIT("ASSIGN_BaseReg") <> parens x <> semi
+                       else pprReg r1 <> ptext SLIT(" = ") <> x <> semi
 
 -- ---------------------------------------------------------------------
 -- Registers
@@ -794,12 +795,8 @@ pprExternDecl in_srt lbl
   | not (needsCDecl lbl) = empty
   | otherwise              = 
        hcat [ visibility, label_type (labelType lbl), 
-              lparen, dyn_wrapper (pprCLabel lbl), text ");" ]
+              lparen, pprCLabel lbl, text ");" ]
  where
-  dyn_wrapper d
-    | in_srt && labelDynamic lbl = text "DLL_IMPORT_DATA_VAR" <> parens d
-    | otherwise                         = d
-
   label_type CodeLabel = ptext SLIT("F_")
   label_type DataLabel = ptext SLIT("I_")