OpenASIP  2.0
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.

43  :
44  ProcedurePass(ipd), ProgramPass(ipd) {}

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 }

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:
ProgramPass::ProgramPass
ProgramPass(InterPassData &data)
Definition: ProgramPass.cc:48
TTAProgram::Procedure::address
Address address(const Instruction &ins) const
Definition: Procedure.cc:101
SimValue
Definition: SimValue.hh:96
TTAMachine::Machine::controlUnit
virtual ControlUnit * controlUnit() const
Definition: Machine.cc:345
TTAProgram::CodeSnippet::instructionCount
virtual int instructionCount() const
Definition: CodeSnippet.cc:205
TTAProgram::Address::location
InstructionAddress location() const
TTAProgram::Instruction::immediatePtr
std::shared_ptr< Immediate > immediatePtr(int i) const
Definition: Instruction.cc:309
TTAProgram::TerminalFUPort
Definition: TerminalFUPort.hh:56
TTAProgram::TerminalImmediate
Definition: TerminalImmediate.hh:44
TTAProgram::Program::instructionReferenceManager
InstructionReferenceManager & instructionReferenceManager() const
Definition: Program.cc:688
TTAProgram::CodeSnippet::parent
virtual Program & parent() const
Definition: CodeSnippet.cc:118
TTAProgram::CodeSnippet::instructionAtIndex
virtual Instruction & instructionAtIndex(int index) const
Definition: CodeSnippet.cc:285
ProcedurePass::ProcedurePass
ProcedurePass(InterPassData &data)
Definition: ProcedurePass.cc:53