Skip to content

Commit

Permalink
RISC-V: refactor initRVRealRegisterLinkage() to use (new) FOR_EACH_…
Browse files Browse the repository at this point in the history
…RESERVED_REGISTER()` macro

Signed-off-by: Jan Vrany <jan.vrany@fit.cvut.cz>
  • Loading branch information
janvrany committed Apr 1, 2021
1 parent 58489f4 commit 5a080e6
Showing 1 changed file with 17 additions and 34 deletions.
51 changes: 17 additions & 34 deletions compiler/riscv/codegen/RVSystemLinkage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,20 @@
{ block; } \
}

#define FOR_EACH_RESERVED_REGISTER(machine, props, block) \
FOR_EACH_REGISTER(machine, \
if (props._registerFlags[(TR::RealRegister::RegNum)regNum] & RV_Reserved) \
{ block; } \
)

#define FOR_EACH_CALLEE_SAVED_REGISTER(machine, block) \
#define FOR_EACH_CALLEE_SAVED_REGISTER(machine, props, block) \
FOR_EACH_REGISTER(machine, \
if (_properties._registerFlags[(TR::RealRegister::RegNum)regNum] == Preserved)\
if (props._registerFlags[(TR::RealRegister::RegNum)regNum] == Preserved) \
{ block; } \
)

#define FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine, block) \
FOR_EACH_CALLEE_SAVED_REGISTER(machine, \
#define FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine, props, block) \
FOR_EACH_CALLEE_SAVED_REGISTER(machine, props, \
if (reg->getHasBeenAssignedInMethod()) \
{ block; } \
)
Expand Down Expand Up @@ -224,39 +229,17 @@ void
TR::RVSystemLinkage::initRVRealRegisterLinkage()
{
TR::Machine *machine = cg()->machine();
TR::RealRegister *reg;
int icount;

reg = machine->getRealRegister(TR::RealRegister::RegNum::zero);
reg->setState(TR::RealRegister::Locked);
reg->setAssignedRegister(reg);

reg = machine->getRealRegister(TR::RealRegister::RegNum::ra);
reg->setState(TR::RealRegister::Locked);
reg->setAssignedRegister(reg);

reg = machine->getRealRegister(TR::RealRegister::RegNum::sp);
reg->setState(TR::RealRegister::Locked);
reg->setAssignedRegister(reg);

reg = machine->getRealRegister(TR::RealRegister::RegNum::gp);
reg->setState(TR::RealRegister::Locked);
reg->setAssignedRegister(reg);

reg = machine->getRealRegister(TR::RealRegister::RegNum::tp);
reg->setState(TR::RealRegister::Locked);
reg->setAssignedRegister(reg);

reg = machine->getRealRegister(TR::RealRegister::RegNum::s0); // FP
reg->setState(TR::RealRegister::Locked);
reg->setAssignedRegister(reg);

FOR_EACH_RESERVED_REGISTER(machine, _properties,
reg->setState(TR::RealRegister::Locked);
reg->setAssignedRegister(reg);
);

FOR_EACH_REGISTER(machine, reg->setWeight(0xf000));

// prefer preserved registers over the rest since they're saved / restored
// in prologue/epilogue.
FOR_EACH_CALLEE_SAVED_REGISTER(machine, reg->setWeight(0x0001));
FOR_EACH_CALLEE_SAVED_REGISTER(machine, _properties, reg->setWeight(0x0001));
}

uint32_t
Expand Down Expand Up @@ -325,7 +308,7 @@ TR::RVSystemLinkage::mapStack(TR::ResolvedMethodSymbol *method)
}
method->setLocalMappingCursor(stackIndex);

FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine, stackIndex += 8);
FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine, _properties, stackIndex += 8);

/*
* Because the rest of the code generator currently expects **all** arguments
Expand Down Expand Up @@ -527,7 +510,7 @@ TR::RVSystemLinkage::createPrologue(TR::Instruction *cursor, List<TR::ParameterS

// save callee-saved registers
uint32_t offset = bodySymbol->getLocalMappingCursor();
FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine,
FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine, _properties,
TR::MemoryReference *stackSlot = new (trHeapMemory()) TR::MemoryReference(sp, offset, codeGen);
cursor = generateSTORE(TR::InstOpCode::_sd, firstNode, stackSlot, reg, cg(), cursor);
offset += 8;)
Expand All @@ -547,7 +530,7 @@ TR::RVSystemLinkage::createEpilogue(TR::Instruction *cursor)

// restore callee-saved registers
uint32_t offset = bodySymbol->getLocalMappingCursor();
FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine,
FOR_EACH_ASSIGNED_CALLEE_SAVED_REGISTER(machine, _properties,
TR::MemoryReference *stackSlot = new (trHeapMemory()) TR::MemoryReference(sp, offset, codeGen);
cursor = generateLOAD(TR::InstOpCode::_ld, lastNode, reg, stackSlot, cg(), cursor);
offset += 8;)
Expand Down

0 comments on commit 5a080e6

Please sign in to comment.