Skip to content

Commit

Permalink
Add sbyteswap and lbyteswap to opcode tables
Browse files Browse the repository at this point in the history
The new sbyteswap and lbyteswap opcodes for performing byte-reversals of
16- and 64-bit integers have now been added to the necessary opcode
tables.

Closes: #5517
Signed-off-by: Ben Thomas <ben@benthomas.ca>
  • Loading branch information
aviansie-ben committed Sep 14, 2020
1 parent 2ffef1f commit cbacb9a
Show file tree
Hide file tree
Showing 11 changed files with 59 additions and 4 deletions.
4 changes: 3 additions & 1 deletion compiler/aarch64/codegen/OMRTreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,9 @@
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lnolzEvaluator , // TR::lnolz
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lnotzEvaluator , // TR::lnotz
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lpopcntEvaluator , // TR::lpopcnt
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::ibyteswapEvaluator , // TR::ibyteswap // swap bytes in an integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::sbyteswapEvaluator , // TR::sbyteswap // swap bytes in a short
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::ibyteswapEvaluator , // TR::ibyteswap // swap bytes in an integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::lbyteswapEvaluator , // TR::lbyteswap // swap bytes in a long
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::bbitpermuteEvaluator , // TR::bbitpermute
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::sbitpermuteEvaluator , // TR::sbitpermute
TR::TreeEvaluator::unImpOpEvaluator , // TODO:ARM64: Enable when Implemented: TR::TreeEvaluator::ibitpermuteEvaluator , // TR::ibitpermute
Expand Down
2 changes: 2 additions & 0 deletions compiler/arm/codegen/OMRTreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -904,7 +904,9 @@
TR::TreeEvaluator::longNumberOfTrailingZeros,
TR::TreeEvaluator::longBitCount,

TR::TreeEvaluator::unImpOpEvaluator, // TR::sbyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::ibyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::lbyteswap

TR::TreeEvaluator::unImpOpEvaluator, // TR::bbitpermute
TR::TreeEvaluator::unImpOpEvaluator, // TR::sbitpermute
Expand Down
32 changes: 32 additions & 0 deletions compiler/il/OMRILOpCodeProperties.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11437,6 +11437,22 @@
/* .ifCompareOpCode = */ TR::BadILOp,
},

{
/* .opcode = */ TR::sbyteswap,
/* .name = */ "sbyteswap",
/* .properties1 = */ 0,
/* .properties2 = */ ILProp2::ValueNumberShare | ILProp2::SupportedForPRE | ILProp2::ByteSwap,
/* .properties3 = */ 0,
/* .properties4 = */ 0,
/* .dataType = */ TR::Int16,
/* .typeProperties = */ ILTypeProp::Size_2 | ILTypeProp::Integer,
/* .childProperties = */ ONE_CHILD(TR::Int16),
/* .swapChildrenOpCode = */ TR::BadILOp,
/* .reverseBranchOpCode = */ TR::BadILOp,
/* .booleanCompareOpCode = */ TR::BadILOp,
/* .ifCompareOpCode = */ TR::BadILOp,
},

{
/* .opcode = */ TR::ibyteswap,
/* .name = */ "ibyteswap",
Expand All @@ -11451,6 +11467,22 @@
/* .reverseBranchOpCode = */ TR::BadILOp,
/* .booleanCompareOpCode = */ TR::BadILOp,
/* .ifCompareOpCode = */ TR::BadILOp,
},

{
/* .opcode = */ TR::lbyteswap,
/* .name = */ "lbyteswap",
/* .properties1 = */ 0,
/* .properties2 = */ ILProp2::ValueNumberShare | ILProp2::SupportedForPRE | ILProp2::ByteSwap,
/* .properties3 = */ 0,
/* .properties4 = */ 0,
/* .dataType = */ TR::Int64,
/* .typeProperties = */ ILTypeProp::Size_8 | ILTypeProp::Integer,
/* .childProperties = */ ONE_CHILD(TR::Int64),
/* .swapChildrenOpCode = */ TR::BadILOp,
/* .reverseBranchOpCode = */ TR::BadILOp,
/* .booleanCompareOpCode = */ TR::BadILOp,
/* .ifCompareOpCode = */ TR::BadILOp,
},

/*!
Expand Down
7 changes: 6 additions & 1 deletion compiler/il/OMRILOpCodesEnum.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,12 @@
lnotz,
lpopcnt,

ibyteswap,// swap bytes in an integer
// Note that only integral types have byteswap opcodes since architectures generally only
// support swapping bytes in GPRs. To byteswap floats, use fbits2i/dbits2l, perform an integer
// byteswap, then use ibits2f/lbits2d.
sbyteswap, // swap bytes in a short
ibyteswap, // swap bytes in an integer
lbyteswap, // swap bytes in a long

bbitpermute,
sbitpermute,
Expand Down
4 changes: 3 additions & 1 deletion compiler/optimizer/OMRSimplifierTableEnum.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -783,7 +783,9 @@
dftSimplifier, //TR::lnotz
dftSimplifier, //TR::lpopcnt

dftSimplifier, // TR::ibyteswap
dftSimplifier, // TR::sbyteswap
dftSimplifier, // TR::ibyteswap
dftSimplifier, // TR::lbyteswap

dftSimplifier, // TR::bbitpermute
dftSimplifier, // TR::sbitpermute
Expand Down
2 changes: 2 additions & 0 deletions compiler/optimizer/ValuePropagationTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -922,7 +922,9 @@ const ValuePropagationPtr constraintHandlers[] =
constrainLongNumberOfTrailingZeros,
constrainLongBitCount,

constrainChildren, // TR::sbyteswap
constrainChildren, // TR::ibyteswap
constrainChildren, // TR::lbyteswap

constrainChildren, // TR::bbitpermute
constrainChildren, // TR::sbitpermute
Expand Down
2 changes: 2 additions & 0 deletions compiler/p/codegen/OMRTreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,9 @@
TR::TreeEvaluator::longNumberOfLeadingZeros, // TR::lnolz (J9)
TR::TreeEvaluator::longNumberOfTrailingZeros, // TR::lnotz (J9)
TR::TreeEvaluator::longBitCount, // TR::lpopcnt (J9)
TR::TreeEvaluator::unImpOpEvaluator, // TR::sbyteswap
TR::TreeEvaluator::ibyteswapEvaluator, // TR::ibyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::lbyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::bbitpermute
TR::TreeEvaluator::unImpOpEvaluator, // TR::sbitpermute
TR::TreeEvaluator::unImpOpEvaluator, // TR::ibitpermute
Expand Down
4 changes: 3 additions & 1 deletion compiler/riscv/codegen/TreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,9 @@
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::lnolzEvaluator , // TR::lnolz
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::lnotzEvaluator , // TR::lnotz
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::lpopcntEvaluator , // TR::lpopcnt
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::ibyteswapEvaluator , // TR::ibyteswap // swap bytes in an integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::sbyteswapEvaluator , // TR::sbyteswap // swap bytes in a short
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::ibyteswapEvaluator , // TR::ibyteswap // swap bytes in an integer
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::lbyteswapEvaluator , // TR::lbyteswap // swap bytes in a long
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::bbitpermuteEvaluator , // TR::bbitpermute
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::sbitpermuteEvaluator , // TR::sbitpermute
TR::TreeEvaluator::unImpOpEvaluator , // TODO:RV: Enable when Implemented: TR::TreeEvaluator::ibitpermuteEvaluator , // TR::ibitpermute
Expand Down
2 changes: 2 additions & 0 deletions compiler/x/amd64/codegen/OMRTreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,9 @@
TR::TreeEvaluator::badILOpEvaluator, // TR::lnolz (J9)
TR::TreeEvaluator::badILOpEvaluator, // TR::lnotz (J9)
TR::TreeEvaluator::badILOpEvaluator, // TR::lpopcnt (J9)
TR::TreeEvaluator::unImpOpEvaluator, // TR::sbyteswap
TR::TreeEvaluator::ibyteswapEvaluator, // TR::ibyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::lbyteswap
TR::TreeEvaluator::bitpermuteEvaluator, // TR::bbitpermute
TR::TreeEvaluator::bitpermuteEvaluator, // TR::sbitpermute
TR::TreeEvaluator::bitpermuteEvaluator, // TR::ibitpermute
Expand Down
2 changes: 2 additions & 0 deletions compiler/x/i386/codegen/OMRTreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,9 @@
TR::TreeEvaluator::badILOpEvaluator, // TR::lnolz (J9)
TR::TreeEvaluator::badILOpEvaluator, // TR::lnotz (J9)
TR::TreeEvaluator::badILOpEvaluator, // TR::lpopcnt (J9)
TR::TreeEvaluator::unImpOpEvaluator, // TR::sbyteswap
TR::TreeEvaluator::ibyteswapEvaluator, // TR::ibyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::lbyteswap
TR::TreeEvaluator::bitpermuteEvaluator, // TR::bbitpermute
TR::TreeEvaluator::bitpermuteEvaluator, // TR::sbitpermute
TR::TreeEvaluator::bitpermuteEvaluator, // TR::ibitpermute
Expand Down
2 changes: 2 additions & 0 deletions compiler/z/codegen/OMRTreeEvaluatorTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,9 @@
TR::TreeEvaluator::longNumberOfTrailingZeros, // TR::lnotz (J9)
TR::TreeEvaluator::longBitCount, // TR::lpopcnt

TR::TreeEvaluator::unImpOpEvaluator, // TR::sbyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::ibyteswap
TR::TreeEvaluator::unImpOpEvaluator, // TR::lbyteswap

TR::TreeEvaluator::bitpermuteEvaluator, // TR::bbitpermute
TR::TreeEvaluator::bitpermuteEvaluator, // TR::sbitpermute
Expand Down

0 comments on commit cbacb9a

Please sign in to comment.