OpenASIP 2.2
Loading...
Searching...
No Matches
BFCopyRegWithOp.cc
Go to the documentation of this file.
1#include "BFCopyRegWithOp.hh"
2#include "ProgramOperation.hh"
3#include "OperationPool.hh"
4#include "Operation.hh"
5#include "Move.hh"
6#include "CodeGenerator.hh"
7#include "TerminalFUPort.hh"
8#include "FunctionUnit.hh"
10
11#include <iostream>
12
14
17 OperationPool opPool;
18 auto& op = opPool.operation("COPY");
19 pop_ = std::make_shared<ProgramOperation>(op);
20
21 mn_.move().setSource(cGen.createTerminalFUPort("COPY",2));
23 pop_->addInputNode(*regCopy_);
24 pop_->addOutputNode(mn_);
27
28 for (auto fu : candidateFUs_) {
31 fu->name());
32 mn_.move().addAnnotation(srcCandidate);
33
36 fu->name());
37 regCopy_->move().addAnnotation(dstCandidate);
38 }
39
40 // move RAW in edges...
41 for (int i = ddg().rootGraph()->inDegree(mn_)-1; i >= 0; i--) {
42 auto& e = ddg().rootGraph()->inEdge(mn_,i);
43 if (e.isRAW() && !e.headPseudo()) {
45 }
46 }
47
48 // move antidep edges.
49 for (int i = ddg().rootGraph()->outDegree(mn_)-1; i >= 0; i--) {
50 auto& e = ddg().rootGraph()->outEdge(mn_,i);
51 if (e.isRegisterOrRA() && !e.isRAW() && !e.tailPseudo()) {
53 }
54 }
55
56
61 TCEString("COPY"))));
62 return true;
63}
64
66
69
70 // restore antidep edges.
71 for (int i = ddg().rootGraph()->outDegree(*regCopy_)-1; i >= 0; i--) {
72 auto& e = ddg().rootGraph()->outEdge(*regCopy_,i);
73 if (e.isRegisterOrRA() && !e.isRAW() && !e.tailPseudo()) {
75 }
76 }
77
78 // restore raw edges
79 for (int i = ddg().rootGraph()->inDegree(*regCopy_)-1; i >= 0; i--) {
80 auto& e = ddg().rootGraph()->inEdge(*regCopy_,i);
81 if (e.isRAW() && !e.headPseudo()) {
83 }
84 }
85
86
87 pop_->removeOutputNode(mn_);
88 pop_->removeInputNode(*regCopy_);
92 pop_ = ProgramOperationPtr(); // this should delete the obj.
93
95}
std::shared_ptr< ProgramOperation > ProgramOperationPtr
Definition MoveNode.hh:53
MachineConnectivityCheck::FUSet candidateFUs_
ProgramOperationPtr pop_
bool splitMove(BasicBlockNode &bbn)
DataDependenceGraph & ddg()
const TTAMachine::Machine & targetMachine() const
MoveNode * regCopy_
Definition BFRegCopy.hh:70
MoveNode & mn_
Definition BFRegCopy.hh:69
BoostGraph * rootGraph()
virtual void disconnectNodes(const Node &nTail, const Node &nHead)
virtual Edge & outEdge(const Node &node, const int index) const
virtual Edge & inEdge(const Node &node, const int index) const
virtual void moveOutEdge(const Node &source, const Node &destination, Edge &edge, const Node *head=NULL, bool childs=false)
virtual void moveInEdge(const Node &source, const Node &destination, Edge &edge, const Node *tail=NULL, bool childs=false)
virtual void connectNodes(const Node &nTail, const Node &nHead, Edge &e)
void setSourceOperationPtr(ProgramOperationPtr po)
Definition MoveNode.cc:541
void unsetSourceOperation()
Definition MoveNode.cc:760
void removeDestinationOperation(const ProgramOperation *po)
Definition MoveNode.cc:741
TTAProgram::Move & move()
void addDestinationOperationPtr(ProgramOperationPtr po)
Definition MoveNode.cc:533
Operation & operation(const char *name)
void removeAnnotations(ProgramAnnotation::Id id=ProgramAnnotation::ANN_UNDEF_ID)
void addAnnotation(const ProgramAnnotation &annotation)
TTAProgram::TerminalFUPort * createTerminalFUPort(const TCEString &opName, int operand)
void setSource(Terminal *src)
Definition Move.cc:312
Terminal & source() const
Definition Move.cc:302
void setDestination(Terminal *dst)
Definition Move.cc:333
@ ANN_CONN_CANDIDATE_UNIT_DST
Dst. unit candidate.
@ ANN_CONN_CANDIDATE_UNIT_SRC
Src. unit candidate.
virtual Terminal * copy() const =0