Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
Alex D
GHC
Commits
4bb4a1cf
Commit
4bb4a1cf
authored
Jun 21, 2010
by
dterei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix negate op not working for -0 in llvm backend
parent
f9686dd4
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
11 additions
and
18 deletions
+11
-18
compiler/llvmGen/Llvm/Types.hs
compiler/llvmGen/Llvm/Types.hs
+7
-15
compiler/llvmGen/LlvmCodeGen/CodeGen.hs
compiler/llvmGen/LlvmCodeGen/CodeGen.hs
+3
-2
compiler/llvmGen/LlvmCodeGen/Data.hs
compiler/llvmGen/LlvmCodeGen/Data.hs
+1
-1
No files found.
compiler/llvmGen/Llvm/Types.hs
View file @
4bb4a1cf
...
...
@@ -95,7 +95,7 @@ data LlvmLit
-- | Refers to an integer constant (i64 42).
=
LMIntLit
Integer
LlvmType
-- | Floating point literal
|
LMFloatLit
Rational
LlvmType
|
LMFloatLit
Double
LlvmType
deriving
(
Eq
)
instance
Show
LlvmLit
where
...
...
@@ -191,12 +191,8 @@ getPlainName (LMLitVar x ) = getLit x
-- | Print a literal value. No type.
getLit
::
LlvmLit
->
String
getLit
(
LMIntLit
i
_
)
=
show
((
fromInteger
i
)
::
Int
)
-- In Llvm float literals can be printed in a big-endian hexadecimal format,
-- regardless of underlying architecture.
getLit
(
LMFloatLit
r
LMFloat
)
=
fToStr
$
fromRational
r
getLit
(
LMFloatLit
r
LMDouble
)
=
dToStr
$
fromRational
r
getLit
l
=
error
$
"getLit: Usupported LlvmLit type! "
++
show
(
getLitType
l
)
getLit
(
LMIntLit
i
_
)
=
show
((
fromInteger
i
)
::
Int
)
getLit
(
LMFloatLit
r
_
)
=
dToStr
r
-- | Return the 'LlvmType' of the 'LlvmVar'
getVarType
::
LlvmVar
->
LlvmType
...
...
@@ -695,11 +691,9 @@ instance Show LlvmCastOp where
-- * Floating point conversion
--
-- | Convert a Haskell Float to an LLVM hex encoded floating point form
fToStr
::
Float
->
String
fToStr
f
=
dToStr
$
realToFrac
f
-- | Convert a Haskell Double to an LLVM hex encoded floating point form
-- | Convert a Haskell Double to an LLVM hex encoded floating point form. In
-- Llvm float literals can be printed in a big-endian hexadecimal format,
-- regardless of underlying architecture.
dToStr
::
Double
->
String
dToStr
d
=
let
bs
=
doubleToBytes
d
...
...
@@ -712,9 +706,7 @@ dToStr d
str
=
map
toUpper
$
concat
.
fixEndian
.
(
map
hex
)
$
bs
in
"0x"
++
str
-- | Reverse or leave byte data alone to fix endianness on this
-- target. LLVM generally wants things in Big-Endian form
-- regardless of target architecture.
-- | Reverse or leave byte data alone to fix endianness on this target.
fixEndian
::
[
a
]
->
[
a
]
#
ifdef
WORDS_BIGENDIAN
fixEndian
=
id
...
...
compiler/llvmGen/LlvmCodeGen/CodeGen.hs
View file @
4bb4a1cf
...
...
@@ -558,7 +558,7 @@ genMachOp env _ op [x] = case op of
in
negate
(
widthToLlvmInt
w
)
all0
LM_MO_Sub
MO_F_Neg
w
->
let
all0
=
LMLitVar
$
LMFloatLit
0
(
widthToLlvmFloat
w
)
let
all0
=
LMLitVar
$
LMFloatLit
(
-
0
)
(
widthToLlvmFloat
w
)
in
negate
(
widthToLlvmFloat
w
)
all0
LM_MO_Sub
MO_SF_Conv
_
w
->
fiConv
(
widthToLlvmFloat
w
)
LM_Sitofp
...
...
@@ -807,7 +807,8 @@ genLit env (CmmInt i w)
=
return
(
env
,
mkIntLit
i
(
LMInt
$
widthInBits
w
),
nilOL
,
[]
)
genLit
env
(
CmmFloat
r
w
)
=
return
(
env
,
LMLitVar
$
LMFloatLit
r
(
widthToLlvmFloat
w
),
nilOL
,
[]
)
=
return
(
env
,
LMLitVar
$
LMFloatLit
(
fromRational
r
)
(
widthToLlvmFloat
w
),
nilOL
,
[]
)
genLit
env
cmm
@
(
CmmLabel
l
)
=
let
label
=
strCLabel_llvm
l
...
...
compiler/llvmGen/LlvmCodeGen/Data.hs
View file @
4bb4a1cf
...
...
@@ -168,7 +168,7 @@ genStaticLit (CmmInt i w)
=
Right
$
LMStaticLit
(
LMIntLit
i
(
LMInt
$
widthInBits
w
))
genStaticLit
(
CmmFloat
r
w
)
=
Right
$
LMStaticLit
(
LMFloatLit
r
(
widthToLlvmFloat
w
))
=
Right
$
LMStaticLit
(
LMFloatLit
(
fromRational
r
)
(
widthToLlvmFloat
w
))
-- Leave unresolved, will fix later
genStaticLit
c
@
(
CmmLabel
_
)
=
Left
$
c
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment