Skip to content

Commit

Permalink
AArch64: Implement integer max/min evaluators
Browse files Browse the repository at this point in the history
This commit implements imax/lmax/imin/lmin evaluators for AArch64.

Signed-off-by: KONNO Kazuhiro <konno@jp.ibm.com>
  • Loading branch information
knn-k committed Jul 30, 2019
1 parent 8acafad commit 70bc05c
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 4 deletions.
59 changes: 59 additions & 0 deletions compiler/aarch64/codegen/ControlFlowEvaluator.cpp
Expand Up @@ -534,3 +534,62 @@ OMR::ARM64::TreeEvaluator::ArrayCHKEvaluator(TR::Node *node, TR::CodeGenerator *
// TODO:ARM64: Enable TR::TreeEvaluator::ArrayCHKEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}

static TR::Register *
commonMinMaxEvaluator(TR::Node *node, bool is64bit, TR::ARM64ConditionCode cc, TR::CodeGenerator *cg)
{
TR::Node *firstChild = node->getFirstChild();
TR::Register *src1Reg = cg->evaluate(firstChild);
TR::Register *trgReg;

if (cg->canClobberNodesRegister(firstChild))
{
trgReg = src1Reg; // use the first child as the target
}
else
{
trgReg = cg->allocateRegister();
}

TR_ASSERT(node->getNumChildren() == 2, "The number of children for imax/imin/lmax/lmin must be 2.");

TR::Node *secondChild = node->getSecondChild();
TR::Register *src2Reg = cg->evaluate(secondChild);

// ToDo:
// Optimize the code by using generateCompareImmInstruction() when possible
generateCompareInstruction(cg, node, src1Reg, src2Reg, is64bit);

TR::InstOpCode::Mnemonic op = is64bit ? TR::InstOpCode::cselx : TR::InstOpCode::cselw;
generateCondTrg1Src2Instruction(cg, op, node, trgReg, src1Reg, src2Reg, cc);

node->setRegister(trgReg);
cg->decReferenceCount(firstChild);
cg->decReferenceCount(secondChild);

return trgReg;
}

TR::Register *
OMR::ARM64::TreeEvaluator::imaxEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
return commonMinMaxEvaluator(node, false, TR::CC_GT, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::lmaxEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
return commonMinMaxEvaluator(node, true, TR::CC_GT, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::iminEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
return commonMinMaxEvaluator(node, false, TR::CC_LT, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::lminEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
return commonMinMaxEvaluator(node, true, TR::CC_LT, cg);
}
8 changes: 4 additions & 4 deletions compiler/aarch64/codegen/OMRTreeEvaluatorTable.hpp
Expand Up @@ -744,15 +744,15 @@
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::getpmEvaluator , // TR::getpm // get program mask
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::setpmEvaluator , // TR::setpm // set program mask
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::loadAutoOffsetEvaluator , // TR::loadAutoOffset // loads the offset (from the SP) of an auto
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::imaxEvaluator , // TR::imax // max of 2 or more integers
TR::TreeEvaluator::imaxEvaluator, // TR::imax // max of 2 or more integers
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::iumaxEvaluator , // TR::iumax // max of 2 or more unsigned integers
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lmaxEvaluator , // TR::lmax // max of 2 or more longs
TR::TreeEvaluator::lmaxEvaluator, // TR::lmax // max of 2 or more longs
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lumaxEvaluator , // TR::lumax // max of 2 or more unsigned longs
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::fmaxEvaluator , // TR::fmax // max of 2 or more floats
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::dmaxEvaluator , // TR::dmax // max of 2 or more doubles
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::iminEvaluator , // TR::imin // min of 2 or more integers
TR::TreeEvaluator::iminEvaluator, // TR::imin // min of 2 or more integers
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::iuminEvaluator , // TR::iumin // min of 2 or more unsigned integers
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lminEvaluator , // TR::lmin // min of 2 or more longs
TR::TreeEvaluator::lminEvaluator, // TR::lmin // min of 2 or more longs
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::luminEvaluator , // TR::lumin // min of 2 or more unsigned longs
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::fminEvaluator , // TR::fmin // min of 2 or more floats
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::dminEvaluator , // TR::dmin // min of 2 or more doubles
Expand Down

0 comments on commit 70bc05c

Please sign in to comment.