Skip to content

Commit 173972e

Browse files
committed
Implement byte mask load
- when a byte mask is loaded from a byte array the true value is represented as 1. - expand the least significant bit so that instructions like xxsel work correctly.
1 parent 20d94ab commit 173972e

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

compiler/p/codegen/OMRTreeEvaluator.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3064,6 +3064,9 @@ TR::Register *OMR::Power::TreeEvaluator::vloadEvaluator(TR::Node *node, TR::Code
30643064
TR_ASSERT_FATAL_WITH_NODE(node, node->getDataType().getVectorLength() == TR::VectorLength128,
30653065
"Only 128-bit vectors are supported %s", node->getDataType().toString());
30663066

3067+
TR_ASSERT_FATAL(!node->getDataType().isMask() || node->getDataType().getVectorElementType() == TR::Int8,
3068+
"Only load of Byte masks is currently supported"); // TODO: support other mask types
3069+
30673070
TR::InstOpCode::Mnemonic opcode;
30683071
TR_RegisterKinds kind;
30693072

@@ -3098,6 +3101,19 @@ TR::Register *OMR::Power::TreeEvaluator::vloadEvaluator(TR::Node *node, TR::Code
30983101

30993102
TR::LoadStoreHandler::generateLoadNodeSequence(cg, dstReg, node, opcode, 16, true);
31003103

3104+
if (node->getDataType().isMask() &&
3105+
node->getDataType().getVectorElementType() == TR::Int8)
3106+
{
3107+
// Lowest mask bit needs to be expanded to the whole mask element
3108+
TR::Register *tmpReg = cg->allocateRegister(TR_VRF);
3109+
generateTrg1ImmInstruction(cg, TR::InstOpCode::vspltisb, node, tmpReg, 15);
3110+
// move lowest bit to the sign position
3111+
generateTrg1Src2Instruction(cg, TR::InstOpCode::vslb, node, dstReg, dstReg, tmpReg);
3112+
// extend sign bit to the right
3113+
generateTrg1Src2Instruction(cg, TR::InstOpCode::vsrab, node, dstReg, dstReg, tmpReg);
3114+
cg->stopUsingRegister(tmpReg);
3115+
}
3116+
31013117
node->setRegister(dstReg);
31023118
return dstReg;
31033119
}

0 commit comments

Comments
 (0)