OpenASIP 2.2
Loading...
Searching...
No Matches
Public Member Functions | List of all members
AbsoluteToRelativeJumps Class Reference

#include <AbsoluteToRelativeJumps.hh>

Inheritance diagram for AbsoluteToRelativeJumps:
Inheritance graph
Collaboration diagram for AbsoluteToRelativeJumps:
Collaboration graph

Public Member Functions

 AbsoluteToRelativeJumps (InterPassData &ipd)
 
virtual void handleProcedure (TTAProgram::Procedure &procedure, const TTAMachine::Machine &targetMachine) override
 
virtual std::string shortDescription () const override
 
- Public Member Functions inherited from ProcedurePass
 ProcedurePass (InterPassData &data)
 
virtual ~ProcedurePass ()
 
- Public Member Functions inherited from SchedulerPass
 SchedulerPass (InterPassData &data)
 
virtual ~SchedulerPass ()
 
InterPassDatainterPassData ()
 
virtual std::string longDescription () const
 
- Public Member Functions inherited from ProgramPass
 ProgramPass (InterPassData &data)
 
virtual ~ProgramPass ()
 
virtual void handleProgram (TTAProgram::Program &program, const TTAMachine::Machine &targetMachine)
 

Additional Inherited Members

- Static Public Member Functions inherited from ProcedurePass
static void copyCfgToProcedure (TTAProgram::Procedure &procedure, ControlFlowGraph &cfg)
 
static void executeControlFlowGraphPass (TTAProgram::Procedure &procedure, const TTAMachine::Machine &targetmachine, ControlFlowGraphPass &cfgp)
 
- Static Public Member Functions inherited from ProgramPass
static void executeProcedurePass (TTAProgram::Program &program, const TTAMachine::Machine &targetMachine, ProcedurePass &procedurePass)
 

Detailed Description

Definition at line 39 of file AbsoluteToRelativeJumps.hh.

Constructor & Destructor Documentation

◆ AbsoluteToRelativeJumps()

AbsoluteToRelativeJumps::AbsoluteToRelativeJumps ( InterPassData ipd)
inline

Definition at line 43 of file AbsoluteToRelativeJumps.hh.

Member Function Documentation

◆ handleProcedure()

void AbsoluteToRelativeJumps::handleProcedure ( TTAProgram::Procedure procedure,
const TTAMachine::Machine targetMachine 
)
overridevirtual

Handles a single procedure.

Parameters
proecudeThe procedure to handle.
machineThe target machine if any. (NullMachine::instance() if target machine is irrelevant).
Exceptions
Incase handling is unsuccesful for any reason (procedure might still get modified).

Reimplemented from ProcedurePass.

Definition at line 52 of file AbsoluteToRelativeJumps.cc.

54 {
55
56 std::map<TTAProgram::Move*, int> jumpOffsetMoves;
57 std::map<std::shared_ptr<TTAProgram::Immediate>, int> jumpOffsetLimms;
58
59 auto cu = targetMachine.controlUnit();
60 if (!cu->hasOperation("reljump")) {
61 return;
62 }
63
64 auto& irm = procedure.parent().instructionReferenceManager();
65 auto hwop = cu->operation("reljump");
66
67 for (int i = 0; i < procedure.instructionCount(); i++) {
68 auto& ins = procedure[i];
69 for (int j = 0; j < ins.moveCount(); j++) {
70 auto& m = ins.move(j);
71 auto& src = m.source();
72 auto& dst = m.destination();
73 if (!dst.isFUPort()) {
74 continue;
75 }
76 auto& dfu = dst.functionUnit();
77 if (&dfu != targetMachine.controlUnit()) {
78 continue;
79 }
80 if (!dst.isOpcodeSetting()) {
81 continue;
82 }
83 if (dst.operation().name() != "JUMP") {
84 continue;
85 }
86
87 int jumpAddr = ins.address().location();
88
89 if (src.isInstructionAddress()) {
90 int dstAddr = src.value().intValue();
91 int diff = dstAddr - jumpAddr;
92
93 auto& bus = m.bus();
94 if (!bus.signExtends() && diff < 0 && bus.immediateWidth() < 32) {
95 continue;
96 }
97
98 jumpOffsetMoves[&m] = diff;
99 m.setDestination(new TTAProgram::TerminalFUPort(*hwop, 1));
100 continue;
101 }
102
103 if (src.isImmediateRegister()) {
104 auto& immu = src.immediateUnit();
105 int index = static_cast<int>(src.index());
106 bool found = false;
107 for (int k = i - immu.latency(); k >= 0 && !found; k--) {
108 auto &immIns = procedure.instructionAtIndex(k);
109
110 for (int l = 0; l < immIns.immediateCount(); l++) {
111 auto imm = immIns.immediatePtr(l);
112 if (imm->destination().index() == index &&
113 &imm->destination().immediateUnit() == &immu) {
114 int dstAddr = imm->value().value().intValue();
115 int diff = dstAddr - jumpAddr;
116
117 if (!immu.signExtends() && diff < 0 && immu.width() < 32) {
118 found = true;
119 break;
120 }
121
122 jumpOffsetLimms[imm] = diff;
123 m.setDestination(new TTAProgram::TerminalFUPort(*hwop, 1));
124 found = true;
125 break;
126 }
127 }
128 if (irm.hasReference(immIns)) {
129 break;
130 }
131 }
132 }
133 }
134 }
135
136 // Only update the indeces at the end to keep instr references valid.
137 for (auto i : jumpOffsetMoves) {
138 i.first->setSource(new TTAProgram::TerminalImmediate(SimValue(i.second, 32)));
139 }
140
141 for (auto i : jumpOffsetLimms) {
142 i.first->setValue(new TTAProgram::TerminalImmediate(SimValue(i.second, 32)));
143 }
144}
virtual ControlUnit * controlUnit() const
Definition Machine.cc:345
InstructionAddress location() const
virtual int instructionCount() const
virtual Program & parent() const
virtual Instruction & instructionAtIndex(int index) const
std::shared_ptr< Immediate > immediatePtr(int i) const
Address address(const Instruction &ins) const
Definition Procedure.cc:101
InstructionReferenceManager & instructionReferenceManager() const
Definition Program.cc:688

References TTAProgram::Procedure::address(), TTAMachine::Machine::controlUnit(), TTAProgram::Instruction::immediatePtr(), TTAProgram::CodeSnippet::instructionAtIndex(), TTAProgram::CodeSnippet::instructionCount(), TTAProgram::Program::instructionReferenceManager(), TTAProgram::Address::location(), and TTAProgram::CodeSnippet::parent().

Referenced by llvm::LLVMTCEIRBuilder::writeMachineFunction().

Here is the call graph for this function:

◆ shortDescription()

virtual std::string AbsoluteToRelativeJumps::shortDescription ( ) const
inlineoverridevirtual

A short description of the pass, usually the optimization name, such as "basic block scheduler".

Returns
The description as a string.

Implements SchedulerPass.

Definition at line 50 of file AbsoluteToRelativeJumps.hh.

50 {
51 return "Compiler pass to convert absolute jumps to relative jumps.";
52 }

The documentation for this class was generated from the following files: