Skip to content

Commit

Permalink
AArch64: Implement BBStart/BBEnd evaluators
Browse files Browse the repository at this point in the history
This commit implements BBStart/BBEnd evaluators for aarch64.

Signed-off-by: knn-k <konno@jp.ibm.com>
  • Loading branch information
knn-k committed Oct 16, 2018
1 parent 201747e commit 1ebf7cc
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 11 deletions.
3 changes: 3 additions & 0 deletions compiler/aarch64/codegen/ARM64Debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,9 @@ static const char *opCodeToNameMap[] =
"rev16w",
"rev16x",
"rev32",
"proc",
"fence",
"dd",
"label"
};

Expand Down
1 change: 1 addition & 0 deletions compiler/aarch64/codegen/OMRInstOpCodeEnum.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,7 @@

/* Last VFP instructions */
proc, // Entry to the method
fence, // Fence
dd, // Define word
label, // Destination of a jump
ARM64LastOp = label,
Expand Down
94 changes: 85 additions & 9 deletions compiler/aarch64/codegen/OMRTreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@
#include "codegen/ARM64ShiftCode.hpp"
#include "codegen/CodeGenerator.hpp"
#include "codegen/GenerateInstructions.hpp"
#include "codegen/OMRTreeEvaluator.hpp"
#include "codegen/RegisterDependency.hpp"
#include "codegen/TreeEvaluator.hpp"
#include "il/Node.hpp"
#include "il/Node_inlines.hpp"
#include "il/symbol/LabelSymbol.hpp"
#include "il/symbol/ParameterSymbol.hpp"

TR::Instruction *loadConstant32(TR::CodeGenerator *cg, TR::Node *node, int32_t value, TR::Register *trgReg, TR::Instruction *cursor)
{
Expand Down Expand Up @@ -401,14 +406,85 @@ OMR::ARM64::TreeEvaluator::GlRegDepsEvaluator(TR::Node *node, TR::CodeGenerator

TR::Register *
OMR::ARM64::TreeEvaluator::BBStartEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::BBStartEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
TR::Compilation *comp = cg->comp();
TR::Block *block = node->getBlock();
cg->setCurrentBlock(block);

TR::RegisterDependencyConditions *deps = NULL;

if (!block->isExtensionOfPreviousBlock() && node->getNumChildren()>0)
{
int32_t i;
TR::Node *child = node->getFirstChild();
cg->evaluate(child);
deps = generateRegisterDependencyConditions(cg, child, 0);
if (cg->getCurrentEvaluationTreeTop() == comp->getStartTree())
{
for (i=0; i<child->getNumChildren(); i++)
{
TR::ParameterSymbol *sym = child->getChild(i)->getSymbol()->getParmSymbol();
if (sym != NULL)
{
sym->setAllocatedIndex(cg->getGlobalRegister(child->getChild(i)->getGlobalRegisterNumber()));
}
}
}
child->decReferenceCount();
}

if (node->getLabel() != NULL)
{
if (deps == NULL)
{
node->getLabel()->setInstruction(generateLabelInstruction(cg, TR::InstOpCode::label, node, node->getLabel()));
}
else
{
node->getLabel()->setInstruction(generateDepLabelInstruction(cg, TR::InstOpCode::label, node, node->getLabel(), deps));
}
}

TR::Node *fenceNode = TR::Node::createRelative32BitFenceNode(node, &block->getInstructionBoundaries()._startPC);
TR::Instruction *fence = generateAdminInstruction(cg, TR::InstOpCode::fence, node, fenceNode);

return NULL;
}

TR::Register *
OMR::ARM64::TreeEvaluator::BBEndEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::BBEndEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
TR::Block *block = node->getBlock();
TR::Compilation *comp = cg->comp();
TR::Node *fenceNode = TR::Node::createRelative32BitFenceNode(node, &node->getBlock()->getInstructionBoundaries()._endPC);

if (NULL == block->getNextBlock())
{
TR::Instruction *lastInstruction = cg->getAppendInstruction();
#if 0
// TODO: Enable this part when TR::InstOpCode::bl becomes available
if (lastInstruction->getOpCodeValue() == TR::InstOpCode::bl
&& lastInstruction->getNode()->getSymbolReference()->getReferenceNumber() == TR_aThrow)
{
lastInstruction = generateInstruction(cg, TR::InstOpCode::bad, node, lastInstruction);
}
#endif
}

TR::TreeTop *nextTT = cg->getCurrentEvaluationTreeTop()->getNextTreeTop();

TR::RegisterDependencyConditions *deps = NULL;
if (node->getNumChildren() > 0 &&
(!nextTT || !nextTT->getNode()->getBlock()->isExtensionOfPreviousBlock()))
{
TR::Node *child = node->getFirstChild();
cg->evaluate(child);
deps = generateRegisterDependencyConditions(cg, child, 0);
child->decReferenceCount();
}

// put the dependencies (if any) on the fence
generateAdminInstruction(cg, TR::InstOpCode::fence, node, deps, fenceNode);

return NULL;
}
4 changes: 2 additions & 2 deletions compiler/aarch64/codegen/TreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -408,8 +408,8 @@
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::MethodExitHookEvaluator , // TR::MethodExitHook // called immediately before returning; frame not yet collapsed; monitor released (if necessary)
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::PassThroughEvaluator , // TR::PassThrough // Dummy node that represents its single child.
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::compressedRefsEvaluator , // TR::compressedRefs // no-op anchor providing optimizable subexpressions used for compression/decompression. First child is address load/store; second child is heap base displacement
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::BBStartEvaluator , // TR::BBStart // Start of Basic Block
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::BBEndEvaluator , // TR::BBEnd // End of Basic Block
TR::TreeEvaluator::BBStartEvaluator, // TR::BBStart // Start of Basic Block
TR::TreeEvaluator::BBEndEvaluator, // TR::BBEnd // End of Basic Block
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::viremEvaluator , // TR::virem // vector integer remainder
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::viminEvaluator , // TR::vimin // vector integer minimum
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::vimaxEvaluator , // TR::vimax // vector integer maximum
Expand Down

0 comments on commit 1ebf7cc

Please sign in to comment.