Skip to content

Commit 62abd73

Browse files
authored
Merge pull request eclipse-omr#8046 from midronij/mStoreLoad
mloadiFromArray and mstoreiToArray
2 parents d1f7504 + 3e17b0c commit 62abd73

16 files changed

+127
-3
lines changed

compiler/aarch64/codegen/OMRTreeEvaluator.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,6 +1564,16 @@ TR::Register *OMR::ARM64::TreeEvaluator::mxorEvaluator(TR::Node *node, TR::CodeG
15641564
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
15651565
}
15661566

1567+
TR::Register *OMR::ARM64::TreeEvaluator::mloadiFromArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg)
1568+
{
1569+
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
1570+
}
1571+
1572+
TR::Register *OMR::ARM64::TreeEvaluator::mstoreiToArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg)
1573+
{
1574+
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
1575+
}
1576+
15671577
/* This template function should be declared as constexpr if the compiler supports it. */
15681578
template<TR::VectorOperation op> TR::ILOpCodes getLoadOpCodeForMaskConversion()
15691579
{

compiler/aarch64/codegen/OMRTreeEvaluator.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ class OMR_EXTENSIBLE TreeEvaluator : public OMR::TreeEvaluator {
242242
static TR::Register *morEvaluator(TR::Node *node, TR::CodeGenerator *cg);
243243
static TR::Register *mxorEvaluator(TR::Node *node, TR::CodeGenerator *cg);
244244

245+
static TR::Register *mloadiFromArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
246+
static TR::Register *mstoreiToArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
247+
245248
static TR::Register *b2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);
246249
static TR::Register *s2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);
247250
static TR::Register *i2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);

compiler/arm/codegen/OMRTreeEvaluator.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,16 @@ TR::Register *OMR::ARM::TreeEvaluator::mxorEvaluator(TR::Node *node, TR::CodeGen
12611261
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
12621262
}
12631263

1264+
TR::Register *OMR::ARM::TreeEvaluator::mloadiFromArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg)
1265+
{
1266+
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
1267+
}
1268+
1269+
TR::Register *OMR::ARM::TreeEvaluator::mstoreiToArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg)
1270+
{
1271+
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
1272+
}
1273+
12641274
TR::Register *OMR::ARM::TreeEvaluator::b2mEvaluator(TR::Node *node, TR::CodeGenerator *cg)
12651275
{
12661276
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);

compiler/arm/codegen/OMRTreeEvaluator.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,9 @@ class OMR_EXTENSIBLE TreeEvaluator : public OMR::TreeEvaluator {
310310
static TR::Register *morEvaluator(TR::Node *node, TR::CodeGenerator *cg);
311311
static TR::Register *mxorEvaluator(TR::Node *node, TR::CodeGenerator *cg);
312312

313+
static TR::Register *mloadiFromArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
314+
static TR::Register *mstoreiToArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
315+
313316
static TR::Register *b2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);
314317
static TR::Register *s2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);
315318
static TR::Register *i2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);

compiler/il/OMRIL.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,10 @@ TR::ILOpCodes OMR::IL::opCodeForCorrespondingIndirectLoad(TR::ILOpCodes loadOpCo
344344

345345
if (TR::ILOpCode::getVectorOperation(loadOpCode) == TR::mloadi)
346346
return TR::ILOpCode::createVectorOpCode(TR::mstorei, TR::ILOpCode::getVectorResultDataType(loadOpCode));
347+
348+
if (TR::ILOpCode::getVectorOperation(loadOpCode) == TR::mloadiFromArray)
349+
return TR::ILOpCode::createVectorOpCode(TR::mstoreiToArray,
350+
TR::ILOpCode::getVectorResultDataType(loadOpCode));
347351
}
348352

