Skip to content

Commit

Permalink
AArch64: Implement FP type conversion evaluators
Browse files Browse the repository at this point in the history
This commit implements type conversion evaluators of floating-point
types, such as i2f, d2l, and f2d.

Signed-off-by: knn-k <konno@jp.ibm.com>
  • Loading branch information
knn-k committed Dec 21, 2018
1 parent dd0d82d commit 2891d9a
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 50 deletions.
94 changes: 54 additions & 40 deletions compiler/aarch64/codegen/FPTreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,54 +257,71 @@ OMR::ARM64::TreeEvaluator::dnegEvaluator(TR::Node *node, TR::CodeGenerator *cg)
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}

static TR::Register *
intFpTypeCoversionHelper(TR::Node *node, TR::InstOpCode::Mnemonic op, TR::CodeGenerator *cg)
{
TR::Node *child = node->getFirstChild();
TR::Register *srcReg = cg->evaluate(child);
TR::Register *trgReg;

TR::DataType dt = node->getDataType();
if (dt.isFloatingPoint())
{
trgReg = dt.isDouble() ? cg->allocateRegister(TR_FPR) : cg->allocateSinglePrecisionRegister();
}
else
{
trgReg = cg->allocateRegister();
}

generateTrg1Src1Instruction(cg, op, node, trgReg, srcReg);

child->decReferenceCount();
node->setRegister(trgReg);
return trgReg;
}

TR::Register *
OMR::ARM64::TreeEvaluator::i2fEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::i2fEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::scvtf_wtos, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::i2dEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::i2dEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::scvtf_wtod, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::l2fEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::l2fEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::scvtf_xtos, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::l2dEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::l2dEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::scvtf_xtod, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::f2dEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::f2dEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::fcvt_stod, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::f2iEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::f2iEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::fcvtzs_stow, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::d2iEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::d2iEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::fcvtzs_dtow, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::d2cEvaluator(TR::Node *node, TR::CodeGenerator *cg)
Expand All @@ -329,24 +346,21 @@ OMR::ARM64::TreeEvaluator::d2bEvaluator(TR::Node *node, TR::CodeGenerator *cg)

TR::Register *
OMR::ARM64::TreeEvaluator::f2lEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::f2lEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::fcvtzs_stox, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::d2lEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::d2lEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::fcvtzs_dtox, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::d2fEvaluator(TR::Node *node, TR::CodeGenerator *cg)
{
// TODO:ARM64: Enable TR::TreeEvaluator::d2fEvaluator in compiler/aarch64/codegen/TreeEvaluatorTable.hpp when Implemented.
return OMR::ARM64::TreeEvaluator::unImpOpEvaluator(node, cg);
}
{
return intFpTypeCoversionHelper(node, TR::InstOpCode::fcvt_dtos, cg);
}

TR::Register *
OMR::ARM64::TreeEvaluator::ifdcmpeqEvaluator(TR::Node *node, TR::CodeGenerator *cg)
Expand Down
20 changes: 10 additions & 10 deletions compiler/aarch64/codegen/TreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::bxorEvaluator , // TR::bxor // boolean xor of 2 bytes
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::sxorEvaluator , // TR::sxor // boolean xor of 2 short integers
TR::TreeEvaluator::i2lEvaluator, // TR::i2l // convert integer to long integer with sign extension
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::i2fEvaluator , // TR::i2f // convert integer to float
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::i2dEvaluator , // TR::i2d // convert integer to double
TR::TreeEvaluator::i2fEvaluator, // TR::i2f // convert integer to float
TR::TreeEvaluator::i2dEvaluator, // TR::i2d // convert integer to double
TR::TreeEvaluator::l2iEvaluator, // TR::i2b // convert integer to byte
TR::TreeEvaluator::l2iEvaluator, // TR::i2s // convert integer to short integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::i2aEvaluator , // TR::i2a // convert integer to address
Expand All @@ -185,22 +185,22 @@
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::iu2dEvaluator , // TR::iu2d // convert unsigned integer to double
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::iu2aEvaluator , // TR::iu2a // convert unsigned integer to address
TR::TreeEvaluator::l2iEvaluator, // TR::l2i // convert long integer to integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::l2fEvaluator , // TR::l2f // convert long integer to float
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::l2dEvaluator , // TR::l2d // convert long integer to double
TR::TreeEvaluator::l2fEvaluator, // TR::l2f // convert long integer to float
TR::TreeEvaluator::l2dEvaluator, // TR::l2d // convert long integer to double
TR::TreeEvaluator::l2iEvaluator, // TR::l2b // convert long integer to byte
TR::TreeEvaluator::l2iEvaluator, // TR::l2s // convert long integer to short integer
TR::TreeEvaluator::passThroughEvaluator, // TR::l2a // convert long integer to address
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lu2fEvaluator , // TR::lu2f // convert unsigned long integer to float
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lu2dEvaluator , // TR::lu2d // convert unsigned long integer to double
TR::TreeEvaluator::passThroughEvaluator, // TR::lu2a // convert unsigned long integer to address
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::f2iEvaluator , // TR::f2i // convert float to integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::f2lEvaluator , // TR::f2l // convert float to long integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::f2dEvaluator , // TR::f2d // convert float to double
TR::TreeEvaluator::f2iEvaluator, // TR::f2i // convert float to integer
TR::TreeEvaluator::f2lEvaluator, // TR::f2l // convert float to long integer
TR::TreeEvaluator::f2dEvaluator, // TR::f2d // convert float to double
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::f2bEvaluator , // TR::f2b // convert float to byte
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::f2sEvaluator , // TR::f2s // convert float to short integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::d2iEvaluator , // TR::d2i // convert double to integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::d2lEvaluator , // TR::d2l // convert double to long integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::d2fEvaluator , // TR::d2f // convert double to float
TR::TreeEvaluator::d2iEvaluator, // TR::d2i // convert double to integer
TR::TreeEvaluator::d2lEvaluator, // TR::d2l // convert double to long integer
TR::TreeEvaluator::d2fEvaluator, // TR::d2f // convert double to float
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::d2bEvaluator , // TR::d2b // convert double to byte
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::d2sEvaluator , // TR::d2s // convert double to short integer
TR::TreeEvaluator::b2iEvaluator, // TR::b2i // convert byte to integer with sign extension
Expand Down

0 comments on commit 2891d9a

Please sign in to comment.