90 if (cfg_->hasMultipleUnconditionalSuccessors(jumpingBB)) {
91 bbnStatus_[&jumpingBB] = BBN_BOTH_FILLED;
96 if (jumpingBB.isLoopScheduled() || jumpingBB.isHWLoop()) {
97 bbnStatus_[&jumpingBB] = BBN_BOTH_FILLED;
101 bool cfgChanged =
false;
104 switch (bbnStatus_[&jumpingBB]) {
106 bbnStatus_[&jumpingBB] = BBN_FALLTHRU_FILLED;
108 case BBN_JUMP_FILLED:
109 bbnStatus_[&jumpingBB] = BBN_BOTH_FILLED;
115 switch (bbnStatus_[&jumpingBB]) {
117 bbnStatus_[&jumpingBB] = BBN_JUMP_FILLED;
119 case BBN_FALLTHRU_FILLED:
120 bbnStatus_[&jumpingBB] = BBN_BOTH_FILLED;
130 cfg_->program()->instructionReferenceManager();
133 std::pair<int, TTAProgram::Move*> jumpData = findJump(thisBB);
134 std::pair<Move*, std::shared_ptr<Immediate> > jumpAddressData;
137 int jumpIndex = jumpData.first;
138 Move* jumpMove = jumpData.second;
144 if (jumpMove == NULL) {
150 jumpAddressData = findJumpImmediate(jumpIndex, *jumpMove, irm);
151 if (jumpAddressData.first == NULL &&
152 jumpAddressData.second == NULL) {
157 jumpAddressData.first = jumpMove;
162 unsigned int grIndex = 0;
165 int maxFillCount = std::min(
169 int maxGuardedFillCount = 0;
181 maxGuardedFillCount = INT_MAX;
191 MoveNode& jumpNode = ddg_->nodeOfMove(*jumpMove);
193 ddg_->guardDefMoves(jumpNode);
194 if (guardDefs.size() != 1) {
197 maxGuardedFillCount = std::min(maxGuardedFillCount,delaySlots+1);
199 MoveNode& guardDefMove = **guardDefs.begin();
200 if (&ddg_->getBasicBlockNode(guardDefMove) == &jumpingBB) {
202 *resourceManagers_[&jumpingBB.basicBlock()];
204 int earliestToFill = guardDefMove.
cycle() -
208 maxGuardedFillCount =
209 std::min(maxGuardedFillCount,
215 maxGuardedFillCount =
216 std::min(maxGuardedFillCount,
224 for (ControlFlowGraph::EdgeSet::iterator iter = outEdges.begin();
225 iter != outEdges.end(); iter++) {
227 int myMaxGuardedFillCount = maxGuardedFillCount;
246 if (&nextBBN == &jumpingBB) {
249 maxFillCount = std::min(maxFillCount, nextInsCount/2);
252 maxFillCount = std::min(maxFillCount,nextInsCount);
256 if (jumpMove != NULL) {
264 myMaxGuardedFillCount = 0;
272 for (
int i = 0; i < maxFillCount; i++) {
280 if (maxFillCount == 0) {
295 ddg_->fixInterBBAntiEdges(jumpingBB, nextBBN, edge.
isBackEdge());
301 for (
int fillSize = maxFillCount; fillSize > 0; fillSize--) {
302 int removeGuards = (fillSize > myMaxGuardedFillCount) ?
303 fillSize - myMaxGuardedFillCount : 0;
305 bool ok = tryToFillSlots(
306 jumpingBB, nextBBN, fillFallThru, jumpMove, fillSize,
307 removeGuards, grIndex, grFile, skippedJump, delaySlots);
309 slotsFilled = fillSize;
315 if (slotsFilled != 0) {
320 cfgChanged |= updateJumpsAndCfg(
321 jumpingBB, nextBBN, edge, jumpAddressData.first,
322 jumpAddressData.second, jumpMove, slotsFilled,
325 cfgChanged |= updateFTBBAndCfg(
326 jumpingBB, nextBBN, edge, slotsFilled);
340 for (
int i = 0; i < slotsFilled; i++) {
348 assert(oEdges.size() == 1);
366 i < nextBBN.
basicBlock().instructionCount(); i++) {
415 for (
int i = 0; i < cfg.
nodeCount(); i++) {
421 bbn, delaySlots,
false);
427 for (
int i = 0; i < cfg.
nodeCount(); i++) {
432 bbn, delaySlots,
true);
438 for (std::map<BasicBlockNode*, BBNStates>::iterator i =
446 for (std::map<BasicBlock*, SimpleResourceManager*>::iterator i =
448 if (i->second != NULL) {
471 bool allJumpPredsFilled =
true;
473 for (ControlFlowGraph::EdgeSet::iterator inIter =
474 inEdges.begin(); inIter != inEdges.end();
484 allJumpPredsFilled =
false;
488 return allJumpPredsFilled;
499 bool allPredsScheduled =
true;
501 for (ControlFlowGraph::EdgeSet::iterator inIter =
502 inEdges.begin(); inIter != inEdges.end();
511 allPredsScheduled =
false;
515 return allPredsScheduled;
545 bool cfgChanged =
false;
546 bool cfgChangedAfterRecheck =
false;
551 for (
auto inIter = jumpEdges.begin(); inIter != jumpEdges.end();) {
560 cfgChanged |= changed;
561 cfgChangedAfterRecheck |= changed;
569 if (fallThruSisterNode != NULL &&
574 cfgChanged |= changed;
575 cfgChangedAfterRecheck |= changed;
581 if (cfgChangedAfterRecheck) {
585 cfgChangedAfterRecheck =
false;
587 inIter = jumpEdges.begin();
602 if (ftEdge !=
nullptr && ftEdge->isFallThroughEdge()) {
614 if (jumpSisterNode != NULL &&
653 bool fillableSuccessor =
false;
654 for (ControlFlowGraph::EdgeSet::iterator outIter = oEdges.begin();
655 outIter != oEdges.end();) {
660 fillableSuccessor =
true;
668 outIter = oEdges.begin();
704std::pair<TTAProgram::Move*, std::shared_ptr<TTAProgram::Immediate> >
708 Move* irMove = &jumpMove;
709 int irIndex = jumpIndex;
718 int regIndex =
static_cast<int>(irMove->
source().
index());
724 return std::pair<Move*,std::shared_ptr<Immediate> >(
nullptr,
nullptr);
732 return std::pair<Move*,std::shared_ptr<Immediate> >(
735 for (
int j = 0; j < ins.
moveCount(); j++ ) {
750 return std::pair<Move*,std::shared_ptr<Immediate> >(
755 return std::pair<Move*,std::shared_ptr<Immediate> >(irMove,
nullptr);
761 int index =
static_cast<int>(irMove->
source().
index());
762 for (
int i = irIndex - immu.
latency(); i >= 0; i--) {
766 if (imm->destination().index() == index &&
767 &imm->destination().immediateUnit() == &immu) {
768 return std::pair<Move*,std::shared_ptr<Immediate> >(
775 return std::pair<Move*,std::shared_ptr<Immediate> >(
780 return std::pair<Move*, std::shared_ptr<Immediate> >(
nullptr,
nullptr);
795 static_cast<int>(registerIndex)) {
819 Move* jumpMove,
int slotsToFill,
int removeGuards,
int grIndex,
827 if (nextRm == NULL) {
831 int firstCycleToFill =
839 blockToFillNode, nextBBNode, moves, slotsToFill,fallThru,
840 removeGuards, jumpMove, grIndex, grFile, skippedJump,
895 Move*& skippedJump,
int delaySlots) {
905 int firstIndexToFill =
912 for (
int i = 0; i < slotsToFill; i++) {
922 if (&blockToFillNode == &nextBBN) {
938 pendingImmediateMap[immName] = &imm.
value();
944 for (
int j = 0; j < filler.
moveCount(); j++) {
946 bool dontGuard = i < removeGuards;
958 if (i != slotsToFill - delaySlots -1) {
973 if (jumpMove ==
nullptr
979 skippedJump = &oldMove;
993 if (i != slotsToFill-1) {
1045 mnOld, blockToFillNode, connectingEdge->
isBackEdge());
1055 PendingImmediateMap::iterator immWriteIter =
1056 pendingImmediateMap.find(immName);
1059 if (immWriteIter == pendingImmediateMap.end()) {
1062 newMove.
setSource(immWriteIter->second->copy());
1063 pendingImmediateMap.erase(immWriteIter);
1081 guardOp->addGuardOutputNode(mn);
1088 moves.at(i).push_back(&mn);
1092 if (&blockToFillNode == &nextBBN) {
1108 pendingImmediateMap[immName] = &imm.
value();
1117 for (
int j = 0; j < firstNotToFill.
moveCount(); j++) {
1118 Move& move = firstNotToFill.
move(j);
1133 return pendingImmediateMap.empty();
1163 if (pendingImmediateMap.find(immName) !=
1164 pendingImmediateMap.end()) {
1168 pendingImmediateMap[immName] = &imm.
value();
1173 for (
int j=0; j < filler. moveCount(); j++) {
1181 PendingImmediateMap::iterator immWriteIter =
1182 pendingImmediateMap.find(immName);
1184 if (immWriteIter == pendingImmediateMap.end()) {
1190 pendingImmediateMap.erase(immWriteIter);
1202 if (pendingImmediateMap.find(immName) !=
1203 pendingImmediateMap.end()) {
1207 pendingImmediateMap[immName] = &imm.
value();
1213 if (!pendingImmediateMap.empty()) {
1231 for (DataDependenceGraph::EdgeSet::iterator ieIter =
1232 inEdges.begin(); ieIter != inEdges.end(); ieIter++) {
1233 int mnCycle = mnOld.
cycle();
1243 if (&predBlock == &blockToFillNode) {
1252 nodeCycle = pred.
cycle() - delay+1;
1261 nodeCycle = pred.
cycle()+delay;
1263 if (nodeCycle > cycleDiff+mnCycle) {
1287 bool failed =
false;
1290 for (
unsigned int i = 0; i < (unsigned)slotsToFill &&
1291 i < moves.size() && !failed; i++) {
1292 list<MoveNode*>& movesInThisCycle = moves.at(i);
1293 int currentCycle = firstCycleToFill + i;
1295 for (std::list<MoveNode*>::iterator iter = movesInThisCycle.begin();
1296 iter != movesInThisCycle.end() && !failed; iter++) {
1313 guardOp->removeGuardOutputNode(mn);
1331 rm.
assign(currentCycle, mn);
1333 if (mn.
cycle() != currentCycle) {
1343 bool limmFound =
false;
1344 for (
int j = (firstCycleToFill+i-immu.
latency());
1345 j >= firstCycleToFill && !limmFound; j--) {
1372 mn, firstCycleToFill, rm,
1373 firstCycleToFill + (slotsToFill-1), nextBBStart,
1383 for (
int i = 0; i < slotsToFill; i++) {
1384 list<MoveNode*>& movesInThisCycle = moves.at(i);
1385 for (std::list<MoveNode*>::iterator iter =
1386 movesInThisCycle.begin();
1387 iter != movesInThisCycle.end();iter++) {
1411 nextBBStart, tempAssigns)) {
1435 if (!rm.
canAssign(mnCycle, operMn, bus)) {
1444 guardOp->removeGuardOutputNode(operMn);
1448 if (!rm.
canAssign(mnCycle, operMn, bus)) {
1453 rm.
assign(mnCycle, operMn);
1455 if (mnCycle > lastCycle) {
1456 tempAssigns.insert(&operMn);
1472 if (!rm.
canAssign(mnCycle, resMn, bus)) {
1475 rm.
assign(mnCycle, resMn);
1476 if (mnCycle > lastCycle) {
1477 tempAssigns.insert(&resMn);
1552 for (
int i = 0; i < old->inputMoveCount();i++) {
1555 po->addInputNode(
getMoveNode(mn, bbn, fillOverBackEdge));
1557 for (
int j = 0; j < old->outputMoveCount();j++) {
1560 po->addOutputNode(
getMoveNode(mn,bbn,fillOverBackEdge));
1562 po->addGuardOutputNode(
getMoveNode(mn,bbn, fillOverBackEdge));
1577std::shared_ptr<Move>
1584 auto newMove = old.
copy();
1587 Terminal& source = newMove->source();
1595 newMove->setAnnotation(srcUnit);
1603 if (source.
isRA()) {
1610 Terminal& dest = newMove->destination();
1619 newMove->setAnnotation(dstUnit);
1628 newMove->setDestination(
1640 newMove->setGuard(g);
1654 std::list<MoveNode*> toDeleteNodes;
1655 for (std::map<MoveNode*,MoveNode*,MoveNode::Comparator>::iterator mnIter =
1662 if ((keptTempNodes == NULL ||
1663 (keptTempNodes->find(second) == keptTempNodes->end()))
1666 toDeleteNodes.push_back(second);
1676 for (std::list<MoveNode*>::iterator i = toDeleteNodes.begin();
1677 i != toDeleteNodes.end(); i++) {
1678 assert (!(*i)->isScheduled());
1719 for (
int i = 0; i < po->inputMoveCount(); i++) {
1721 if (tempAssigns.find(&mn) != tempAssigns.end()) {
1724 for (
unsigned int j = 0; j < movesToCopy.size(); j++) {
1725 std::list<MoveNode*>& moveList = movesToCopy.at(j);
1726 for (std::list<MoveNode*>::iterator iter = moveList.begin();
1727 iter != moveList.end(); iter++) {
1734 for (
int i = 0; i < po->outputMoveCount(); i++) {
1736 if (tempAssigns.find(&mn) != tempAssigns.end()) {
1750std::pair<int, TTAProgram::Move*>
1756 for (
int j = 0; j < ins.
moveCount(); j++ ) {
1759 if (pred ==
nullptr) {
1760 return std::pair<int, TTAProgram::Move*>(i, &move);
1764 return std::pair<int, TTAProgram::Move*>(i, &move);
1769 == (guard.isInverted())) {
1770 return std::pair<int, TTAProgram::Move*>(i, &move);
1777 return std::pair<int, TTAProgram::Move*>(-1,NULL);
1781 return std::pair<int, TTAProgram::Move*>(-1,NULL);
1799 Move* jumpAddressMove, std::shared_ptr<Immediate> jumpAddressImmediate,
1800 Move* jumpMove,
int slotsFilled,
Move* skippedJump) {
1802 bool cfgChanged =
false;
1805 &jumpAddressMove->
source()) :
1807 &jumpAddressImmediate->value());
1811 instructionReferenceManager();
1820 if (nextBBs.size() != 1) {
1821 std::string msg =
"no succeessors but no jump";
1833 if (skippedJump != NULL) {
1838 assert(jumpMove != NULL);
1842 ANN_STACKFRAME_PROCEDURE_RETURN);
1844 if (jumpAddressMove != NULL && jumpAddressMove != jumpMove) {
1852 if (jumpAddressImmediate != NULL) {
1853 jumpAddressImmediate->setValue(
1900 assert(skippedJump == NULL);
1909 int deadInsCount = 0;
1919 "BB got empty illegally");
1951 std::map<BasicBlockNode*,DataDependenceGraph::NodeSet>::iterator
1957 std::map<BasicBlock*,SimpleResourceManager*>::iterator rmi =
1972 for (ControlFlowGraph::EdgeSet::iterator inIter = iEdges.begin();
1973 inIter != iEdges.end(); inIter++) {
1987 std::map<BasicBlock*,SimpleResourceManager*>::iterator rmi =
1990 if (rmi->second != NULL) {
2003 for (DataDependenceGraph::NodeSet::iterator j = tempAssigns.begin();
2004 j != tempAssigns.end(); j++) {
2005 assert((**j).isScheduled());
2010 tempAssigns.clear();
#define assert(condition)
#define IGNORE_COMPILER_WARNING(X)
TTAMachine::Machine * machine
the architecture definition of the estimated processor
std::shared_ptr< ProgramOperation > ProgramOperationPtr
bool isLoopScheduled() const
TTAProgram::BasicBlock & basicBlock()
InstructionAddress originalStartAddress() const
virtual void disconnectNodes(const Node &nTail, const Node &nHead)
virtual Node & headNode(const Edge &edge) const
virtual void removeNode(Node &node)
virtual NodeSet successors(const Node &node, bool ignoreBackEdges=false, bool ignoreForwardEdges=false) const
Node & node(const int index) const
bool hasNode(const Node &) const
virtual int inDegree(const Node &node) const
EdgeSet connectingEdges(const Node &nTail, const Node &nHead) const
virtual EdgeSet outEdges(const Node &node) const
virtual Node & tailNode(const Edge &edge) const
virtual EdgeSet inEdges(const Node &node) const
virtual void connectNodes(const Node &nTail, const Node &nHead, Edge &e)
bool isFallThroughEdge() const
bool isCallPassEdge() const
CFGEdgePredicate edgePredicate() const
BasicBlockNode * fallThruSuccessor(const BasicBlockNode &bbn) const
ControlFlowEdge * incomingFTEdge(const BasicBlockNode &bbn) const
BasicBlockNode * jumpSuccessor(BasicBlockNode &bbn)
EdgeSet incomingJumpEdges(const BasicBlockNode &bbn) const
TTAProgram::Program * program() const
BasicBlockNode & firstNormalNode() const
static std::string toString(const T &source)
bool updateFTBBAndCfg(BasicBlockNode &jumpingBB, BasicBlockNode &nextBBN, ControlFlowEdge &edge, int slotsFilled)
bool writesRegister(TTAProgram::Move &move, const TTAMachine::RegisterFile *rf, unsigned int registerIndex)
~CopyingDelaySlotFiller()
std::map< BasicBlockNode *, DataDependenceGraph::NodeSet > tempResultNodes_
std::map< BasicBlockNode *, BBNStates > bbnStatus_
std::map< ProgramOperation *, ProgramOperationPtr, ProgramOperation::Comparator > oldProgramOperations_
bool areAllJumpPredsFilled(BasicBlockNode &bbn) const
void initialize(ControlFlowGraph &cfg, DataDependenceGraph &ddg, const TTAMachine::Machine &machine)
static std::pair< TTAProgram::Move *, std::shared_ptr< TTAProgram::Immediate > > findJumpImmediate(int jumpIndex, TTAProgram::Move &jumpMove, TTAProgram::InstructionReferenceManager &irm)
static std::pair< int, TTAProgram::Move * > findJump(TTAProgram::BasicBlock &bb, ControlFlowEdge::CFGEdgePredicate *pred=nullptr)
std::vector< std::list< MoveNode * > > MoveNodeListVector
std::map< TTAProgram::BasicBlock *, SimpleResourceManager * > resourceManagers_
void loseCopies(DataDependenceGraph::NodeSet *keptTempNodes)
bool checkIncomingDeps(MoveNode &mnOld, BasicBlockNode &blockToFillNode, int cycleDiff)
bool tryToFillSlots(BasicBlockNode &blockToFillNode, BasicBlockNode &nextBBNode, bool fallThru, TTAProgram::Move *jumpMove, int slotsToFill, int removeGuards, int grIndex, const TTAMachine::RegisterFile *grFile, TTAProgram::Move *&skippedJump, int delaySlots)
bool updateJumpsAndCfg(BasicBlockNode &jumpBBN, BasicBlockNode &fillingBBN, ControlFlowEdge &fillEdge, TTAProgram::Move *jumpAddressMove, std::shared_ptr< TTAProgram::Immediate > jumpAddressImmediate, TTAProgram::Move *jumpMove, int slotsFilled, TTAProgram::Move *skippedJump)
std::map< ProgramOperation *, ProgramOperationPtr, ProgramOperation::Comparator > programOperations_
bool poMoved(ProgramOperationPtr po, MoveNodeListVector &movesToCopy, DataDependenceGraph::NodeSet &tempAssigns)
void fillDelaySlots(ControlFlowGraph &cfg, DataDependenceGraph &ddg, const TTAMachine::Machine &machine)
ProgramOperationPtr getProgramOperationPtr(ProgramOperationPtr old, BasicBlockNode &bbn, bool fillOverBackEdge)
bool allowedToSpeculate(MoveNode &mn) const
std::map< MoveNode *, MoveNode *, MoveNode::Comparator > oldMoveNodes_
bool tryToAssignNodes(MoveNodeListVector &moves, int slotsToFill, int firstCycleToFill, ResourceManager &rm, int nextBBStart, DataDependenceGraph::NodeSet &tempAssigns)
ControlFlowGraph::NodeSet killedBBs_
std::shared_ptr< TTAProgram::Move > getMove(TTAProgram::Move &old)
void addResourceManager(TTAProgram::BasicBlock &bbn, SimpleResourceManager &rm)
std::map< TCEString, TTAProgram::TerminalImmediate * > PendingImmediateMap
bool tryToAssignOtherMovesOfOp(ProgramOperation &po, int firstCycleToFill, ResourceManager &rm, int lastCycle, int nextBBStart, DataDependenceGraph::NodeSet &tempAssigns)
std::map< TTAProgram::Move *, std::shared_ptr< TTAProgram::Move > > moves_
DataDependenceGraph * ddg_
std::map< MoveNode *, const TTAMachine::Bus *, MoveNode::Comparator > moveNodeBuses_
bool collectMoves(BasicBlockNode &blockToFillNode, BasicBlockNode &nextBBN, MoveNodeListVector &moves, int slotsToFill, bool fallThru, int removeGuards, TTAProgram::Move *jumpMove, int grIndex, const TTAMachine::RegisterFile *grFile, TTAProgram::Move *&skippedJump, int delaySlots)
MoveNode & getMoveNode(MoveNode &old, BasicBlockNode &bbn, bool fillOverBackEdge)
void unassignTempAssigns(DataDependenceGraph::NodeSet &tempAssigns, SimpleResourceManager &rm)
std::map< MoveNode *, bool, MoveNode::Comparator > mnOwned_
bool checkImmediatesAfter(TTAProgram::BasicBlock &nextBB, int slotsToFill)
void bbnScheduled(BasicBlockNode &bbn)
std::map< MoveNode *, MoveNode *, MoveNode::Comparator > moveNodes_
bool mightFillIncomingTo(BasicBlockNode &bbn)
bool tryToAssignOtherMovesOfDestOps(MoveNode &mn, int firstCycleToFill, ResourceManager &rm, int lastCycle, int nextBBStart, DataDependenceGraph::NodeSet &tempAssigns)
void finishBB(BasicBlockNode &bbn, bool force=false)
bool areAllJumpPredsScheduled(BasicBlockNode &bbn) const
void bbFilled(BasicBlockNode &bbn)
DependenceType dependenceType() const
void copyDependencies(const MoveNode &src, MoveNode &dst, bool ignoreSameBBBackedges, bool moveOverLoopEdge=true)
void addNode(MoveNode &moveNode)
const BasicBlockNode & getBasicBlockNode(const MoveNode &mn) const
void copyIncomingGuardEdges(const MoveNode &src, MoveNode &dst)
MoveNode & nodeOfMove(const TTAProgram::Move &move)
void removeNode(MoveNode &node)
std::set< GraphNode *, typename GraphNode::Comparator > NodeSet
std::set< GraphEdge *, typename GraphEdge::Comparator > EdgeSet
static bool isConnected(const TTAMachine::Port &sourcePort, const TTAMachine::Port &destinationPort, const TTAMachine::Guard *guard=NULL)
void setGuardOperationPtr(ProgramOperationPtr po)
void setSourceOperationPtr(ProgramOperationPtr po)
ProgramOperationPtr sourceOperationPtr() const
unsigned int destinationOperationCount() const
bool isGuardOperation() const
ProgramOperationPtr guardOperationPtr() const
bool isSourceVariable() const
ProgramOperation & sourceOperation() const
bool isDestinationOperation() const
void unsetGuardOperation()
TTAProgram::Move & move()
bool isSourceOperation() const
ProgramOperationPtr destinationOperationPtr(unsigned int index=0) const
void addDestinationOperationPtr(ProgramOperationPtr po)
ProgramOperation & destinationOperation(unsigned int index=0) const
virtual bool readsMemory() const
virtual TCEString name() const
virtual bool hasSideEffects() const
virtual int affectsCount() const
virtual bool writesMemory() const
int outputMoveCount() const
const Operation & operation() const
int inputMoveCount() const
MoveNode * triggeringMove() const
MoveNode & inputMove(int index) const
MoveNode & outputMove(int index) const
virtual TTAProgram::Instruction * instruction(int cycle) const =0
virtual bool canAssign(int cycle, MoveNode &node, const TTAMachine::Bus *bus=nullptr, const TTAMachine::FunctionUnit *srcFU=nullptr, const TTAMachine::FunctionUnit *dstFU=nullptr, int immWriteCycle=-1, const TTAMachine::ImmediateUnit *immu=nullptr, int immRegIndex=-1) const =0
virtual void unassign(MoveNode &node)=0
virtual void assign(int cycle, MoveNode &node, const TTAMachine::Bus *bus=nullptr, const TTAMachine::FunctionUnit *srcFU=nullptr, const TTAMachine::FunctionUnit *dstFU=nullptr, int immWriteCycle=-1, const TTAMachine::ImmediateUnit *immu=nullptr, int immRegIndex=-1)=0
virtual int smallestCycle() const override
void setMaxCycle(unsigned int maxCycle)
static void disposeRM(SimpleResourceManager *rm, bool allowReuse=true)
virtual void unassign(MoveNode &node) override
virtual TCEString name() const
SpecialRegisterPort * returnAddressPort() const
virtual ControlUnit * controlUnit() const
int registerIndex() const
const RegisterFile * registerFile() const
void setAnnotation(const ProgramAnnotation &annotation)
int skippedFirstInstructions() const
void skipFirstInstructions(int count)
static TTAProgram::MoveGuard * createInverseGuard(const TTAProgram::MoveGuard &mg, const TTAMachine::Bus *bus=NULL)
virtual int instructionCount() const
virtual Instruction & instructionAtIndex(int index) const
bool hasReference(Instruction &ins) const
InstructionReference createReference(Instruction &ins)
void removeImmediate(Immediate &imm)
std::shared_ptr< Immediate > immediatePtr(int i) const
int immediateCount() const
Immediate & immediate(int i) const
void removeMove(Move &move)
CodeSnippet & parent() const
const TTAMachine::Guard & guard() const
void setSource(Terminal *src)
MoveGuard & guard() const
bool isControlFlowMove() const
bool isUnconditional() const
Instruction & parent() const
Terminal & source() const
std::shared_ptr< Move > copy() const
void setGuard(MoveGuard *guard)
bool isTriggering() const
Terminal & destination() const
const TTAMachine::Bus & bus() const
@ ANN_CONN_CANDIDATE_UNIT_DST
Dst. unit candidate.
@ ANN_CONN_CANDIDATE_UNIT_SRC
Src. unit candidate.
InstructionReferenceManager & instructionReferenceManager() const
virtual void setInstructionReference(InstructionReference ref)
virtual int index() const
virtual const TTAMachine::RegisterFile & registerFile() const
virtual bool isRA() const
virtual const TTAMachine::FunctionUnit & functionUnit() const
virtual int index() const
virtual Operation & operation() const
virtual bool equals(const Terminal &other) const =0
virtual Terminal * copy() const =0
virtual const InstructionReference & instructionReference() const
virtual bool isGPR() const
virtual int operationIndex() const
virtual bool isInstructionAddress() const
virtual bool isImmediateRegister() const
virtual const TTAMachine::Port & port() const
virtual bool isImmediate() const
virtual const TTAMachine::ImmediateUnit & immediateUnit() const
virtual const TTAMachine::RegisterFile & registerFile() const
virtual bool isFUPort() const
virtual TTAMachine::HWOperation * operation(const std::string &name) const
static UniversalMachine & instance()
UniversalFunctionUnit & universalFunctionUnit() const
TTAMachine::Bus & universalBus() const