projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix linear register allocator bug involving read/write to same registers.
[ghc-hetmet.git]
/
compiler
/
nativeGen
/
X86
/
Ppr.hs
diff --git
a/compiler/nativeGen/X86/Ppr.hs
b/compiler/nativeGen/X86/Ppr.hs
index
0ca230b
..
5fe78e1
100644
(file)
--- a/
compiler/nativeGen/X86/Ppr.hs
+++ b/
compiler/nativeGen/X86/Ppr.hs
@@
-32,16
+32,17
@@
import Reg
import PprBase
import PprBase
-import BlockId
-import Cmm
+import OldCmm
import CLabel
import CLabel
-import Unique ( pprUnique )
+import Config
+import Unique ( pprUnique, Uniquable(..) )
import Pretty
import FastString
import qualified Outputable
import Outputable (panic, Outputable)
import Data.Word
import Pretty
import FastString
import qualified Outputable
import Outputable (panic, Outputable)
import Data.Word
+import Distribution.System
#if i386_TARGET_ARCH && darwin_TARGET_OS
import Data.Bits
#if i386_TARGET_ARCH && darwin_TARGET_OS
import Data.Bits
@@
-55,9
+56,9
@@
pprNatCmmTop (CmmData section dats) =
pprSectionHeader section $$ vcat (map pprData dats)
-- special case for split markers:
pprSectionHeader section $$ vcat (map pprData dats)
-- special case for split markers:
-pprNatCmmTop (CmmProc [] lbl _ (ListGraph [])) = pprLabel lbl
+pprNatCmmTop (CmmProc [] lbl (ListGraph [])) = pprLabel lbl
-pprNatCmmTop (CmmProc info lbl _ (ListGraph blocks)) =
+pprNatCmmTop (CmmProc info lbl (ListGraph blocks)) =
pprSectionHeader Text $$
(if null info then -- blocks guaranteed not null, so label needed
pprLabel lbl
pprSectionHeader Text $$
(if null info then -- blocks guaranteed not null, so label needed
pprLabel lbl
@@
-89,8
+90,8
@@
pprNatCmmTop (CmmProc info lbl _ (ListGraph blocks)) =
pprBasicBlock :: NatBasicBlock Instr -> Doc
pprBasicBlock :: NatBasicBlock Instr -> Doc
-pprBasicBlock (BasicBlock (BlockId id) instrs) =
- pprLabel (mkAsmTempLabel id) $$
+pprBasicBlock (BasicBlock blockid instrs) =
+ pprLabel (mkAsmTempLabel (getUnique blockid)) $$
vcat (map pprInstr instrs)
vcat (map pprInstr instrs)
@@
-161,15
+162,11
@@
instance Outputable Instr where
ppr instr = Outputable.docToSDoc $ pprInstr instr
ppr instr = Outputable.docToSDoc $ pprInstr instr
-#if i386_TARGET_ARCH || x86_64_TARGET_ARCH
pprUserReg :: Reg -> Doc
pprUserReg :: Reg -> Doc
-pprUserReg = pprReg IF_ARCH_i386(II32,) IF_ARCH_x86_64(II64,)
-
-#else
-pprUserReg :: Reg -> Doc
-pprUserReg = panic "X86.Ppr.pprUserReg: not defined"
-
-#endif
+pprUserReg
+ | cTargetArch == I386 = pprReg II32
+ | cTargetArch == X86_64 = pprReg II64
+ | otherwise = panic "X86.Ppr.pprUserReg: not defined"
pprReg :: Size -> Reg -> Doc
pprReg :: Size -> Reg -> Doc
@@
-621,9
+618,9
@@
pprInstr (CLTD II64) = ptext (sLit "\tcqto")
pprInstr (SETCC cond op) = pprCondInstr (sLit "set") cond (pprOperand II8 op)
pprInstr (SETCC cond op) = pprCondInstr (sLit "set") cond (pprOperand II8 op)
-pprInstr (JXX cond (BlockId id))
+pprInstr (JXX cond blockid)
= pprCondInstr (sLit "j") cond (pprCLabel_asm lab)
= pprCondInstr (sLit "j") cond (pprCLabel_asm lab)
- where lab = mkAsmTempLabel id
+ where lab = mkAsmTempLabel (getUnique blockid)
pprInstr (JXX_GBL cond imm) = pprCondInstr (sLit "j") cond (pprImm imm)
pprInstr (JXX_GBL cond imm) = pprCondInstr (sLit "j") cond (pprImm imm)
@@
-723,6
+720,11
@@
pprInstr g@(GITOD src dst)
text " ; fildl (%esp) ; ",
gpop dst 1, text " ; addl $4,%esp"])
text " ; fildl (%esp) ; ",
gpop dst 1, text " ; addl $4,%esp"])
+pprInstr g@(GDTOF src dst)
+ = pprG g (vcat [gtab <> gpush src 0,
+ gtab <> text "subl $4,%esp ; fstps (%esp) ; flds (%esp) ; addl $4,%esp ;",
+ gtab <> gpop dst 1])
+
{- Gruesome swamp follows. If you're unfortunate enough to have ventured
this far into the jungle AND you give a Rat's Ass (tm) what's going
on, here's the deal. Generate code to do a floating point comparison
{- Gruesome swamp follows. If you're unfortunate enough to have ventured
this far into the jungle AND you give a Rat's Ass (tm) what's going
on, here's the deal. Generate code to do a floating point comparison
@@
-978,6
+980,7
@@
pprGInstr (GDTOI src dst) = pprSizeSizeRegReg (sLit "gdtoi") FF64 II32 src dst
pprGInstr (GITOF src dst) = pprSizeSizeRegReg (sLit "gitof") II32 FF32 src dst
pprGInstr (GITOD src dst) = pprSizeSizeRegReg (sLit "gitod") II32 FF64 src dst
pprGInstr (GITOF src dst) = pprSizeSizeRegReg (sLit "gitof") II32 FF32 src dst
pprGInstr (GITOD src dst) = pprSizeSizeRegReg (sLit "gitod") II32 FF64 src dst
+pprGInstr (GDTOF src dst) = pprSizeSizeRegReg (sLit "gdtof") FF64 FF32 src dst
pprGInstr (GCMP co src dst) = pprCondRegReg (sLit "gcmp_") FF64 co src dst
pprGInstr (GABS sz src dst) = pprSizeRegReg (sLit "gabs") sz src dst
pprGInstr (GCMP co src dst) = pprCondRegReg (sLit "gcmp_") FF64 co src dst
pprGInstr (GABS sz src dst) = pprSizeRegReg (sLit "gabs") sz src dst