[project @ 2001-11-19 16:34:12 by simonpj]
[ghc-hetmet.git] / ghc / compiler / nativeGen / PprMach.lhs
index 613b413..273a679 100644 (file)
@@ -17,14 +17,21 @@ module PprMach ( pprInstr, pprSize, pprUserReg ) where
 import MachRegs                -- may differ per-platform
 import MachMisc
 
-import CLabel          ( pprCLabel_asm, externallyVisibleCLabel, labelDynamic )
+import CLabel          ( pprCLabel, externallyVisibleCLabel, labelDynamic )
 import Stix            ( CodeSegment(..) )
-import Outputable
+import Unique          ( pprUnique )
+import Panic           ( panic )
+import Pretty
+import qualified Outputable
 
 import ST
 import MutableArray
 import Char            ( chr, ord )
 import Maybe           ( isJust )
+
+asmSDoc d = Outputable.withPprStyleDoc (
+             Outputable.mkCodeStyle Outputable.AsmStyle) d
+pprCLabel_asm l = asmSDoc (pprCLabel l)
 \end{code}
 
 %************************************************************************
@@ -36,20 +43,19 @@ import Maybe                ( isJust )
 For x86, the way we print a register name depends
 on which bit of it we care about.  Yurgh.
 \begin{code}
-pprUserReg:: Reg -> SDoc
+pprUserReg :: Reg -> Doc
 pprUserReg = pprReg IF_ARCH_i386(L,)
 
-
-pprReg :: IF_ARCH_i386(Size ->,) Reg -> SDoc
+pprReg :: IF_ARCH_i386(Size ->,) Reg -> Doc
 
 pprReg IF_ARCH_i386(s,) r
   = case r of
       RealReg i      -> ppr_reg_no IF_ARCH_i386(s,) i
-      VirtualRegI u  -> text "%vI_" <> ppr u
-      VirtualRegF u  -> text "%vF_" <> ppr u      
+      VirtualRegI u  -> text "%vI_" <> asmSDoc (pprUnique u)
+      VirtualRegF u  -> text "%vF_" <> asmSDoc (pprUnique u)
   where
 #if alpha_TARGET_ARCH
-    ppr_reg_no :: Int -> SDoc
+    ppr_reg_no :: Int -> Doc
     ppr_reg_no i = ptext
       (case i of {
         0 -> SLIT("$0");    1 -> SLIT("$1");
@@ -88,28 +94,43 @@ pprReg IF_ARCH_i386(s,) r
       })
 #endif
 #if i386_TARGET_ARCH
-    ppr_reg_no :: Size -> Int -> SDoc
-    ppr_reg_no B i= ptext
+    ppr_reg_no :: Size -> Int -> Doc
+    ppr_reg_no B  = ppr_reg_byte
+    ppr_reg_no Bu = ppr_reg_byte
+    ppr_reg_no W  = ppr_reg_word
+    ppr_reg_no Wu = ppr_reg_word
+    ppr_reg_no _  = ppr_reg_long
+
+    ppr_reg_byte i = ptext
       (case i of {
-        0 -> SLIT("%al");   1 -> SLIT("%bl");
-        2 -> SLIT("%cl");   3 -> SLIT("%dl");
+        0 -> SLIT("%al");     1 -> SLIT("%bl");
+        2 -> SLIT("%cl");     3 -> SLIT("%dl");
        _  -> SLIT("very naughty I386 byte register")
       })
 
-    ppr_reg_no _ i = ptext
+    ppr_reg_word i = ptext
+      (case i of {
+        0 -> SLIT("%ax");     1 -> SLIT("%bx");
+        2 -> SLIT("%cx");     3 -> SLIT("%dx");
+        4 -> SLIT("%si");     5 -> SLIT("%di");
+        6 -> SLIT("%bp");     7 -> SLIT("%sp");
+       _  -> SLIT("very naughty I386 word register")
+      })
+
+    ppr_reg_long i = ptext
       (case i of {
-        0 -> SLIT("%eax");   1 -> SLIT("%ebx");
-        2 -> SLIT("%ecx");   3 -> SLIT("%edx");
-        4 -> SLIT("%esi");   5 -> SLIT("%edi");
-        6 -> SLIT("%ebp");   7 -> SLIT("%esp");
-        8 -> SLIT("%fake0");   9 -> SLIT("%fake1");
-       10 -> SLIT("%fake2");  11 -> SLIT("%fake3");
-       12 -> SLIT("%fake4");  13 -> SLIT("%fake5");
+        0 -> SLIT("%eax");    1 -> SLIT("%ebx");
+        2 -> SLIT("%ecx");    3 -> SLIT("%edx");
+        4 -> SLIT("%esi");    5 -> SLIT("%edi");
+        6 -> SLIT("%ebp");    7 -> SLIT("%esp");
+        8 -> SLIT("%fake0");  9 -> SLIT("%fake1");
+       10 -> SLIT("%fake2"); 11 -> SLIT("%fake3");
+       12 -> SLIT("%fake4"); 13 -> SLIT("%fake5");
        _  -> SLIT("very naughty I386 register")
       })
 #endif
 #if sparc_TARGET_ARCH
-    ppr_reg_no :: Int -> SDoc
+    ppr_reg_no :: Int -> Doc
     ppr_reg_no i = ptext
       (case i of {
         0 -> SLIT("%g0");   1 -> SLIT("%g1");
@@ -156,14 +177,14 @@ pprReg IF_ARCH_i386(s,) r
 %************************************************************************
 
 \begin{code}
-pprSize :: Size -> SDoc
+pprSize :: Size -> Doc
 
 pprSize x = ptext (case x of
 #if alpha_TARGET_ARCH
         B  -> SLIT("b")
-        BU -> SLIT("bu")
+        Bu -> SLIT("bu")
 --      W  -> SLIT("w") UNUSED
---      WU -> SLIT("wu") UNUSED
+--      Wu -> SLIT("wu") UNUSED
         L  -> SLIT("l")
         Q  -> SLIT("q")
 --      FF -> SLIT("f") UNUSED
@@ -174,32 +195,28 @@ pprSize x = ptext (case x of
 #endif
 #if i386_TARGET_ARCH
        B   -> SLIT("b")
---     HB  -> SLIT("b") UNUSED
---     S   -> SLIT("w") UNUSED
+       Bu  -> SLIT("b")
+       W   -> SLIT("w")
+       Wu  -> SLIT("w")
        L   -> SLIT("l")
+       Lu  -> SLIT("l")
        F   -> SLIT("s")
        DF  -> SLIT("l")
        F80 -> SLIT("t")
 #endif
 #if sparc_TARGET_ARCH
        B   -> SLIT("sb")
-       BU  -> SLIT("ub")
---     HW  -> SLIT("hw") UNUSED
---     HWU -> SLIT("uhw") UNUSED
+       Bu  -> SLIT("ub")
        W   -> SLIT("")
        F   -> SLIT("")
---     D   -> SLIT("d") UNUSED
        DF  -> SLIT("d")
     )
-pprStSize :: Size -> SDoc
+pprStSize :: Size -> Doc
 pprStSize x = ptext (case x of
        B   -> SLIT("b")
-       BU  -> SLIT("b")
---     HW  -> SLIT("hw") UNUSED
---     HWU -> SLIT("uhw") UNUSED
+       Bu  -> SLIT("b")
        W   -> SLIT("")
        F   -> SLIT("")
---     D   -> SLIT("d") UNUSED
        DF  -> SLIT("d")
 #endif
     )
@@ -212,7 +229,7 @@ pprStSize x = ptext (case x of
 %************************************************************************
 
 \begin{code}
-pprCond :: Cond -> SDoc
+pprCond :: Cond -> Doc
 
 pprCond c = ptext (case c of {
 #if alpha_TARGET_ARCH
@@ -254,7 +271,7 @@ pprCond c = ptext (case c of {
 %************************************************************************
 
 \begin{code}
-pprImm :: Imm -> SDoc
+pprImm :: Imm -> Doc
 
 pprImm (ImmInt i)     = int i
 pprImm (ImmInteger i) = integer i
@@ -288,7 +305,7 @@ pprImm (HI i)
 %************************************************************************
 
 \begin{code}
-pprAddr :: MachRegsAddr -> SDoc
+pprAddr :: MachRegsAddr -> Doc
 
 #if alpha_TARGET_ARCH
 pprAddr (AddrReg r) = parens (pprReg r)
@@ -361,7 +378,7 @@ pprAddr (AddrRegImm r1 imm)
 %************************************************************************
 
 \begin{code}
-pprInstr :: Instr -> SDoc
+pprInstr :: Instr -> Doc
 
 --pprInstr (COMMENT s) = empty -- nuke 'em
 pprInstr (COMMENT s)
@@ -417,10 +434,10 @@ pprInstr (ASCII False{-no backslash conversion-} str)
 pprInstr (ASCII True str)
   = vcat (map do1 (str ++ [chr 0]))
     where
-       do1 :: Char -> SDoc
+       do1 :: Char -> Doc
        do1 c = ptext SLIT("\t.byte\t0x") <> hshow (ord c)
 
-       hshow :: Int -> SDoc
+       hshow :: Int -> Doc
        hshow n | n >= 0 && n <= 255
                = char (tab !! (n `div` 16)) <> char (tab !! (n `mod` 16))
        tab = "0123456789ABCDEF"
@@ -841,12 +858,12 @@ pprInstr (FUNEND clab)
 
 Continue with Alpha-only printing bits and bobs:
 \begin{code}
-pprRI :: RI -> SDoc
+pprRI :: RI -> Doc
 
 pprRI (RIReg r) = pprReg r
 pprRI (RIImm r) = pprImm r
 
-pprRegRIReg :: FAST_STRING -> Reg -> RI -> Reg -> SDoc
+pprRegRIReg :: FAST_STRING -> Reg -> RI -> Reg -> Doc
 
 pprRegRIReg name reg1 ri reg2
   = hcat [
@@ -860,7 +877,7 @@ pprRegRIReg name reg1 ri reg2
        pprReg reg2
     ]
 
-pprSizeRegRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Reg -> SDoc
+pprSizeRegRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Reg -> Doc
 
 pprSizeRegRegReg name size reg1 reg2 reg3
   = hcat [
@@ -1129,7 +1146,7 @@ gregno (RealReg i) = i
 gregno other       = --pprPanic "gregno" (ppr other)
                      999   -- bogus; only needed for debug printing
 
-pprG :: Instr -> SDoc -> SDoc
+pprG :: Instr -> Doc -> Doc
 pprG fake actual
    = (char '#' <> pprGInstr fake) $$ actual
 
@@ -1165,16 +1182,16 @@ pprGInstr (GDIV sz src1 src2 dst) = pprSizeRegRegReg SLIT("gdiv") sz src1 src2 d
 
 Continue with I386-only printing bits and bobs:
 \begin{code}
-pprDollImm :: Imm -> SDoc
+pprDollImm :: Imm -> Doc
 
 pprDollImm i =  ptext SLIT("$") <> pprImm i
 
-pprOperand :: Size -> Operand -> SDoc
+pprOperand :: Size -> Operand -> Doc
 pprOperand s (OpReg r)   = pprReg s r
 pprOperand s (OpImm i)   = pprDollImm i
 pprOperand s (OpAddr ea) = pprAddr ea
 
-pprSizeImmOp :: FAST_STRING -> Size -> Imm -> Operand -> SDoc
+pprSizeImmOp :: FAST_STRING -> Size -> Imm -> Operand -> Doc
 pprSizeImmOp name size imm op1
   = hcat [
         char '\t',
@@ -1187,7 +1204,7 @@ pprSizeImmOp name size imm op1
        pprOperand size op1
     ]
        
-pprSizeOp :: FAST_STRING -> Size -> Operand -> SDoc
+pprSizeOp :: FAST_STRING -> Size -> Operand -> Doc
 pprSizeOp name size op1
   = hcat [
        char '\t',
@@ -1197,7 +1214,7 @@ pprSizeOp name size op1
        pprOperand size op1
     ]
 
-pprSizeOpOp :: FAST_STRING -> Size -> Operand -> Operand -> SDoc
+pprSizeOpOp :: FAST_STRING -> Size -> Operand -> Operand -> Doc
 pprSizeOpOp name size op1 op2
   = hcat [
        char '\t',
@@ -1209,7 +1226,7 @@ pprSizeOpOp name size op1 op2
        pprOperand size op2
     ]
 
-pprSizeByteOpOp :: FAST_STRING -> Size -> Operand -> Operand -> SDoc
+pprSizeByteOpOp :: FAST_STRING -> Size -> Operand -> Operand -> Doc
 pprSizeByteOpOp name size op1 op2
   = hcat [
        char '\t',
@@ -1221,7 +1238,7 @@ pprSizeByteOpOp name size op1 op2
        pprOperand size op2
     ]
 
-pprSizeOpReg :: FAST_STRING -> Size -> Operand -> Reg -> SDoc
+pprSizeOpReg :: FAST_STRING -> Size -> Operand -> Reg -> Doc
 pprSizeOpReg name size op1 reg
   = hcat [
        char '\t',
@@ -1233,7 +1250,7 @@ pprSizeOpReg name size op1 reg
        pprReg size reg
     ]
 
-pprSizeReg :: FAST_STRING -> Size -> Reg -> SDoc
+pprSizeReg :: FAST_STRING -> Size -> Reg -> Doc
 pprSizeReg name size reg1
   = hcat [
        char '\t',
@@ -1243,7 +1260,7 @@ pprSizeReg name size reg1
        pprReg size reg1
     ]
 
-pprSizeRegReg :: FAST_STRING -> Size -> Reg -> Reg -> SDoc
+pprSizeRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Doc
 pprSizeRegReg name size reg1 reg2
   = hcat [
        char '\t',
@@ -1255,7 +1272,7 @@ pprSizeRegReg name size reg1 reg2
         pprReg size reg2
     ]
 
-pprSizeSizeRegReg :: FAST_STRING -> Size -> Size -> Reg -> Reg -> SDoc
+pprSizeSizeRegReg :: FAST_STRING -> Size -> Size -> Reg -> Reg -> Doc
 pprSizeSizeRegReg name size1 size2 reg1 reg2
   = hcat [
        char '\t',
@@ -1268,7 +1285,7 @@ pprSizeSizeRegReg name size1 size2 reg1 reg2
         pprReg size2 reg2
     ]
 
-pprSizeRegRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Reg -> SDoc
+pprSizeRegRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Reg -> Doc
 pprSizeRegRegReg name size reg1 reg2 reg3
   = hcat [
        char '\t',
@@ -1282,7 +1299,7 @@ pprSizeRegRegReg name size reg1 reg2 reg3
         pprReg size reg3
     ]
 
-pprSizeAddr :: FAST_STRING -> Size -> MachRegsAddr -> SDoc
+pprSizeAddr :: FAST_STRING -> Size -> MachRegsAddr -> Doc
 pprSizeAddr name size op
   = hcat [
        char '\t',
@@ -1292,7 +1309,7 @@ pprSizeAddr name size op
        pprAddr op
     ]
 
-pprSizeAddrReg :: FAST_STRING -> Size -> MachRegsAddr -> Reg -> SDoc
+pprSizeAddrReg :: FAST_STRING -> Size -> MachRegsAddr -> Reg -> Doc
 pprSizeAddrReg name size op dst
   = hcat [
        char '\t',
@@ -1304,7 +1321,7 @@ pprSizeAddrReg name size op dst
        pprReg size dst
     ]
 
-pprSizeRegAddr :: FAST_STRING -> Size -> Reg -> MachRegsAddr -> SDoc
+pprSizeRegAddr :: FAST_STRING -> Size -> Reg -> MachRegsAddr -> Doc
 pprSizeRegAddr name size src op
   = hcat [
        char '\t',
@@ -1316,7 +1333,7 @@ pprSizeRegAddr name size src op
        pprAddr op
     ]
 
-pprOpOp :: FAST_STRING -> Size -> Operand -> Operand -> SDoc
+pprOpOp :: FAST_STRING -> Size -> Operand -> Operand -> Doc
 pprOpOp name size op1 op2
   = hcat [
        char '\t',
@@ -1326,7 +1343,7 @@ pprOpOp name size op1 op2
        pprOperand size op2
     ]
 
-pprSizeOpOpCoerce :: FAST_STRING -> Size -> Size -> Operand -> Operand -> SDoc
+pprSizeOpOpCoerce :: FAST_STRING -> Size -> Size -> Operand -> Operand -> Doc
 pprSizeOpOpCoerce name size1 size2 op1 op2
   = hcat [ char '\t', ptext name, pprSize size1, pprSize size2, space,
        pprOperand size1 op1,
@@ -1334,7 +1351,7 @@ pprSizeOpOpCoerce name size1 size2 op1 op2
        pprOperand size2 op2
     ]
 
-pprCondInstr :: FAST_STRING -> Cond -> SDoc -> SDoc
+pprCondInstr :: FAST_STRING -> Cond -> Doc -> Doc
 pprCondInstr name cond arg
   = hcat [ char '\t', ptext name, pprCond cond, space, arg]
 
@@ -1555,11 +1572,11 @@ pprInstr (CALL imm n _)
 
 Continue with SPARC-only printing bits and bobs:
 \begin{code}
-pprRI :: RI -> SDoc
+pprRI :: RI -> Doc
 pprRI (RIReg r) = pprReg r
 pprRI (RIImm r) = pprImm r
 
-pprSizeRegReg :: FAST_STRING -> Size -> Reg -> Reg -> SDoc
+pprSizeRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Doc
 pprSizeRegReg name size reg1 reg2
   = hcat [
        char '\t',
@@ -1572,7 +1589,7 @@ pprSizeRegReg name size reg1 reg2
        pprReg reg2
     ]
 
-pprSizeRegRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Reg -> SDoc
+pprSizeRegRegReg :: FAST_STRING -> Size -> Reg -> Reg -> Reg -> Doc
 pprSizeRegRegReg name size reg1 reg2 reg3
   = hcat [
        char '\t',
@@ -1587,7 +1604,7 @@ pprSizeRegRegReg name size reg1 reg2 reg3
        pprReg reg3
     ]
 
-pprRegRIReg :: FAST_STRING -> Bool -> Reg -> RI -> Reg -> SDoc
+pprRegRIReg :: FAST_STRING -> Bool -> Reg -> RI -> Reg -> Doc
 pprRegRIReg name b reg1 ri reg2
   = hcat [
        char '\t',
@@ -1600,7 +1617,7 @@ pprRegRIReg name b reg1 ri reg2
        pprReg reg2
     ]
 
-pprRIReg :: FAST_STRING -> Bool -> RI -> Reg -> SDoc
+pprRIReg :: FAST_STRING -> Bool -> RI -> Reg -> Doc
 pprRIReg name b ri reg1
   = hcat [
        char '\t',