summaryrefslogtreecommitdiff
path: root/compiler/nativeGen/SPARC/Ppr.hs
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2012-07-18 15:47:43 +0100
committerIan Lynagh <igloo@earth.li>2012-07-18 15:47:43 +0100
commit2a20b0e7ff857e3fc0ba74a2da21f4eabba3a067 (patch)
tree72bf5a5428f72bfda2cd7d0d21076d19027cb33d /compiler/nativeGen/SPARC/Ppr.hs
parentc06aa9b648cb12c299ed349b703e4ff2d4f0d432 (diff)
downloadhaskell-2a20b0e7ff857e3fc0ba74a2da21f4eabba3a067.tar.gz
Whitespace only in nativeGen/SPARC/Ppr.hs
Diffstat (limited to 'compiler/nativeGen/SPARC/Ppr.hs')
-rw-r--r--compiler/nativeGen/SPARC/Ppr.hs605
1 files changed, 300 insertions, 305 deletions
diff --git a/compiler/nativeGen/SPARC/Ppr.hs b/compiler/nativeGen/SPARC/Ppr.hs
index f522bc6c0b..1f6518f2f0 100644
--- a/compiler/nativeGen/SPARC/Ppr.hs
+++ b/compiler/nativeGen/SPARC/Ppr.hs
@@ -7,22 +7,16 @@
-----------------------------------------------------------------------------
{-# OPTIONS_GHC -fno-warn-orphans #-}
-{-# OPTIONS -fno-warn-tabs #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and
--- detab the module (please do the detabbing in a separate patch). See
--- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#TabsvsSpaces
--- for details
module SPARC.Ppr (
- pprNatCmmDecl,
- pprBasicBlock,
- pprSectionHeader,
- pprData,
- pprInstr,
- pprSize,
- pprImm,
- pprDataItem
+ pprNatCmmDecl,
+ pprBasicBlock,
+ pprSectionHeader,
+ pprData,
+ pprInstr,
+ pprSize,
+ pprImm,
+ pprDataItem
)
where
@@ -45,7 +39,7 @@ import OldCmm
import OldPprCmm()
import CLabel
-import Unique ( Uniquable(..), pprUnique )
+import Unique ( Uniquable(..), pprUnique )
import Outputable
import Platform
import FastString
@@ -145,191 +139,192 @@ instance Outputable Instr where
pprReg :: Reg -> SDoc
pprReg reg
= case reg of
- RegVirtual vr
- -> case vr of
+ RegVirtual vr
+ -> case vr of
VirtualRegI u -> text "%vI_" <> pprUnique u
VirtualRegHi u -> text "%vHi_" <> pprUnique u
VirtualRegF u -> text "%vF_" <> pprUnique u
VirtualRegD u -> text "%vD_" <> pprUnique u
VirtualRegSSE u -> text "%vSSE_" <> pprUnique u
- RegReal rr
- -> case rr of
- RealRegSingle r1
- -> pprReg_ofRegNo r1
+ RegReal rr
+ -> case rr of
+ RealRegSingle r1
+ -> pprReg_ofRegNo r1
+
+ RealRegPair r1 r2
+ -> text "(" <> pprReg_ofRegNo r1
+ <> text "|" <> pprReg_ofRegNo r2
+ <> text ")"
- RealRegPair r1 r2
- -> text "(" <> pprReg_ofRegNo r1
- <> text "|" <> pprReg_ofRegNo r2
- <> text ")"
-
-- | Pretty print a register name, based on this register number.
--- The definition has been unfolded so we get a jump-table in the
--- object code. This function is called quite a lot when emitting the asm file..
+-- The definition has been unfolded so we get a jump-table in the
+-- object code. This function is called quite a lot when emitting
+-- the asm file..
--
pprReg_ofRegNo :: Int -> SDoc
pprReg_ofRegNo i
= ptext
(case i of {
- 0 -> sLit "%g0"; 1 -> sLit "%g1";
- 2 -> sLit "%g2"; 3 -> sLit "%g3";
- 4 -> sLit "%g4"; 5 -> sLit "%g5";
- 6 -> sLit "%g6"; 7 -> sLit "%g7";
- 8 -> sLit "%o0"; 9 -> sLit "%o1";
- 10 -> sLit "%o2"; 11 -> sLit "%o3";
- 12 -> sLit "%o4"; 13 -> sLit "%o5";
- 14 -> sLit "%o6"; 15 -> sLit "%o7";
- 16 -> sLit "%l0"; 17 -> sLit "%l1";
- 18 -> sLit "%l2"; 19 -> sLit "%l3";
- 20 -> sLit "%l4"; 21 -> sLit "%l5";
- 22 -> sLit "%l6"; 23 -> sLit "%l7";
- 24 -> sLit "%i0"; 25 -> sLit "%i1";
- 26 -> sLit "%i2"; 27 -> sLit "%i3";
- 28 -> sLit "%i4"; 29 -> sLit "%i5";
- 30 -> sLit "%i6"; 31 -> sLit "%i7";
- 32 -> sLit "%f0"; 33 -> sLit "%f1";
- 34 -> sLit "%f2"; 35 -> sLit "%f3";
- 36 -> sLit "%f4"; 37 -> sLit "%f5";
- 38 -> sLit "%f6"; 39 -> sLit "%f7";
- 40 -> sLit "%f8"; 41 -> sLit "%f9";
- 42 -> sLit "%f10"; 43 -> sLit "%f11";
- 44 -> sLit "%f12"; 45 -> sLit "%f13";
- 46 -> sLit "%f14"; 47 -> sLit "%f15";
- 48 -> sLit "%f16"; 49 -> sLit "%f17";
- 50 -> sLit "%f18"; 51 -> sLit "%f19";
- 52 -> sLit "%f20"; 53 -> sLit "%f21";
- 54 -> sLit "%f22"; 55 -> sLit "%f23";
- 56 -> sLit "%f24"; 57 -> sLit "%f25";
- 58 -> sLit "%f26"; 59 -> sLit "%f27";
- 60 -> sLit "%f28"; 61 -> sLit "%f29";
- 62 -> sLit "%f30"; 63 -> sLit "%f31";
- _ -> sLit "very naughty sparc register" })
+ 0 -> sLit "%g0"; 1 -> sLit "%g1";
+ 2 -> sLit "%g2"; 3 -> sLit "%g3";
+ 4 -> sLit "%g4"; 5 -> sLit "%g5";
+ 6 -> sLit "%g6"; 7 -> sLit "%g7";
+ 8 -> sLit "%o0"; 9 -> sLit "%o1";
+ 10 -> sLit "%o2"; 11 -> sLit "%o3";
+ 12 -> sLit "%o4"; 13 -> sLit "%o5";
+ 14 -> sLit "%o6"; 15 -> sLit "%o7";
+ 16 -> sLit "%l0"; 17 -> sLit "%l1";
+ 18 -> sLit "%l2"; 19 -> sLit "%l3";
+ 20 -> sLit "%l4"; 21 -> sLit "%l5";
+ 22 -> sLit "%l6"; 23 -> sLit "%l7";
+ 24 -> sLit "%i0"; 25 -> sLit "%i1";
+ 26 -> sLit "%i2"; 27 -> sLit "%i3";
+ 28 -> sLit "%i4"; 29 -> sLit "%i5";
+ 30 -> sLit "%i6"; 31 -> sLit "%i7";
+ 32 -> sLit "%f0"; 33 -> sLit "%f1";
+ 34 -> sLit "%f2"; 35 -> sLit "%f3";
+ 36 -> sLit "%f4"; 37 -> sLit "%f5";
+ 38 -> sLit "%f6"; 39 -> sLit "%f7";
+ 40 -> sLit "%f8"; 41 -> sLit "%f9";
+ 42 -> sLit "%f10"; 43 -> sLit "%f11";
+ 44 -> sLit "%f12"; 45 -> sLit "%f13";
+ 46 -> sLit "%f14"; 47 -> sLit "%f15";
+ 48 -> sLit "%f16"; 49 -> sLit "%f17";
+ 50 -> sLit "%f18"; 51 -> sLit "%f19";
+ 52 -> sLit "%f20"; 53 -> sLit "%f21";
+ 54 -> sLit "%f22"; 55 -> sLit "%f23";
+ 56 -> sLit "%f24"; 57 -> sLit "%f25";
+ 58 -> sLit "%f26"; 59 -> sLit "%f27";
+ 60 -> sLit "%f28"; 61 -> sLit "%f29";
+ 62 -> sLit "%f30"; 63 -> sLit "%f31";
+ _ -> sLit "very naughty sparc register" })
-- | Pretty print a size for an instruction suffix.
pprSize :: Size -> SDoc
-pprSize x
- = ptext
+pprSize x
+ = ptext
(case x of
- II8 -> sLit "ub"
- II16 -> sLit "uh"
- II32 -> sLit ""
- II64 -> sLit "d"
- FF32 -> sLit ""
- FF64 -> sLit "d"
- _ -> panic "SPARC.Ppr.pprSize: no match")
+ II8 -> sLit "ub"
+ II16 -> sLit "uh"
+ II32 -> sLit ""
+ II64 -> sLit "d"
+ FF32 -> sLit ""
+ FF64 -> sLit "d"
+ _ -> panic "SPARC.Ppr.pprSize: no match")
-- | Pretty print a size for an instruction suffix.
--- eg LD is 32bit on sparc, but LDD is 64 bit.
+-- eg LD is 32bit on sparc, but LDD is 64 bit.
pprStSize :: Size -> SDoc
-pprStSize x
- = ptext
+pprStSize x
+ = ptext
(case x of
- II8 -> sLit "b"
- II16 -> sLit "h"
- II32 -> sLit ""
- II64 -> sLit "x"
- FF32 -> sLit ""
- FF64 -> sLit "d"
- _ -> panic "SPARC.Ppr.pprSize: no match")
-
-
+ II8 -> sLit "b"
+ II16 -> sLit "h"
+ II32 -> sLit ""
+ II64 -> sLit "x"
+ FF32 -> sLit ""
+ FF64 -> sLit "d"
+ _ -> panic "SPARC.Ppr.pprSize: no match")
+
+
-- | Pretty print a condition code.
pprCond :: Cond -> SDoc
-pprCond c
- = ptext
- (case c of
- ALWAYS -> sLit ""
- NEVER -> sLit "n"
- GEU -> sLit "geu"
- LU -> sLit "lu"
- EQQ -> sLit "e"
- GTT -> sLit "g"
- GE -> sLit "ge"
- GU -> sLit "gu"
- LTT -> sLit "l"
- LE -> sLit "le"
- LEU -> sLit "leu"
- NE -> sLit "ne"
- NEG -> sLit "neg"
- POS -> sLit "pos"
- VC -> sLit "vc"
- VS -> sLit "vs")
+pprCond c
+ = ptext
+ (case c of
+ ALWAYS -> sLit ""
+ NEVER -> sLit "n"
+ GEU -> sLit "geu"
+ LU -> sLit "lu"
+ EQQ -> sLit "e"
+ GTT -> sLit "g"
+ GE -> sLit "ge"
+ GU -> sLit "gu"
+ LTT -> sLit "l"
+ LE -> sLit "le"
+ LEU -> sLit "leu"
+ NE -> sLit "ne"
+ NEG -> sLit "neg"
+ POS -> sLit "pos"
+ VC -> sLit "vc"
+ VS -> sLit "vs")
-- | Pretty print an address mode.
pprAddr :: Platform -> AddrMode -> SDoc
pprAddr platform am
= case am of
- AddrRegReg r1 (RegReal (RealRegSingle 0))
- -> pprReg r1
+ AddrRegReg r1 (RegReal (RealRegSingle 0))
+ -> pprReg r1
- AddrRegReg r1 r2
- -> hcat [ pprReg r1, char '+', pprReg r2 ]
+ AddrRegReg r1 r2
+ -> hcat [ pprReg r1, char '+', pprReg r2 ]
- AddrRegImm r1 (ImmInt i)
- | i == 0 -> pprReg r1
- | not (fits13Bits i) -> largeOffsetError i
- | otherwise -> hcat [ pprReg r1, pp_sign, int i ]
- where
- pp_sign = if i > 0 then char '+' else empty
+ AddrRegImm r1 (ImmInt i)
+ | i == 0 -> pprReg r1
+ | not (fits13Bits i) -> largeOffsetError i
+ | otherwise -> hcat [ pprReg r1, pp_sign, int i ]
+ where
+ pp_sign = if i > 0 then char '+' else empty
- AddrRegImm r1 (ImmInteger i)
- | i == 0 -> pprReg r1
- | not (fits13Bits i) -> largeOffsetError i
- | otherwise -> hcat [ pprReg r1, pp_sign, integer i ]
- where
- pp_sign = if i > 0 then char '+' else empty
+ AddrRegImm r1 (ImmInteger i)
+ | i == 0 -> pprReg r1
+ | not (fits13Bits i) -> largeOffsetError i
+ | otherwise -> hcat [ pprReg r1, pp_sign, integer i ]
+ where
+ pp_sign = if i > 0 then char '+' else empty
- AddrRegImm r1 imm
- -> hcat [ pprReg r1, char '+', pprImm platform imm ]
+ AddrRegImm r1 imm
+ -> hcat [ pprReg r1, char '+', pprImm platform imm ]
-- | Pretty print an immediate value.
pprImm :: Platform -> Imm -> SDoc
pprImm platform imm
= case imm of
- ImmInt i -> int i
- ImmInteger i -> integer i
- ImmCLbl l -> pprCLabel platform l
- ImmIndex l i -> pprCLabel platform l <> char '+' <> int i
- ImmLit s -> s
+ ImmInt i -> int i
+ ImmInteger i -> integer i
+ ImmCLbl l -> pprCLabel platform l
+ ImmIndex l i -> pprCLabel platform l <> char '+' <> int i
+ ImmLit s -> s
- ImmConstantSum a b
- -> pprImm platform a <> char '+' <> pprImm platform b
+ ImmConstantSum a b
+ -> pprImm platform a <> char '+' <> pprImm platform b
- ImmConstantDiff a b
- -> pprImm platform a <> char '-' <> lparen <> pprImm platform b <> rparen
+ ImmConstantDiff a b
+ -> pprImm platform a <> char '-' <> lparen <> pprImm platform b <> rparen
- LO i
- -> hcat [ text "%lo(", pprImm platform i, rparen ]
-
- HI i
- -> hcat [ text "%hi(", pprImm platform i, rparen ]
+ LO i
+ -> hcat [ text "%lo(", pprImm platform i, rparen ]
- -- these should have been converted to bytes and placed
- -- in the data section.
- ImmFloat _ -> ptext (sLit "naughty float immediate")
- ImmDouble _ -> ptext (sLit "naughty double immediate")
+ HI i
+ -> hcat [ text "%hi(", pprImm platform i, rparen ]
+
+ -- these should have been converted to bytes and placed
+ -- in the data section.
+ ImmFloat _ -> ptext (sLit "naughty float immediate")
+ ImmDouble _ -> ptext (sLit "naughty double immediate")
-- | Pretty print a section \/ segment header.
--- On SPARC all the data sections must be at least 8 byte aligned
--- incase we store doubles in them.
+-- On SPARC all the data sections must be at least 8 byte aligned
+-- incase we store doubles in them.
--
pprSectionHeader :: Section -> SDoc
pprSectionHeader seg
= case seg of
- Text -> ptext (sLit ".text\n\t.align 4")
- Data -> ptext (sLit ".data\n\t.align 8")
- ReadOnlyData -> ptext (sLit ".text\n\t.align 8")
- RelocatableReadOnlyData -> ptext (sLit ".text\n\t.align 8")
- UninitialisedData -> ptext (sLit ".bss\n\t.align 8")
- ReadOnlyData16 -> ptext (sLit ".data\n\t.align 16")
- OtherSection _ -> panic "PprMach.pprSectionHeader: unknown section"
+ Text -> ptext (sLit ".text\n\t.align 4")
+ Data -> ptext (sLit ".data\n\t.align 8")
+ ReadOnlyData -> ptext (sLit ".text\n\t.align 8")
+ RelocatableReadOnlyData -> ptext (sLit ".text\n\t.align 8")
+ UninitialisedData -> ptext (sLit ".bss\n\t.align 8")
+ ReadOnlyData16 -> ptext (sLit ".data\n\t.align 16")
+ OtherSection _ -> panic "PprMach.pprSectionHeader: unknown section"
-- | Pretty print a data item.
@@ -337,204 +332,204 @@ pprDataItem :: Platform -> CmmLit -> SDoc
pprDataItem platform lit
= vcat (ppr_item (cmmTypeSize $ cmmLitType lit) lit)
where
- imm = litToImm lit
+ imm = litToImm lit
- ppr_item II8 _ = [ptext (sLit "\t.byte\t") <> pprImm platform imm]
- ppr_item II32 _ = [ptext (sLit "\t.long\t") <> pprImm platform imm]
+ ppr_item II8 _ = [ptext (sLit "\t.byte\t") <> pprImm platform imm]
+ ppr_item II32 _ = [ptext (sLit "\t.long\t") <> pprImm platform imm]
- ppr_item FF32 (CmmFloat r _)
+ ppr_item FF32 (CmmFloat r _)
= let bs = floatToBytes (fromRational r)
in map (\b -> ptext (sLit "\t.byte\t") <> pprImm platform (ImmInt b)) bs
- ppr_item FF64 (CmmFloat r _)
+ ppr_item FF64 (CmmFloat r _)
= let bs = doubleToBytes (fromRational r)
in map (\b -> ptext (sLit "\t.byte\t") <> pprImm platform (ImmInt b)) bs
- ppr_item II16 _ = [ptext (sLit "\t.short\t") <> pprImm platform imm]
- ppr_item II64 _ = [ptext (sLit "\t.quad\t") <> pprImm platform imm]
- ppr_item _ _ = panic "SPARC.Ppr.pprDataItem: no match"
+ ppr_item II16 _ = [ptext (sLit "\t.short\t") <> pprImm platform imm]
+ ppr_item II64 _ = [ptext (sLit "\t.quad\t") <> pprImm platform imm]
+ ppr_item _ _ = panic "SPARC.Ppr.pprDataItem: no match"
-- | Pretty print an instruction.
pprInstr :: Platform -> Instr -> SDoc
-- nuke comments.
-pprInstr _ (COMMENT _)
- = empty
+pprInstr _ (COMMENT _)
+ = empty
pprInstr platform (DELTA d)
- = pprInstr platform (COMMENT (mkFastString ("\tdelta = " ++ show d)))
+ = pprInstr platform (COMMENT (mkFastString ("\tdelta = " ++ show d)))
-- Newblocks and LData should have been slurped out before producing the .s file.
pprInstr _ (NEWBLOCK _)
- = panic "X86.Ppr.pprInstr: NEWBLOCK"
+ = panic "X86.Ppr.pprInstr: NEWBLOCK"
pprInstr _ (LDATA _ _)
- = panic "PprMach.pprInstr: LDATA"
+ = panic "PprMach.pprInstr: LDATA"
-- 64 bit FP loads are expanded into individual instructions in CodeGen.Expand
pprInstr _ (LD FF64 _ reg)
- | RegReal (RealRegSingle{}) <- reg
- = panic "SPARC.Ppr: not emitting potentially misaligned LD FF64 instr"
+ | RegReal (RealRegSingle{}) <- reg
+ = panic "SPARC.Ppr: not emitting potentially misaligned LD FF64 instr"
pprInstr platform (LD size addr reg)
- = hcat [
- ptext (sLit "\tld"),
- pprSize size,
- char '\t',
- lbrack,
- pprAddr platform addr,
- pp_rbracket_comma,
- pprReg reg
- ]
+ = hcat [
+ ptext (sLit "\tld"),
+ pprSize size,
+ char '\t',
+ lbrack,
+ pprAddr platform addr,
+ pp_rbracket_comma,
+ pprReg reg
+ ]
-- 64 bit FP storees are expanded into individual instructions in CodeGen.Expand
pprInstr _ (ST FF64 reg _)
- | RegReal (RealRegSingle{}) <- reg
- = panic "SPARC.Ppr: not emitting potentially misaligned ST FF64 instr"
+ | RegReal (RealRegSingle{}) <- reg
+ = panic "SPARC.Ppr: not emitting potentially misaligned ST FF64 instr"
-- no distinction is made between signed and unsigned bytes on stores for the
-- Sparc opcodes (at least I cannot see any, and gas is nagging me --SOF),
-- so we call a special-purpose pprSize for ST..
pprInstr platform (ST size reg addr)
- = hcat [
- ptext (sLit "\tst"),
- pprStSize size,
- char '\t',
- pprReg reg,
- pp_comma_lbracket,
- pprAddr platform addr,
- rbrack
- ]
+ = hcat [
+ ptext (sLit "\tst"),
+ pprStSize size,
+ char '\t',
+ pprReg reg,
+ pp_comma_lbracket,
+ pprAddr platform addr,
+ rbrack
+ ]
pprInstr platform (ADD x cc reg1 ri reg2)
- | not x && not cc && riZero ri
- = hcat [ ptext (sLit "\tmov\t"), pprReg reg1, comma, pprReg reg2 ]
+ | not x && not cc && riZero ri
+ = hcat [ ptext (sLit "\tmov\t"), pprReg reg1, comma, pprReg reg2 ]
- | otherwise
- = pprRegRIReg platform (if x then sLit "addx" else sLit "add") cc reg1 ri reg2
+ | otherwise
+ = pprRegRIReg platform (if x then sLit "addx" else sLit "add") cc reg1 ri reg2
pprInstr platform (SUB x cc reg1 ri reg2)
- | not x && cc && reg2 == g0
- = hcat [ ptext (sLit "\tcmp\t"), pprReg reg1, comma, pprRI platform ri ]
+ | not x && cc && reg2 == g0
+ = hcat [ ptext (sLit "\tcmp\t"), pprReg reg1, comma, pprRI platform ri ]
+
+ | not x && not cc && riZero ri
+ = hcat [ ptext (sLit "\tmov\t"), pprReg reg1, comma, pprReg reg2 ]
- | not x && not cc && riZero ri
- = hcat [ ptext (sLit "\tmov\t"), pprReg reg1, comma, pprReg reg2 ]
-
- | otherwise
- = pprRegRIReg platform (if x then sLit "subx" else sLit "sub") cc reg1 ri reg2
+ | otherwise
+ = pprRegRIReg platform (if x then sLit "subx" else sLit "sub") cc reg1 ri reg2
-pprInstr platform (AND b reg1 ri reg2) = pprRegRIReg platform (sLit "and") b reg1 ri reg2
+pprInstr platform (AND b reg1 ri reg2) = pprRegRIReg platform (sLit "and") b reg1 ri reg2
-pprInstr platform (ANDN b reg1 ri reg2) = pprRegRIReg platform (sLit "andn") b reg1 ri reg2
+pprInstr platform (ANDN b reg1 ri reg2) = pprRegRIReg platform (sLit "andn") b reg1 ri reg2
pprInstr platform (OR b reg1 ri reg2)
- | not b && reg1 == g0
- = let doit = hcat [ ptext (sLit "\tmov\t"), pprRI platform ri, comma, pprReg reg2 ]
- in case ri of
- RIReg rrr | rrr == reg2 -> empty
- _ -> doit
-
- | otherwise
- = pprRegRIReg platform (sLit "or") b reg1 ri reg2
-
-pprInstr platform (ORN b reg1 ri reg2) = pprRegRIReg platform (sLit "orn") b reg1 ri reg2
-
-pprInstr platform (XOR b reg1 ri reg2) = pprRegRIReg platform (sLit "xor") b reg1 ri reg2
-pprInstr platform (XNOR b reg1 ri reg2) = pprRegRIReg platform (sLit "xnor") b reg1 ri reg2
-
-pprInstr platform (SLL reg1 ri reg2) = pprRegRIReg platform (sLit "sll") False reg1 ri reg2
-pprInstr platform (SRL reg1 ri reg2) = pprRegRIReg platform (sLit "srl") False reg1 ri reg2
-pprInstr platform (SRA reg1 ri reg2) = pprRegRIReg platform (sLit "sra") False reg1 ri reg2
-
-pprInstr _ (RDY rd) = ptext (sLit "\trd\t%y,") <> pprReg rd
-pprInstr _ (WRY reg1 reg2)
- = ptext (sLit "\twr\t")
- <> pprReg reg1
- <> char ','
- <> pprReg reg2
- <> char ','
- <> ptext (sLit "%y")
-
-pprInstr platform (SMUL b reg1 ri reg2) = pprRegRIReg platform (sLit "smul") b reg1 ri reg2
-pprInstr platform (UMUL b reg1 ri reg2) = pprRegRIReg platform (sLit "umul") b reg1 ri reg2
-pprInstr platform (SDIV b reg1 ri reg2) = pprRegRIReg platform (sLit "sdiv") b reg1 ri reg2
-pprInstr platform (UDIV b reg1 ri reg2) = pprRegRIReg platform (sLit "udiv") b reg1 ri reg2
+ | not b && reg1 == g0
+ = let doit = hcat [ ptext (sLit "\tmov\t"), pprRI platform ri, comma, pprReg reg2 ]
+ in case ri of
+ RIReg rrr | rrr == reg2 -> empty
+ _ -> doit
+
+ | otherwise
+ = pprRegRIReg platform (sLit "or") b reg1 ri reg2
+
+pprInstr platform (ORN b reg1 ri reg2) = pprRegRIReg platform (sLit "orn") b reg1 ri reg2
+
+pprInstr platform (XOR b reg1 ri reg2) = pprRegRIReg platform (sLit "xor") b reg1 ri reg2
+pprInstr platform (XNOR b reg1 ri reg2) = pprRegRIReg platform (sLit "xnor") b reg1 ri reg2
+
+pprInstr platform (SLL reg1 ri reg2) = pprRegRIReg platform (sLit "sll") False reg1 ri reg2
+pprInstr platform (SRL reg1 ri reg2) = pprRegRIReg platform (sLit "srl") False reg1 ri reg2
+pprInstr platform (SRA reg1 ri reg2) = pprRegRIReg platform (sLit "sra") False reg1 ri reg2
+
+pprInstr _ (RDY rd) = ptext (sLit "\trd\t%y,") <> pprReg rd
+pprInstr _ (WRY reg1 reg2)
+ = ptext (sLit "\twr\t")
+ <> pprReg reg1
+ <> char ','
+ <> pprReg reg2
+ <> char ','
+ <> ptext (sLit "%y")
+
+pprInstr platform (SMUL b reg1 ri reg2) = pprRegRIReg platform (sLit "smul") b reg1 ri reg2
+pprInstr platform (UMUL b reg1 ri reg2) = pprRegRIReg platform (sLit "umul") b reg1 ri reg2
+pprInstr platform (SDIV b reg1 ri reg2) = pprRegRIReg platform (sLit "sdiv") b reg1 ri reg2
+pprInstr platform (UDIV b reg1 ri reg2) = pprRegRIReg platform (sLit "udiv") b reg1 ri reg2
pprInstr platform (SETHI imm reg)
= hcat [
- ptext (sLit "\tsethi\t"),
- pprImm platform imm,
- comma,
- pprReg reg
+ ptext (sLit "\tsethi\t"),
+ pprImm platform imm,
+ comma,
+ pprReg reg
]
-pprInstr _ NOP
- = ptext (sLit "\tnop")
+pprInstr _ NOP
+ = ptext (sLit "\tnop")
-pprInstr _ (FABS size reg1 reg2)
- = pprSizeRegReg (sLit "fabs") size reg1 reg2
+pprInstr _ (FABS size reg1 reg2)
+ = pprSizeRegReg (sLit "fabs") size reg1 reg2
-pprInstr _ (FADD size reg1 reg2 reg3)
- = pprSizeRegRegReg (sLit "fadd") size reg1 reg2 reg3
+pprInstr _ (FADD size reg1 reg2 reg3)
+ = pprSizeRegRegReg (sLit "fadd") size reg1 reg2 reg3
pprInstr _ (FCMP e size reg1 reg2)
- = pprSizeRegReg (if e then sLit "fcmpe" else sLit "fcmp") size reg1 reg2
+ = pprSizeRegReg (if e then sLit "fcmpe" else sLit "fcmp") size reg1 reg2
pprInstr _ (FDIV size reg1 reg2 reg3)
- = pprSizeRegRegReg (sLit "fdiv") size reg1 reg2 reg3
+ = pprSizeRegRegReg (sLit "fdiv") size reg1 reg2 reg3
-pprInstr _ (FMOV size reg1 reg2)
- = pprSizeRegReg (sLit "fmov") size reg1 reg2
+pprInstr _ (FMOV size reg1 reg2)
+ = pprSizeRegReg (sLit "fmov") size reg1 reg2
pprInstr _ (FMUL size reg1 reg2 reg3)
- = pprSizeRegRegReg (sLit "fmul") size reg1 reg2 reg3
+ = pprSizeRegRegReg (sLit "fmul") size reg1 reg2 reg3
-pprInstr _ (FNEG size reg1 reg2)
- = pprSizeRegReg (sLit "fneg") size reg1 reg2
+pprInstr _ (FNEG size reg1 reg2)
+ = pprSizeRegReg (sLit "fneg") size reg1 reg2
-pprInstr _ (FSQRT size reg1 reg2)
- = pprSizeRegReg (sLit "fsqrt") size reg1 reg2
+pprInstr _ (FSQRT size reg1 reg2)
+ = pprSizeRegReg (sLit "fsqrt") size reg1 reg2
-pprInstr _ (FSUB size reg1 reg2 reg3)
- = pprSizeRegRegReg (sLit "fsub") size reg1 reg2 reg3
+pprInstr _ (FSUB size reg1 reg2 reg3)
+ = pprSizeRegRegReg (sLit "fsub") size reg1 reg2 reg3
pprInstr _ (FxTOy size1 size2 reg1 reg2)
= hcat [
- ptext (sLit "\tf"),
- ptext
- (case size1 of
- II32 -> sLit "ito"
- FF32 -> sLit "sto"
- FF64 -> sLit "dto"
- _ -> panic "SPARC.Ppr.pprInstr.FxToY: no match"),
- ptext
- (case size2 of
- II32 -> sLit "i\t"
- II64 -> sLit "x\t"
- FF32 -> sLit "s\t"
- FF64 -> sLit "d\t"
- _ -> panic "SPARC.Ppr.pprInstr.FxToY: no match"),
- pprReg reg1, comma, pprReg reg2
+ ptext (sLit "\tf"),
+ ptext
+ (case size1 of
+ II32 -> sLit "ito"
+ FF32 -> sLit "sto"
+ FF64 -> sLit "dto"
+ _ -> panic "SPARC.Ppr.pprInstr.FxToY: no match"),
+ ptext
+ (case size2 of
+ II32 -> sLit "i\t"
+ II64 -> sLit "x\t"
+ FF32 -> sLit "s\t"
+ FF64 -> sLit "d\t"
+ _ -> panic "SPARC.Ppr.pprInstr.FxToY: no match"),
+ pprReg reg1, comma, pprReg reg2
]
pprInstr platform (BI cond b blockid)
= hcat [
- ptext (sLit "\tb"), pprCond cond,
- if b then pp_comma_a else empty,
- char '\t',
- pprCLabel platform (mkAsmTempLabel (getUnique blockid))
+ ptext (sLit "\tb"), pprCond cond,
+ if b then pp_comma_a else empty,
+ char '\t',
+ pprCLabel platform (mkAsmTempLabel (getUnique blockid))
]
pprInstr platform (BF cond b blockid)
= hcat [
- ptext (sLit "\tfb"), pprCond cond,
- if b then pp_comma_a else empty,
- char '\t',
- pprCLabel platform (mkAsmTempLabel (getUnique blockid))
+ ptext (sLit "\tfb"), pprCond cond,
+ if b then pp_comma_a else empty,
+ char '\t',
+ pprCLabel platform (mkAsmTempLabel (getUnique blockid))
]
pprInstr platform (JMP addr) = (<>) (ptext (sLit "\tjmp\t")) (pprAddr platform addr)
@@ -557,16 +552,16 @@ pprRI platform (RIImm r) = pprImm platform r
pprSizeRegReg :: LitString -> Size -> Reg -> Reg -> SDoc
pprSizeRegReg name size reg1 reg2
= hcat [
- char '\t',
- ptext name,
- (case size of
- FF32 -> ptext (sLit "s\t")
- FF64 -> ptext (sLit "d\t")
- _ -> panic "SPARC.Ppr.pprSizeRegReg: no match"),
-
- pprReg reg1,
- comma,
- pprReg reg2
+ char '\t',
+ ptext name,
+ (case size of
+ FF32 -> ptext (sLit "s\t")
+ FF64 -> ptext (sLit "d\t")
+ _ -> panic "SPARC.Ppr.pprSizeRegReg: no match"),
+
+ pprReg reg1,
+ comma,
+ pprReg reg2
]
@@ -574,17 +569,17 @@ pprSizeRegReg name size reg1 reg2
pprSizeRegRegReg :: LitString -> Size -> Reg -> Reg -> Reg -> SDoc
pprSizeRegRegReg name size reg1 reg2 reg3
= hcat [
- char '\t',
- ptext name,
- (case size of
- FF32 -> ptext (sLit "s\t")
- FF64 -> ptext (sLit "d\t")
- _ -> panic "SPARC.Ppr.pprSizeRegReg: no match"),
- pprReg reg1,
- comma,
- pprReg reg2,
- comma,
- pprReg reg3
+ char '\t',
+ ptext name,
+ (case size of
+ FF32 -> ptext (sLit "s\t")
+ FF64 -> ptext (sLit "d\t")
+ _ -> panic "SPARC.Ppr.pprSizeRegReg: no match"),
+ pprReg reg1,
+ comma,
+ pprReg reg2,
+ comma,
+ pprReg reg3
]
@@ -592,26 +587,26 @@ pprSizeRegRegReg name size reg1 reg2 reg3
pprRegRIReg :: Platform -> LitString -> Bool -> Reg -> RI -> Reg -> SDoc
pprRegRIReg platform name b reg1 ri reg2
= hcat [
- char '\t',
- ptext name,
- if b then ptext (sLit "cc\t") else char '\t',
- pprReg reg1,
- comma,
- pprRI platform ri,
- comma,
- pprReg reg2
+ char '\t',
+ ptext name,
+ if b then ptext (sLit "cc\t") else char '\t',
+ pprReg reg1,
+ comma,
+ pprRI platform ri,
+ comma,
+ pprReg reg2
]
{-
pprRIReg :: LitString -> Bool -> RI -> Reg -> SDoc
pprRIReg name b ri reg1
= hcat [
- char '\t',
- ptext name,
- if b then ptext (sLit "cc\t") else char '\t',
- pprRI ri,
- comma,
- pprReg reg1
+ char '\t',
+ ptext name,
+ if b then ptext (sLit "cc\t") else char '\t',
+ pprRI ri,
+ comma,
+ pprReg reg1
]
-}
@@ -629,5 +624,5 @@ pp_comma_lbracket = text ",["
pp_comma_a :: SDoc
-pp_comma_a = text ",a"
+pp_comma_a = text ",a"