NCG: Split PprMach into arch specific modules
[ghc-hetmet.git] / compiler / nativeGen / MachCodeGen.hs
index da2b0ea..d94a906 100644 (file)
@@ -25,12 +25,11 @@ module MachCodeGen ( cmmTopCodeGen, InstrBlock ) where
 #include "MachDeps.h"
 
 -- NCG stuff:
-import MachInstrs
-import MachRegs
+import Instrs
+import Regs
 import NCGMonad
 import PositionIndependentCode
 import RegAllocInfo    ( mkBranchInstr, mkRegRegMoveInstr )
-import MachRegs
 import PprMach
 
 -- Our intermediate code:
@@ -41,6 +40,7 @@ import CLabel
 import ClosureInfo     ( C_SRT(..) )
 
 -- The rest:
+import BasicTypes
 import StaticFlags     ( opt_PIC )
 import ForeignCall     ( CCallConv(..) )
 import OrdList
@@ -3409,7 +3409,7 @@ outOfLineFloatOp mop res args
           code2 <- stmtToInstrs (CmmAssign (CmmLocal res) (CmmReg (CmmLocal tmp)))
           return (code1 `appOL` code2)
   where
-       lbl = mkForeignLabel fn Nothing False
+       lbl = mkForeignLabel fn Nothing False IsFunction
 
        fn = case mop of
              MO_F32_Sqrt  -> fsLit "sqrtf"
@@ -3842,7 +3842,7 @@ outOfLineFloatOp mop
        
        dflags  <- getDynFlagsNat
        mopExpr <- cmmMakeDynamicReference dflags addImportNat CallReference 
-               $  mkForeignLabel functionName Nothing True
+               $  mkForeignLabel functionName Nothing True IsFunction
 
        let mopLabelOrExpr 
                = case mopExpr of
@@ -3863,6 +3863,7 @@ outOfLineFloatOp_table mop
        MO_F32_Exp    -> fsLit "expf"
        MO_F32_Log    -> fsLit "logf"
        MO_F32_Sqrt   -> fsLit "sqrtf"
+       MO_F32_Pwr    -> fsLit "powf"
 
        MO_F32_Sin    -> fsLit "sinf"
        MO_F32_Cos    -> fsLit "cosf"
@@ -3879,6 +3880,7 @@ outOfLineFloatOp_table mop
        MO_F64_Exp    -> fsLit "exp"
        MO_F64_Log    -> fsLit "log"
        MO_F64_Sqrt   -> fsLit "sqrt"
+       MO_F64_Pwr    -> fsLit "pow"
 
        MO_F64_Sin    -> fsLit "sin"
        MO_F64_Cos    -> fsLit "cos"
@@ -4111,7 +4113,7 @@ genCCall target dest_regs argsAndHints
             do
                 dflags <- getDynFlagsNat
                 mopExpr <- cmmMakeDynamicReference dflags addImportNat CallReference $
-                              mkForeignLabel functionName Nothing True
+                              mkForeignLabel functionName Nothing True IsFunction
                 let mopLabelOrExpr = case mopExpr of
                         CmmLit (CmmLabel lbl) -> Left lbl
                         _ -> Right mopExpr
@@ -4309,8 +4311,8 @@ genSwitch expr ids
                        , SLL   e_reg (RIImm $ ImmInt 2) offset_reg
 
                        -- load and jump to the destination
-                       , LD    II32 (AddrRegReg base_reg offset_reg) dst
-                       , JMP   (AddrRegImm dst (ImmInt 0)) 
+                       , LD      II32 (AddrRegReg base_reg offset_reg) dst
+                       , JMP_TBL (AddrRegImm dst (ImmInt 0)) [i | Just i <- ids]
                        , NOP ]
 
 #else
@@ -5188,7 +5190,7 @@ coerceFP2Int fromRep toRep x = do
 -- We (allegedly) put the first six C-call arguments in registers;
 -- where do we start putting the rest of them?
 
--- Moved from MachInstrs (SDM):
+-- Moved from Instrs (SDM):
 
 #if alpha_TARGET_ARCH || sparc_TARGET_ARCH
 eXTRA_STK_ARGS_HERE :: Int