2 % (c) The AQUA Project, Glasgow University, 1993-1998
7 CodeSegment(..), StixReg(..), StixTree(..), StixTreeList,
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 )
23 import CLabel ( mkAsmTempLabel, CLabel )
24 import PrimRep ( PrimRep )
25 import PrimOp ( PrimOp )
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 Stix registers can have two forms. They {\em may} or {\em may not}
111 map to real, machine-level registers.
115 = StixMagicId MagicId -- Regs which are part of the abstract machine model
117 | StixTemp Unique PrimRep -- "Regs" which model local variables (CTemps) in
121 We hope that every machine supports the idea of data segment and text
122 segment (or that it has no segments at all, and we can lump these
126 data CodeSegment = DataSegment | TextSegment deriving Eq
128 type StixTreeList = [StixTree] -> [StixTree]
131 Stix Trees for STG registers:
133 stgBaseReg, stgNode, stgSp, stgSu, stgSpLim, stgHp, stgHpLim
136 stgBaseReg = StReg (StixMagicId BaseReg)
137 stgNode = StReg (StixMagicId node)
138 stgTagReg = StReg (StixMagicId tagreg)
139 stgSp = StReg (StixMagicId Sp)
140 stgSu = StReg (StixMagicId Su)
141 stgSpLim = StReg (StixMagicId SpLim)
142 stgHp = StReg (StixMagicId Hp)
143 stgHpLim = StReg (StixMagicId HpLim)
145 getUniqLabelNCG :: UniqSM CLabel
147 = getUniqueUs `thenUs` \ u ->
148 returnUs (mkAsmTempLabel u)
150 fixedHS = StInt (toInteger fixedHdrSize)
151 arrHS = StInt (toInteger arrHdrSize)