12#include <boost/format.hpp>
63 newInstr->
addMove(std::make_shared<TTAProgram::Move>(
66 dstProcedure.
add(newInstr);
81 auto movePtr = std::make_shared<TTAProgram::Move>(
84 movePtr->addAnnotation(annotation);
87 dstProcedure.
add(newInstr);
98 const Operation& op = pool.operation(opName.c_str());
117 for (
int i = 0; i < rf.
portCount(); i++) {
121 *rf.
port(i), regNum);
126 *rf.
port(i), regNum);
141 size_t findResult = name.find(
".");
143 if (findResult == std::string::npos) {
148 TCEString rfName = name.substr(0, findResult);
151 rf = regNav.
item(rfName);
153 name.substr(findResult + 1, name.length()-findResult+1));
175 if (dstTerminal->
isGPR()) {
180 if (width < defaultWidth) {
181 width = defaultWidth;
184 loadOp = (boost::format(
"ld%d") % width).str();
188 if (
opset_.count(loadOp) == 0) {
190 (boost::format(
"Operation %s not found in the machine") % loadOp)
219 if (srcTerminal->
isGPR()) {
223 if (width < defaultWidth) {
224 width = defaultWidth;
228 storeOp = (boost::format(
"st%d") % width).str();
232 if (
opset_.count(storeOp) == 0) {
234 (boost::format(
"Operation %s not found in the machine") % storeOp)
265 loadTerminal(dstProcedure, srcTerminal, dstRegTerminal);
510 pushToStack(dstProcedure, stackRegister, srcTerminal);
636 dstProcedure, jumpDestTerminal, jump1Terminal, annotation);
639std::shared_ptr<TTAProgram::Move>
648 return std::make_shared<TTAProgram::Move>(jump0Terminal, jump1Terminal,
656std::shared_ptr<TTAProgram::Move>
663 return std::make_shared<TTAProgram::Move>(
756 for(RegisterSet::const_iterator i = saveRegs.begin();
757 i != saveRegs.end(); i++) {
778#ifdef ALL_STACK_PARAMETERS
788#ifdef ALL_STACK_PARAMETERS
801 retVal->
add(yeldReturnInstruction);
807 for(RegisterSet::const_reverse_iterator i = saveRegs.rbegin();
808 i != saveRegs.rend(); i++) {
817 *yeldReturnInstruction,
820 retVal->
remove(*yeldReturnInstruction);
853 if (bus ==
nullptr) {
859 for (
int i = 0 ; i < bus->
guardCount(); i++) {
875 auto port = pg->
port();
878 for (
int i = 0 ; i < bus->
guardCount(); i++) {
882 if (pg2 && pg2->
port() == port &&
897std::vector <ProgramOperationPtr>
899 const MoveNode* dynamicLimitMove,
int iterationCount,
int loopSize,
int divider) {
901 std::vector<ProgramOperationPtr> res;
903 if (divider & (divider-1)) {
907 const char* opName =
"lbufs";
914 const Operation& lbufsOp = pool.operation(opName);
916 loopSizeSV = loopSize;
935 if (dynamicLimitMove == NULL) {
937 iterCountSV = iterationCount;
941 bool decrement =
false;
942 bool increment =
false;
943 switch (iterationCount) {
949 if (iterationCount > 0)
961 TCEString adjustName = decrement ?
"sub" :
"add";
965 if (decrement || increment) {
966 const Operation& subOp = pool.operation(adjustName.c_str());
967 subPO = std::make_shared<ProgramOperation>(subOp);
979 subPO->addInputNode(*subAmtMN);
983 subPO->addOutputNode(*iterCountMN);
986 res.push_back(subPO);
995 const Operation& shiftOp = pool.operation(shiftName.c_str());
1000 shiftAmountSV = shiftAmount;
1016 shiftPO = std::make_shared<ProgramOperation>(shiftOp);
1017 shiftPO->addInputNode(*shiftValMN);
1018 shiftPO->addInputNode(*shiftAmtMN);
1023 res.insert(res.begin(),shiftPO);
1025 if (!(decrement||increment)) {
1027 shiftPO->addOutputNode(*iterCountMN);
1034 subPO->addInputNode(*shift2dec);
1037 shiftPO->addOutputNode(*shift2dec);
1041 if (decrement||increment) {
1046 subPO->addInputNode(*subValMN);
1056 loopBusInitOp->addInputNode(*iterCountMN);
1057 loopBusInitOp->addInputNode(*loopSizeMN);
1061 res.push_back(loopBusInitOp);
1084 const char* opName = rg->
isInverted() ?
"lbufc" :
"lbufz";
1096 *rg->registerFile(), rg->registerIndex(),
true);
1101 const Operation& op = pool.operation(opName);
1103 po->addInputNode(*loopSizeMN);
1117 const char* opName =
"infloop";
1128 const Operation& lbufsOp = pool.operation(opName);
1130 loopSizeSV = loopSize;
1137 loopBufInitOp->addInputNode(*loopSizeMN);
1139 return loopBufInitOp;
#define abortWithError(message)
std::shared_ptr< ProgramOperation > ProgramOperationPtr
static int toInt(const T &source)
static int maxMemoryAlignment(const TTAMachine::Machine &mach)
static OperationSet getOpset(const TTAMachine::Machine &mach)
void setSourceOperationPtr(ProgramOperationPtr po)
TTAProgram::Move & move()
bool isSourceOperation() const
void addDestinationOperationPtr(ProgramOperationPtr po)
virtual bool isControlFlowOperation() const
virtual int width() const
virtual RFPort * port(const std::string &name) const
Guard * guard(int index) const
SpecialRegisterPort * returnAddressPort() const
virtual AddressSpace * addressSpace() const
virtual HWOperation * operation(const std::string &name) const
virtual bool hasOperation(const std::string &name) const
virtual bool isInverted() const
virtual Bus * parentBus() const
ComponentType * item(int index) const
virtual RegisterFileNavigator registerFileNavigator() const
bool isLittleEndian() const
virtual ControlUnit * controlUnit() const
static NullInstructionTemplate & instance()
virtual bool isInput() const
virtual bool isOutput() const
int registerIndex() const
const RegisterFile * registerFile() const
virtual int portCount() const
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)
CodeGenerator(const TTAMachine::Machine &mach)
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)
virtual Instruction & nextInstruction(const Instruction &ins) const
virtual void add(Instruction *ins)
void replace(Instruction &insA, Instruction &insB)
InstructionReference createReference(Instruction &ins)
void addMove(std::shared_ptr< Move > move)
const TTAMachine::Guard & guard() const
MoveGuard & guard() const
bool isUnconditional() const
Terminal & source() const
Terminal & destination() const
void add(Instruction *ins)
void remove(Instruction &ins)
virtual Terminal * copy() const =0
virtual bool isGPR() const
virtual const TTAMachine::RegisterFile & registerFile() const
virtual TTAMachine::HWOperation * operation(const std::string &name) const
UniversalFunctionUnit & universalFunctionUnit() const
UnboundedRegisterFile & integerRegisterFile() const
TTAMachine::Bus & universalBus() const