OpenASIP 2.2
Loading...
Searching...
No Matches
CodeGenerator.hh
Go to the documentation of this file.
1/**
2 * @file CodeGenerator.hh
3 *
4 * Declaration of CodeGenerator class.
5 *
6 * @author Mikael Lepisto 2008 (mikael.lepisto@tut.fi)
7 * @author Heikki Kultala 2015 (heikki.kultala-NO.SPAM-tut.fi)
8 * @note rating: red
9 */
10
11#ifndef TTA_CODE_GENERATOR_HH
12#define TTA_CODE_GENERATOR_HH
13
14#include <set>
15
16#include "MachineInfo.hh"
17#include "ProgramOperation.hh"
18#include "TCEString.hh"
19
20namespace TTAMachine {
21 class Machine;
22 class Bus;
23 class RegisterFile;
24}
25
26namespace TTAProgram {
27 class Address;
28 class Instruction;
29 class InstructionReference;
30 class InstructionReferenceManager;
31 class Procedure;
32 class TerminalRegister;
33 class Terminal;
34 class TerminalFUPort;
35 class Move;
36 class ProgramAnnotation;
37 class MoveGuard;
38 class CodeSnippet;
39}
40
42
43namespace TTAProgram {
44
45/**
46 * CodeGenerator generates code pieces for given Program.
47 *
48 * Contains various helper functions for making hand writing of POM
49 * easier.
50 *
51 * @todo Rename to POMGenerator.
52 */
54public:
55 typedef std::set<TCEString> RegisterSet;
56
57 /// @todo This should probably take only Program
59 const TTAMachine::Machine& mach);
60
61 virtual ~CodeGenerator();
62
64 TTAProgram::CodeSnippet& dstProcedure,
65 TTAProgram::Terminal* srcTerminal,
66 TTAProgram::Terminal* dstTerminal);
67
69 TTAProgram::Terminal* srcTerminal,
70 TTAProgram::Terminal* dstTerminal,
72 annotation);
73
74
77 const TTAMachine::RegisterFile& rf, int regNum, bool readPort) const;
78
80 const TCEString& name, bool readPort);
81
83 const TCEString& opName, int operand);
84
85 void loadTerminal(TTAProgram::CodeSnippet& dstProcedure,
86 TTAProgram::Terminal* srcTerminal,
87 TTAProgram::Terminal* dstTerminal);
88
89 void storeTerminal(TTAProgram::CodeSnippet& dstProcedure,
90 TTAProgram::Terminal* dstTerminal,
91 TTAProgram::Terminal* srcTerminal);
92
94 TTAProgram::Terminal* srcTerminal,
95 const TCEString& dstReg);
96
97 void storeToAddress(TTAProgram::CodeSnippet& dstProcedure,
98 TTAProgram::Terminal* dstTerminal,
99 const TCEString& srcReg);
100
102 const TCEString& srcReg,
103 const TCEString& dstReg);
104
106 const TCEString& dstReg,
107 const TCEString& srcReg);
108
110 TTAProgram::CodeSnippet& dstProcedure, const TCEString& dstReg,
111 int increment);
112
114 TTAProgram::CodeSnippet& dstProcedure, const TCEString& dstReg,
115 int decrement);
116
118 TTAProgram::CodeSnippet& dstProcedure, const TCEString& spReg);
119
121 TTAProgram::CodeSnippet& dstProcedure, const TCEString& spReg);
122
123 void popFromStack(TTAProgram::CodeSnippet& dstProcedure,
124 const TCEString& stackRegister,
125 TTAProgram::Terminal* dstTerminal);
126
128 const TCEString& stackRegister,
129 const TCEString& dstReg);
130
131 void pushToStack(TTAProgram::CodeSnippet& dstProcedure,
132 const TCEString& stackRegister,
133 TTAProgram::Terminal* srcTerminal);
134
136 const TCEString& stackRegister,
137 const TCEString& srcReg);
138
139
140 void popFromBuffer(TTAProgram::CodeSnippet& dstProcedure,
141 const TCEString& indexRegister,
142 TTAProgram::Terminal* dstTerminal);
143
145 const TCEString& indexRegister,
146 const TCEString& dstReg);
147
148 void pushToBuffer(TTAProgram::CodeSnippet& dstProcedure,
149 const TCEString& indexRegister,
150 TTAProgram::Terminal* srcTerminal);
151
153 const TCEString& stackRegister,
154 const TCEString& srcReg);
155
157 TTAProgram::CodeSnippet& dstProcedure,
158 const TCEString& stackRegister,
160
162 TTAProgram::CodeSnippet& dstProcedure,
163 const TCEString& indexRegister,
165
166 void registerJump(
167 TTAProgram::CodeSnippet& dstProcedure,
168 const TCEString& jumpAddrReg);
169
170 void registerJump(
171 TTAProgram::CodeSnippet& dstProcedure,
172 const TCEString& jumpAddrReg,
173 const TTAProgram::ProgramAnnotation& annotation);
174
175 std::shared_ptr<TTAProgram::Move>
177
178 std::shared_ptr<TTAProgram::Move> createCall(
180
182 TTAProgram::CodeSnippet& dstProcedure,
183 const TCEString& procedureName);
184
185 void createCall(
186 TTAProgram::CodeSnippet& dstProcedure,
188
189 void registerMove(
190 TTAProgram::CodeSnippet& dstProcedure,
191 const TCEString& srcReg, const TCEString& dstReg);
192
193 void immediateMove(
194 TTAProgram::CodeSnippet& dstProcedure,
195 int imm, const TCEString& dstReg);
196
199 const TCEString& name,
200 const TCEString& schedProcedureName,
201 const TCEString& stackReg,
202 const TCEString& rvReg,
203 const RegisterSet& saveRegs);
204
206 const TTAProgram::MoveGuard &mg, const TTAMachine::Bus* bus = NULL);
207
208 std::vector<ProgramOperationPtr> createForLoopBufferInit(
209 const MoveNode* dynamicLimitMove, int iterationCount, int divider, int loopSize);
210
212
214
215 std::shared_ptr<TTAProgram::Move> createMove(
217
218private:
219 /// Target machine.
221 /// Universal machine
223
226};
227}
228
229#endif
std::shared_ptr< ProgramOperation > ProgramOperationPtr
Definition MoveNode.hh:53
TCETools::CIStringSet OperationSet
TTAProgram::TerminalFUPort * createTerminalFUPort(const TCEString &opName, int operand)
TTAProgram::Terminal * createTerminalRegister(const TTAMachine::RegisterFile &rf, int regNum, bool readPort) const
void pushToStack(TTAProgram::CodeSnippet &dstProcedure, const TCEString &stackRegister, TTAProgram::Terminal *srcTerminal)
const TTAMachine::Machine * mach_
Target machine.
void registerMove(TTAProgram::CodeSnippet &dstProcedure, const TCEString &srcReg, const TCEString &dstReg)
TTAProgram::Instruction * addMoveToProcedure(TTAProgram::CodeSnippet &dstProcedure, TTAProgram::Terminal *srcTerminal, TTAProgram::Terminal *dstTerminal)
void storeToRegisterAddress(TTAProgram::CodeSnippet &dstProcedure, const TCEString &dstReg, const TCEString &srcReg)
void immediateMove(TTAProgram::CodeSnippet &dstProcedure, int imm, const TCEString &dstReg)
ProgramOperationPtr createBreakOperation(const MoveNode *jump)
std::shared_ptr< TTAProgram::Move > createMove(TTAProgram::Terminal *src, TTAProgram::Terminal *dst)
static TTAProgram::MoveGuard * createInverseGuard(const TTAProgram::MoveGuard &mg, const TTAMachine::Bus *bus=NULL)
void loadFromAddress(TTAProgram::CodeSnippet &dstProcedure, TTAProgram::Terminal *srcTerminal, const TCEString &dstReg)
void pushToBuffer(TTAProgram::CodeSnippet &dstProcedure, const TCEString &indexRegister, TTAProgram::Terminal *srcTerminal)
void createExternalCall(TTAProgram::CodeSnippet &dstProcedure, const TCEString &procedureName)
void decrementRegisterAddress(TTAProgram::CodeSnippet &dstProcedure, const TCEString &dstReg, int decrement)
void decrementStackPointer(TTAProgram::CodeSnippet &dstProcedure, const TCEString &spReg)
void pushRegisterToStack(TTAProgram::CodeSnippet &dstProcedure, const TCEString &stackRegister, const TCEString &srcReg)
void registerJump(TTAProgram::CodeSnippet &dstProcedure, const TCEString &jumpAddrReg)
void storeTerminal(TTAProgram::CodeSnippet &dstProcedure, TTAProgram::Terminal *dstTerminal, TTAProgram::Terminal *srcTerminal)
void pushInstructionReferenceToBuffer(TTAProgram::CodeSnippet &dstProcedure, const TCEString &indexRegister, TTAProgram::InstructionReference &srcAddr)
void addAnnotatedMoveToProcedure(TTAProgram::CodeSnippet &dstProcedure, TTAProgram::Terminal *srcTerminal, TTAProgram::Terminal *dstTerminal, const TTAProgram::ProgramAnnotation &annotation)
TTAProgram::Procedure * createSchedYieldProcedure(TTAProgram::InstructionReferenceManager &refManager, const TCEString &name, const TCEString &schedProcedureName, const TCEString &stackReg, const TCEString &rvReg, const RegisterSet &saveRegs)
void loadFromRegisterAddress(TTAProgram::CodeSnippet &dstProcedure, const TCEString &srcReg, const TCEString &dstReg)
const UniversalMachine * uMach_
Universal machine.
void incrementRegisterAddress(TTAProgram::CodeSnippet &dstProcedure, const TCEString &dstReg, int increment)
std::vector< ProgramOperationPtr > createForLoopBufferInit(const MoveNode *dynamicLimitMove, int iterationCount, int divider, int loopSize)
void incrementStackPointer(TTAProgram::CodeSnippet &dstProcedure, const TCEString &spReg)
void popFromBuffer(TTAProgram::CodeSnippet &dstProcedure, const TCEString &indexRegister, TTAProgram::Terminal *dstTerminal)
void pushRegisterToBuffer(TTAProgram::CodeSnippet &dstProcedure, const TCEString &stackRegister, const TCEString &srcReg)
std::set< TCEString > RegisterSet
void storeToAddress(TTAProgram::CodeSnippet &dstProcedure, TTAProgram::Terminal *dstTerminal, const TCEString &srcReg)
MachineInfo::OperationSet opset_
ProgramOperationPtr createWhileLoopBufferInit(int loopSize)
std::shared_ptr< TTAProgram::Move > createJump(TTAProgram::InstructionReference &dst)
void popFromStack(TTAProgram::CodeSnippet &dstProcedure, const TCEString &stackRegister, TTAProgram::Terminal *dstTerminal)
void popRegisterFromBuffer(TTAProgram::CodeSnippet &dstProcedure, const TCEString &indexRegister, const TCEString &dstReg)
std::shared_ptr< TTAProgram::Move > createCall(TTAProgram::InstructionReference &callDst)
void loadTerminal(TTAProgram::CodeSnippet &dstProcedure, TTAProgram::Terminal *srcTerminal, TTAProgram::Terminal *dstTerminal)
void pushInstructionReferenceToStack(TTAProgram::CodeSnippet &dstProcedure, const TCEString &stackRegister, TTAProgram::InstructionReference &srcAddr)
void popRegisterFromStack(TTAProgram::CodeSnippet &dstProcedure, const TCEString &stackRegister, const TCEString &dstReg)