349353
switch (loadOpCode) {
@@ -388,6 +392,10 @@ TR::ILOpCodes OMR::IL::opCodeForCorrespondingIndirectStore(TR::ILOpCodes storeOp
388392

389393
if (TR::ILOpCode::getVectorOperation(storeOpCode) == TR::mstorei)
390394
return TR::ILOpCode::createVectorOpCode(TR::mloadi, TR::ILOpCode::getVectorResultDataType(storeOpCode));
395+
396+
if (TR::ILOpCode::getVectorOperation(storeOpCode) == TR::mstoreiToArray)
397+
return TR::ILOpCode::createVectorOpCode(TR::mloadiFromArray,
398+
TR::ILOpCode::getVectorResultDataType(storeOpCode));
391399
}
392400

393401
switch (storeOpCode) {
@@ -688,7 +696,7 @@ TR::ILOpCodes OMR::IL::opCodeForIndirectArrayLoad(TR::DataType dt)
688696
if (dt.isVector())
689697
return TR::ILOpCode::createVectorOpCode(TR::vloadi, dt);
690698
if (dt.isMask())
691-
return TR::ILOpCode::createVectorOpCode(TR::mloadi, dt);
699+
return TR::ILOpCode::createVectorOpCode(TR::mloadiFromArray, dt);
692700

693701
TR_ASSERT(dt < TR::NumOMRTypes, "unexpected opcode");
694702

@@ -704,7 +712,7 @@ TR::ILOpCodes OMR::IL::opCodeForIndirectArrayStore(TR::DataType dt)
704712
if (dt.isVector())
705713
return TR::ILOpCode::createVectorOpCode(TR::vstorei, dt);
706714
if (dt.isMask())
707-
return TR::ILOpCode::createVectorOpCode(TR::mstorei, dt);
715+
return TR::ILOpCode::createVectorOpCode(TR::mstoreiToArray, dt);
708716

709717
TR_ASSERT(dt < TR::NumOMRTypes, "unexpected opcode");
710718

compiler/il/VectorOperations.enum

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,41 @@ VECTOR_OPERATION_MACRO(\
325325
/* .ifCompareOpCode = */ TR::BadILOp, \
326326
/* .description = mask exclusive OR*/ \
327327
)
328-
// vector mask conversion opcodes
328+
// vector mask to/from array opcodes
329+
VECTOR_OPERATION_MACRO(\
330+
/* .operation = */ mloadiFromArray, \
331+
/* .name = */ "mloadiFromArray", \
332+
/* .properties1 = */ ILProp1::LoadVar | ILProp1::Indirect | ILProp1::HasSymbolRef, \
333+
/* .properties2 = */ ILProp2::ValueNumberShare | ILProp2::MayUseSystemStack, \
334+
/* .properties3 = */ ILProp3::LikeUse, \
335+
/* .properties4 = */ 0, \
336+
/* .dataType = */ TR::NoType, \
337+
/* .typeProperties = */ ILTypeProp::MaskResult, \
338+
/* .childProperties = */ ONE_CHILD(TR::Address), \
339+
/* .swapChildrenOperation = */ TR::vBadOperation, \
340+
/* .reverseBranchOperation = */ TR::vBadOperation, \
341+
/* .booleanCompareOpCode = */ TR::BadILOp, \
342+
/* .ifCompareOpCode = */ TR::BadILOp, \
343+
/* .description = load from array and convert to vector mask. assumes that a value of 1 is true and 0 is false*/ \
344+
)
345+
VECTOR_OPERATION_MACRO(\
346+
/* .operation = */ mstoreiToArray, \
347+
/* .name = */ "mstoreiToArray", \
348+
/* .properties1 = */ ILProp1::Store | ILProp1::Indirect | ILProp1::TreeTop | ILProp1::HasSymbolRef, \
349+
/* .properties2 = */ ILProp2::ValueNumberShare | ILProp2::MayUseSystemStack, \
350+
/* .properties3 = */ ILProp3::LikeDef, \
351+
/* .properties4 = */ 0, \
352+
/* .dataType = */ TR::NoType, \
353+
/* .typeProperties = */ ILTypeProp::MaskResult, \
354+
/* .childProperties = */ TWO_CHILD(TR::Address, ILChildProp::UnspecifiedChildType), \
355+
/* .swapChildrenOperation = */ TR::vBadOperation, \
356+
/* .reverseBranchOperation = */ TR::vBadOperation, \
357+
/* .booleanCompareOpCode = */ TR::BadILOp, \
358+
/* .ifCompareOpCode = */ TR::BadILOp, \
359+
/* .description = convert from vector mask and store to array. assumes that a value of 1 is true and 0 is false*/ \
360+
)
361+
362+
// vector mask conversion opcodes (TO BE REMOVED)
329363
VECTOR_OPERATION_MACRO(\
330364
/* .operation = */ b2m, \
331365
/* .name = */ "b2m", \

compiler/optimizer/OMRSimplifierTable.enum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,8 @@
422422
#define mandSimplifierHandler dftSimplifier
423423
#define morSimplifierHandler dftSimplifier
424424
#define mxorSimplifierHandler dftSimplifier
425+
#define mloadiFromArraySimplifierHandler indirectLoadSimplifier
426+
#define mstoreiToArraySimplifierHandler indirectStoreSimplifier
425427
#define b2mSimplifierHandler dftSimplifier
426428
#define s2mSimplifierHandler dftSimplifier
427429
#define i2mSimplifierHandler dftSimplifier

compiler/optimizer/ValuePropagationTable.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,8 @@ TR::Node *constrainLongBitCount(OMR::ValuePropagation *vp, TR::Node *node);
563563
#define mandVPHandler constrainChildren
564564
#define morVPHandler constrainChildren
565565
#define mxorVPHandler constrainChildren
566+
#define mloadiFromArrayVPHandler constrainChildren
567+
#define mstoreiToArrayVPHandler constrainChildren
566568
#define b2mVPHandler constrainChildren
567569
#define s2mVPHandler constrainChildren
568570
#define i2mVPHandler constrainChildren

compiler/p/codegen/OMRTreeEvaluator.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,16 @@ TR::Register *OMR::Power::TreeEvaluator::mxorEvaluator(TR::Node *node, TR::CodeG
10211021
return TR::TreeEvaluator::vxorEvaluator(node, cg);
10221022
}
10231023

1024+
TR::Register *OMR::Power::TreeEvaluator::mloadiFromArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg)
1025+
{
1026+
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
1027+
}
1028+
1029+
TR::Register *OMR::Power::TreeEvaluator::mstoreiToArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg)
1030+
{
1031+
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);
1032+
}
1033+
10241034
TR::Register *OMR::Power::TreeEvaluator::b2mEvaluator(TR::Node *node, TR::CodeGenerator *cg)
10251035
{
10261036
return TR::TreeEvaluator::unImpOpEvaluator(node, cg);

compiler/p/codegen/OMRTreeEvaluator.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ class OMR_EXTENSIBLE TreeEvaluator : public OMR::TreeEvaluator {
210210
static TR::Register *morEvaluator(TR::Node *node, TR::CodeGenerator *cg);
211211
static TR::Register *mxorEvaluator(TR::Node *node, TR::CodeGenerator *cg);
212212

213+
static TR::Register *mloadiFromArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
214+
static TR::Register *mstoreiToArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
215+
213216
static TR::Register *b2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);
214217
static TR::Register *s2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);
215218
static TR::Register *i2mEvaluator(TR::Node *node, TR::CodeGenerator *cg);

0 commit comments

Comments
 (0)