diff options
author | Ian Lynagh <ian@well-typed.com> | 2012-12-13 22:00:15 +0000 |
---|---|---|
committer | Ian Lynagh <ian@well-typed.com> | 2012-12-13 22:00:15 +0000 |
commit | ab9de78dc557697c03f70b46f699a6520a7985ab (patch) | |
tree | f409491d96d89c9d8c0effab7d973e8c5eb4aaf6 /compiler/nativeGen | |
parent | e2564ce2878db7157f67e7710633b4cb1b2db0b0 (diff) | |
parent | 2e8c769422740c001e0a247bfec61d4f78598582 (diff) | |
download | haskell-ab9de78dc557697c03f70b46f699a6520a7985ab.tar.gz |
Merge branch 'master' of darcs.haskell.org:/srv/darcs//ghc
Diffstat (limited to 'compiler/nativeGen')
-rw-r--r-- | compiler/nativeGen/CPrim.hs | 12 | ||||
-rw-r--r-- | compiler/nativeGen/PPC/CodeGen.hs | 2 | ||||
-rw-r--r-- | compiler/nativeGen/SPARC/CodeGen.hs | 2 | ||||
-rw-r--r-- | compiler/nativeGen/X86/CodeGen.hs | 13 |
4 files changed, 28 insertions, 1 deletions
diff --git a/compiler/nativeGen/CPrim.hs b/compiler/nativeGen/CPrim.hs index 09707ac5ae..dd9d38f434 100644 --- a/compiler/nativeGen/CPrim.hs +++ b/compiler/nativeGen/CPrim.hs @@ -1,5 +1,8 @@ -- | Generating C symbol names emitted by the compiler. -module CPrim (popCntLabel) where +module CPrim + ( popCntLabel + , word2FloatLabel + ) where import CmmType import Outputable @@ -12,3 +15,10 @@ popCntLabel w = "hs_popcnt" ++ pprWidth w pprWidth W32 = "32" pprWidth W64 = "64" pprWidth w = pprPanic "popCntLabel: Unsupported word width " (ppr w) + +word2FloatLabel :: Width -> String +word2FloatLabel w = "hs_word2float" ++ pprWidth w + where + pprWidth W32 = "32" + pprWidth W64 = "64" + pprWidth w = pprPanic "word2FloatLabel: Unsupported word width " (ppr w) diff --git a/compiler/nativeGen/PPC/CodeGen.hs b/compiler/nativeGen/PPC/CodeGen.hs index 5e05047f34..e9a5b433f6 100644 --- a/compiler/nativeGen/PPC/CodeGen.hs +++ b/compiler/nativeGen/PPC/CodeGen.hs @@ -1149,6 +1149,8 @@ genCCall' dflags gcp target dest_regs args0 MO_F64_Tanh -> (fsLit "tanh", False) MO_F64_Pwr -> (fsLit "pow", False) + MO_UF_Conv w -> (fsLit $ word2FloatLabel w, False) + MO_Memcpy -> (fsLit "memcpy", False) MO_Memset -> (fsLit "memset", False) MO_Memmove -> (fsLit "memmove", False) diff --git a/compiler/nativeGen/SPARC/CodeGen.hs b/compiler/nativeGen/SPARC/CodeGen.hs index f3b70e7e61..880b5c6bba 100644 --- a/compiler/nativeGen/SPARC/CodeGen.hs +++ b/compiler/nativeGen/SPARC/CodeGen.hs @@ -641,6 +641,8 @@ outOfLineMachOp_table mop MO_F64_Cosh -> fsLit "cosh" MO_F64_Tanh -> fsLit "tanh" + MO_UF_Conv w -> fsLit $ word2FloatLabel w + MO_Memcpy -> fsLit "memcpy" MO_Memset -> fsLit "memset" MO_Memmove -> fsLit "memmove" diff --git a/compiler/nativeGen/X86/CodeGen.hs b/compiler/nativeGen/X86/CodeGen.hs index 36f9e2d231..30cf060e74 100644 --- a/compiler/nativeGen/X86/CodeGen.hs +++ b/compiler/nativeGen/X86/CodeGen.hs @@ -1659,6 +1659,17 @@ genCCall is32Bit (PrimTarget (MO_PopCnt width)) dest_regs@[dst] size = intSize width lbl = mkCmmCodeLabel primPackageId (fsLit (popCntLabel width)) +genCCall is32Bit (PrimTarget (MO_UF_Conv width)) dest_regs args = do + dflags <- getDynFlags + targetExpr <- cmmMakeDynamicReference dflags addImportNat + CallReference lbl + let target = ForeignTarget targetExpr (ForeignConvention CCallConv + [NoHint] [NoHint] + CmmMayReturn) + genCCall is32Bit target dest_regs args + where + lbl = mkCmmCodeLabel primPackageId (fsLit (word2FloatLabel width)) + genCCall is32Bit target dest_regs args | is32Bit = genCCall32 target dest_regs args | otherwise = genCCall64 target dest_regs args @@ -2280,6 +2291,8 @@ outOfLineCmmOp mop res args MO_PopCnt _ -> fsLit "popcnt" + MO_UF_Conv _ -> unsupported + MO_S_QuotRem {} -> unsupported MO_U_QuotRem {} -> unsupported MO_U_QuotRem2 {} -> unsupported |