Skip to content

Commit

Permalink
RISC-V: introduce RVLinkageProperties::initialize() to initialize der…
Browse files Browse the repository at this point in the history
…ived members

Linkage properties have a number of members whose values can be derived from register flags.
This commit introduces a new method initialize() that computes these values based on
_registerFlags.

Linkages are expected to fill in register flags and then call initialize() to finish properties
initialization.

Signed-off-by: Jan Vrany <jan.vrany@fit.cvut.cz>
  • Loading branch information
janvrany committed Apr 7, 2021
1 parent dd45ea2 commit b194b27
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 38 deletions.
52 changes: 52 additions & 0 deletions compiler/riscv/codegen/OMRLinkage.cpp
Expand Up @@ -31,6 +31,58 @@
#include "il/Node_inlines.hpp"
#include "il/ParameterSymbol.hpp"

void TR::RVLinkageProperties::initialize()
{
/*
* Note: following code depends on zero initialization of all members!
*/

_numAllocatableIntegerRegisters = TR::RealRegister::LastGPR - TR::RealRegister::FirstGPR + 1;
_numAllocatableFloatRegisters = TR::RealRegister::LastFPR - TR::RealRegister::FirstFPR + 1;

_firstIntegerArgumentRegister = 0;
_numIntegerArgumentRegisters = 0;
_firstIntegerReturnRegister = 0;
int numIntegerReturnRegisters = 0;

for (auto regNum = TR::RealRegister::FirstGPR; regNum <= TR::RealRegister::LastGPR; regNum++)
{
if (_registerFlags[regNum] & RV_Reserved)
{
_numAllocatableIntegerRegisters--;
}
if (_registerFlags[regNum] & IntegerArgument)
{
_argumentRegisters[_firstIntegerArgumentRegister + _numIntegerArgumentRegisters++] = regNum;
}
if (_registerFlags[regNum] & IntegerReturn)
{
_returnRegisters[_firstIntegerReturnRegister + numIntegerReturnRegisters++] = regNum;
}
}

_firstFloatArgumentRegister = _firstIntegerArgumentRegister + _numIntegerArgumentRegisters;
_numFloatArgumentRegisters = 0;
_firstFloatReturnRegister = _firstIntegerArgumentRegister + numIntegerReturnRegisters;
int numFloatReturnRegisters = 0;

for (auto regNum = TR::RealRegister::FirstFPR; regNum <= TR::RealRegister::LastFPR; regNum++)
{
if (_registerFlags[regNum] & RV_Reserved)
{
_numAllocatableFloatRegisters--;
}
if (_registerFlags[regNum] & FloatArgument)
{
_argumentRegisters[_firstFloatArgumentRegister + _numFloatArgumentRegisters++] = regNum;
}
if (_registerFlags[regNum] & FloatReturn)
{
_returnRegisters[_firstFloatReturnRegister + numFloatReturnRegisters++] = regNum;
}
}
}

void OMR::RV::Linkage::mapStack(TR::ResolvedMethodSymbol *method)
{
/* do nothing */
Expand Down
11 changes: 9 additions & 2 deletions compiler/riscv/codegen/OMRLinkage.hpp
Expand Up @@ -292,9 +292,16 @@ struct RVLinkageProperties
int32_t getOffsetToFirstLocal() const {return _offsetToFirstLocal;}

uint32_t getNumberOfDependencyGPRegisters() const {return _numberOfDependencyGPRegisters;}
};

}
/**
* @brief Initialize derived properties from register flags. This *must* be called
* after _registerFlags are populated.
*/
void initialize();

}; // struct RVLinkageProperties

}; // namespace TR

namespace OMR
{
Expand Down
38 changes: 2 additions & 36 deletions compiler/riscv/codegen/RVSystemLinkage.cpp
Expand Up @@ -134,42 +134,6 @@ TR::RVSystemLinkage::RVSystemLinkage(TR::CodeGenerator *cg)
_properties._registerFlags[TR::RealRegister::ft10] = 0;
_properties._registerFlags[TR::RealRegister::ft11] = 0;


_properties._numIntegerArgumentRegisters = 8;
_properties._firstIntegerArgumentRegister = 0;

_properties._argumentRegisters[0] = TR::RealRegister::a0;
_properties._argumentRegisters[1] = TR::RealRegister::a1;
_properties._argumentRegisters[2] = TR::RealRegister::a2;
_properties._argumentRegisters[3] = TR::RealRegister::a3;
_properties._argumentRegisters[4] = TR::RealRegister::a4;
_properties._argumentRegisters[5] = TR::RealRegister::a5;
_properties._argumentRegisters[6] = TR::RealRegister::a6;
_properties._argumentRegisters[7] = TR::RealRegister::a7;

_properties._firstIntegerReturnRegister = 0;
_properties._returnRegisters[0] = TR::RealRegister::a0;
_properties._returnRegisters[1] = TR::RealRegister::a1;

_properties._numFloatArgumentRegisters = 8;
_properties._firstFloatArgumentRegister = 8;

_properties._argumentRegisters[8+0] = TR::RealRegister::fa0;
_properties._argumentRegisters[8+1] = TR::RealRegister::fa1;
_properties._argumentRegisters[8+2] = TR::RealRegister::fa2;
_properties._argumentRegisters[8+3] = TR::RealRegister::fa3;
_properties._argumentRegisters[8+4] = TR::RealRegister::fa4;
_properties._argumentRegisters[8+5] = TR::RealRegister::fa5;
_properties._argumentRegisters[8+6] = TR::RealRegister::fa6;
_properties._argumentRegisters[8+7] = TR::RealRegister::fa7;

_properties._firstFloatReturnRegister = 2;
_properties._returnRegisters[2+0] = TR::RealRegister::fa0;
_properties._returnRegisters[2+1] = TR::RealRegister::fa1;

_properties._numAllocatableIntegerRegisters = 7 + 11 + 6; // t0-t6 + s1-s11 + a2-a7
_properties._numAllocatableFloatRegisters = 32;

_properties._methodMetaDataRegister = TR::RealRegister::NoReg;
_properties._stackPointerRegister = TR::RealRegister::sp;
_properties._framePointerRegister = TR::RealRegister::s0;
Expand All @@ -178,6 +142,8 @@ TR::RVSystemLinkage::RVSystemLinkage(TR::CodeGenerator *cg)
_properties._vtableIndexArgumentRegister = TR::RealRegister::NoReg;
_properties._j9methodArgumentRegister = TR::RealRegister::NoReg;

_properties.initialize();

_properties._numberOfDependencyGPRegisters = 32; // To be determined
setOffsetToFirstParm(0); // To be determined
_properties._offsetToFirstLocal = 0; // To be determined
Expand Down

0 comments on commit b194b27

Please sign in to comment.