Add some more generic (en|de)code(Double|Float) code
[ghc-hetmet.git] / compiler / cmm / CLabel.hs
index 28c43e1..f9a94b7 100644 (file)
@@ -1,3 +1,10 @@
+{-# 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
+
 -----------------------------------------------------------------------------
 --
 -- Object-file symbols (called CLabel for histerical raisins).
@@ -6,13 +13,6 @@
 --
 -----------------------------------------------------------------------------
 
-{-# 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
-
 module CLabel (
        CLabel, -- abstract type
 
@@ -105,6 +105,7 @@ module CLabel (
 
        infoLblToEntryLbl, entryLblToInfoLbl,
        needsCDecl, isAsmTemp, maybeAsmTemp, externallyVisibleCLabel,
+        isMathFun,
        CLabelType(..), labelType, labelDynamic,
 
        pprCLabel
@@ -325,7 +326,8 @@ mkAltLabel      uniq tag    = CaseLabel uniq (CaseAlt tag)
 mkDefaultLabel  uniq           = CaseLabel uniq CaseDefault
 
 mkStringLitLabel               = StringLitLabel
-mkAsmTempLabel                         = AsmTempLabel
+mkAsmTempLabel :: Uniquable a => a -> CLabel
+mkAsmTempLabel a               = AsmTempLabel (getUnique a)
 
 mkModuleInitLabel :: Module -> String -> CLabel
 mkModuleInitLabel mod way        = ModuleInitLabel mod way
@@ -444,6 +446,8 @@ entryLblToInfoLbl l = pprPanic "CLabel.entryLblToInfoLbl" (pprCLabel l)
 
 -- -----------------------------------------------------------------------------
 -- Does a CLabel need declaring before use or not?
+--
+-- See wiki:Commentary/Compiler/Backends/PprC#Prototypes
 
 needsCDecl :: CLabel -> Bool
   -- False <=> it's pre-declared; don't bother
@@ -461,7 +465,7 @@ needsCDecl ModuleRegdLabel          = False
 needsCDecl (StringLitLabel _)          = False
 needsCDecl (AsmTempLabel _)            = False
 needsCDecl (RtsLabel _)                        = False
-needsCDecl (ForeignLabel _ _ _)                = False
+needsCDecl l@(ForeignLabel _ _ _)      = not (isMathFun l)
 needsCDecl (CC_Label _)                        = True
 needsCDecl (CCS_Label _)               = True
 needsCDecl (HpcTicksLabel _)            = True
@@ -477,6 +481,25 @@ maybeAsmTemp :: CLabel -> Maybe Unique
 maybeAsmTemp (AsmTempLabel uq) = Just uq
 maybeAsmTemp _                        = Nothing
 
+-- some labels have C prototypes in scope when compiling via C, because
+-- they are builtin to the C compiler.  For these labels we avoid
+-- generating our own C prototypes.
+isMathFun :: CLabel -> Bool
+isMathFun (ForeignLabel fs _ _) = fs `elem` math_funs
+  where
+  math_funs = [
+        FSLIT("pow"),    FSLIT("sin"),   FSLIT("cos"),
+        FSLIT("tan"),    FSLIT("sinh"),  FSLIT("cosh"),
+        FSLIT("tanh"),   FSLIT("asin"),  FSLIT("acos"),
+        FSLIT("atan"),   FSLIT("log"),   FSLIT("exp"),
+        FSLIT("sqrt"),   FSLIT("powf"),  FSLIT("sinf"),
+        FSLIT("cosf"),   FSLIT("tanf"),  FSLIT("sinhf"),
+        FSLIT("coshf"),  FSLIT("tanhf"), FSLIT("asinf"),
+        FSLIT("acosf"),  FSLIT("atanf"), FSLIT("logf"),
+        FSLIT("expf"),   FSLIT("sqrtf")
+   ]
+isMathFun _ = False
+
 -- -----------------------------------------------------------------------------
 -- Is a CLabel visible outside this object file or not?