summaryrefslogtreecommitdiff
path: root/compiler/nativeGen/PprMach.hs
diff options
context:
space:
mode:
authorBertram Felgenhauer <int-e@gmx.de>2007-11-21 06:39:42 +0000
committerBertram Felgenhauer <int-e@gmx.de>2007-11-21 06:39:42 +0000
commit14a8072ba80f151e09c855342f48fc9cd4501d1e (patch)
tree0c1e5d37dd80a309ae468664b0c06daf35c9d862 /compiler/nativeGen/PprMach.hs
parent3d44e49e2e2371ba1686fb967987e8098e4e58a7 (diff)
downloadhaskell-14a8072ba80f151e09c855342f48fc9cd4501d1e.tar.gz
(native gen) fix code generated for GDTOI on x86_32
See trac #1910.
Diffstat (limited to 'compiler/nativeGen/PprMach.hs')
-rw-r--r--compiler/nativeGen/PprMach.hs15
1 files changed, 12 insertions, 3 deletions
diff --git a/compiler/nativeGen/PprMach.hs b/compiler/nativeGen/PprMach.hs
index 51159559ed..5210940f50 100644
--- a/compiler/nativeGen/PprMach.hs
+++ b/compiler/nativeGen/PprMach.hs
@@ -1408,9 +1408,18 @@ pprInstr g@(GLD1 dst)
pprInstr g@(GFTOI src dst)
= pprInstr (GDTOI src dst)
pprInstr g@(GDTOI src dst)
- = pprG g (hcat [gtab, text "subl $4, %esp ; ",
- gpush src 0, gsemi, text "fistpl 0(%esp) ; popl ",
- pprReg I32 dst])
+ = pprG g (vcat [
+ hcat [gtab, text "subl $8, %esp ; fnstcw 4(%esp)"],
+ hcat [gtab, gpush src 0],
+ hcat [gtab, text "movzwl 4(%esp), ", reg,
+ text " ; orl $0xC00, ", reg],
+ hcat [gtab, text "movl ", reg, text ", 0(%esp) ; fldcw 0(%esp)"],
+ hcat [gtab, text "fistpl 0(%esp)"],
+ hcat [gtab, text "fldcw 4(%esp) ; movl 0(%esp), ", reg],
+ hcat [gtab, text "addl $8, %esp"]
+ ])
+ where
+ reg = pprReg I32 dst
pprInstr g@(GITOF src dst)
= pprInstr (GITOD src dst)