2 % (c) The AQUA Project, Glasgow University, 1993-1998
7 CodeSegment(..), StixReg(..), StixTree(..), StixTreeList,
8 sStLitLbl, pprStixTrees,
10 stgBaseReg, stgNode, stgSp, stgSu, stgSpLim, stgHp, stgHpLim, stgTagReg,
16 #include "HsVersions.h"
18 import Ratio ( Rational )
20 import AbsCSyn ( node, tagreg, MagicId(..) )
21 import AbsCUtils ( magicIdPrimRep )
22 import CallConv ( CallConv, pprCallConv )
23 import CLabel ( mkAsmTempLabel, CLabel, pprCLabel )
24 import PrimRep ( PrimRep, showPrimRep )
25 import PrimOp ( PrimOp, pprPrimOp )
26 import Unique ( Unique )
27 import SMRep ( fixedHdrSize, arrHdrSize )
28 import UniqSupply ( returnUs, thenUs, getUniqueUs, UniqSM )
32 Here is the tag at the nodes of our @StixTree@. Notice its
33 relationship with @PrimOp@ in prelude/PrimOp.
37 = -- Segment (text or data)
41 -- We can tag the leaves with constants/immediates.
43 | StInt Integer -- ** add Kind at some point
45 | StString FAST_STRING
46 | StLitLbl SDoc -- literal labels
47 -- (will be _-prefixed on some machines)
48 | StLitLit FAST_STRING -- innards from CLitLit
49 | StCLbl CLabel -- labels that we might index into
51 -- Abstract registers of various kinds
55 -- A typed offset from a base location
57 | StIndex PrimRep StixTree StixTree -- kind, base, offset
59 -- An indirection from an address to its contents.
61 | StInd PrimRep StixTree
63 -- Assignment is typed to determine size and register placement
65 | StAssign PrimRep StixTree StixTree -- dst, src
67 -- A simple assembly label that we might jump to.
71 -- A function header and footer
76 -- An unconditional jump. This instruction is terminal.
77 -- Dynamic targets are allowed
81 -- A fall-through, from slow to fast
83 | StFallThrough CLabel
85 -- A conditional jump. This instruction can be non-terminal :-)
86 -- Only static, local, forward labels are allowed
88 | StCondJump CLabel StixTree
90 -- Raw data (as in an info table).
92 | StData PrimRep [StixTree]
94 -- Primitive Operations
96 | StPrim PrimOp [StixTree]
98 -- Calls to C functions
100 | StCall FAST_STRING CallConv PrimRep [StixTree]
102 -- Assembly-language comments
104 | StComment FAST_STRING
106 sStLitLbl :: FAST_STRING -> StixTree
107 sStLitLbl s = StLitLbl (ptext s)
110 pprStixTrees :: [StixTree] -> SDoc
113 vcat (map ppStixTree ts),
118 paren t = char '(' <> t <> char ')'
120 ppStixTree :: StixTree -> SDoc
123 StSegment cseg -> paren (ppCodeSegment cseg)
124 StInt i -> paren (integer i)
125 StDouble rat -> paren (text "Double" <+> rational rat)
126 StString str -> paren (text "Str" <+> ptext str)
127 StComment str -> paren (text "Comment" <+> ptext str)
129 StLitLit ll -> paren (text "LitLit" <+> ptext ll)
130 StCLbl lbl -> pprCLabel lbl
131 StReg reg -> ppStixReg reg
132 StIndex k b o -> paren (ppStixTree b <+> char '+' <>
133 pprPrimRep k <+> ppStixTree o)
134 StInd k t -> pprPrimRep k <> char '[' <> ppStixTree t <> char ']'
135 StAssign k d s -> ppStixTree d <> text " :=" <> pprPrimRep k
136 <> text " " <> ppStixTree s
137 StLabel ll -> pprCLabel ll <+> char ':'
138 StFunBegin ll -> char ' ' $$ paren (text "FunBegin" <+> pprCLabel ll)
139 StFunEnd ll -> paren (text "FunEnd" <+> pprCLabel ll)
140 StJump t -> paren (text "Jump" <+> ppStixTree t)
141 StFallThrough ll -> paren (text "FallThru" <+> pprCLabel ll)
142 StCondJump l t -> paren (text "JumpC" <+> pprCLabel l <+> ppStixTree t)
143 StData k ds -> paren (text "Data" <+> pprPrimRep k <+>
144 hsep (map ppStixTree ds))
145 StPrim op ts -> paren (text "Prim" <+> pprPrimOp op <+> hsep (map ppStixTree ts))
147 -> paren (text "Call" <+> ptext nm <+>
148 pprCallConv cc <+> pprPrimRep k <+> hsep (map ppStixTree args))
150 pprPrimRep = text . showPrimRep
153 Stix registers can have two forms. They {\em may} or {\em may not}
154 map to real, machine-level registers.
158 = StixMagicId MagicId -- Regs which are part of the abstract machine model
160 | StixTemp Unique PrimRep -- "Regs" which model local variables (CTemps) in
163 ppStixReg (StixMagicId mid)
165 ppStixReg (StixTemp u pr)
166 = hcat [text "Temp(", ppr u, ppr pr, char ')']
169 ppMId BaseReg = text "BaseReg"
170 ppMId (VanillaReg kind n) = hcat [text "IntReg(", int (I# n), char ')']
171 ppMId (FloatReg n) = hcat [text "FltReg(", int (I# n), char ')']
172 ppMId (DoubleReg n) = hcat [text "DblReg(", int (I# n), char ')']
173 ppMId (LongReg kind n) = hcat [text "LongReg(", int (I# n), char ')']
176 ppMId SpLim = text "SpLim"
178 ppMId HpLim = text "HpLim"
179 ppMId CurCostCentre = text "CCC"
180 ppMId VoidReg = text "VoidReg"
183 We hope that every machine supports the idea of data segment and text
184 segment (or that it has no segments at all, and we can lump these
188 data CodeSegment = DataSegment | TextSegment deriving (Eq, Show)
189 ppCodeSegment = text . show
191 type StixTreeList = [StixTree] -> [StixTree]
194 Stix Trees for STG registers:
196 stgBaseReg, stgNode, stgSp, stgSu, stgSpLim, stgHp, stgHpLim
199 stgBaseReg = StReg (StixMagicId BaseReg)
200 stgNode = StReg (StixMagicId node)
201 stgTagReg = StReg (StixMagicId tagreg)
202 stgSp = StReg (StixMagicId Sp)
203 stgSu = StReg (StixMagicId Su)
204 stgSpLim = StReg (StixMagicId SpLim)
205 stgHp = StReg (StixMagicId Hp)
206 stgHpLim = StReg (StixMagicId HpLim)
208 getUniqLabelNCG :: UniqSM CLabel
210 = getUniqueUs `thenUs` \ u ->
211 returnUs (mkAsmTempLabel u)
213 fixedHS = StInt (toInteger fixedHdrSize)
214 arrHS = StInt (toInteger arrHdrSize)