summaryrefslogtreecommitdiff
path: root/compiler/llvmGen/Llvm
diff options
context:
space:
mode:
authorDavid Terei <davidterei@gmail.com>2010-06-22 12:16:42 +0000
committerDavid Terei <davidterei@gmail.com>2010-06-22 12:16:42 +0000
commit9e58a660bd80277669ef7a367ff6367fda51a8a4 (patch)
tree69def7c4e5d965aed01ea07c5a03c48ca6c09317 /compiler/llvmGen/Llvm
parent3aadff5e31bf6b665cf7ae7606c94cdab85624d2 (diff)
downloadhaskell-9e58a660bd80277669ef7a367ff6367fda51a8a4.tar.gz
Fix handling of float literals in llvm BE
Diffstat (limited to 'compiler/llvmGen/Llvm')
-rw-r--r--compiler/llvmGen/Llvm/Types.hs12
1 files changed, 11 insertions, 1 deletions
diff --git a/compiler/llvmGen/Llvm/Types.hs b/compiler/llvmGen/Llvm/Types.hs
index ac909d191c..19a441f1b3 100644
--- a/compiler/llvmGen/Llvm/Types.hs
+++ b/compiler/llvmGen/Llvm/Types.hs
@@ -191,7 +191,9 @@ getPlainName (LMLitVar x ) = getLit x
-- | Print a literal value. No type.
getLit :: LlvmLit -> String
getLit (LMIntLit i _) = show ((fromInteger i)::Int)
-getLit (LMFloatLit r _) = dToStr r
+getLit (LMFloatLit r LMFloat ) = fToStr $ realToFrac r
+getLit (LMFloatLit r LMDouble) = dToStr r
+getLit f@(LMFloatLit _ _) = error $ "Can't print this float literal!" ++ show f
-- | Return the 'LlvmType' of the 'LlvmVar'
getVarType :: LlvmVar -> LlvmType
@@ -705,6 +707,14 @@ dToStr d
str = map toUpper $ concat . fixEndian . (map hex) $ bs
in "0x" ++ str
+-- | Convert a Haskell Float to an LLVM hex encoded floating point form.
+-- LLVM uses the same encoding for both floats and doubles (16 digit hex
+-- string) but floats must have the last half all zeroes so it can fit into
+-- a float size type.
+{-# NOINLINE fToStr #-}
+fToStr :: Float -> String
+fToStr = (dToStr . realToFrac)
+
-- | Reverse or leave byte data alone to fix endianness on this target.
fixEndian :: [a] -> [a]
#ifdef WORDS_BIGENDIAN