Skip to content

Commit 371c4f0

Browse files
authored
Merge pull request #21853 from VermaSh/enableHashCode
Update hashCodeHelper for off-heap
2 parents 5714fe6 + 8aa01fd commit 371c4f0

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

runtime/compiler/z/codegen/J9CodeGenerator.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ J9::Z::CodeGenerator::initialize()
9494
cg->setSupportsInlineStringIndexOf();
9595
}
9696

97-
if (cg->getSupportsVectorRegisters() && !comp->getOption(TR_DisableSIMDStringHashCode) &&
98-
!TR::Compiler->om.canGenerateArraylets() && !TR::Compiler->om.isOffHeapAllocationEnabled())
97+
if (cg->getSupportsVectorRegisters() && !comp->getOption(TR_DisableSIMDStringHashCode) && !TR::Compiler->om.canGenerateArraylets())
9998
{
10099
cg->setSupportsInlineStringHashCode();
101100
cg->setSupportsInlineVectorizedHashCode();

runtime/compiler/z/codegen/J9TreeEvaluator.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2908,10 +2908,34 @@ hashCodeHelper(TR::Node* node, TR::CodeGenerator* cg, TR::DataType elementType,
29082908
TR::LabelSymbol * cFlowRegionEnd = generateLabelSymbol(cg);
29092909

29102910
// Create the necessary registers
2911-
TR::Register* registerValue = cg->evaluate(nodeValue);
2911+
TR::Register* registerValue = NULL;
29122912
TR::Register* registerIndex = cg->gprClobberEvaluate(nodeIndex);
29132913
TR::Register* registerCount = cg->gprClobberEvaluate(nodeCount);
29142914

2915+
// Offset to be added to array object pointer to get to the data elements
2916+
int32_t offsetToDataElements = static_cast<int32_t>(TR::Compiler->om.contiguousArrayHeaderSizeInBytes());
2917+
#ifdef J9VM_GC_SPARSE_HEAP_ALLOCATION
2918+
if (TR::Compiler->om.isOffHeapAllocationEnabled())
2919+
{
2920+
// Clobber evaluate value node as we'll overwrite it with first data element address
2921+
registerValue = cg->gprClobberEvaluate(nodeValue);
2922+
2923+
// Load first data element address
2924+
generateRXInstruction(cg,
2925+
TR::InstOpCode::getLoadOpCode(),
2926+
nodeValue,
2927+
registerValue,
2928+
generateS390MemoryReference(registerValue, cg->comp()->fej9()->getOffsetOfContiguousDataAddrField(), cg));
2929+
2930+
// Since the first data element address is retrieved from the array header, the offset is set to 0
2931+
offsetToDataElements = 0;
2932+
}
2933+
else
2934+
#endif /* J9VM_GC_SPARSE_HEAP_ALLOCATION */
2935+
{
2936+
registerValue = cg->evaluate(nodeValue);
2937+
}
2938+
29152939
if (cg->comp()->target().is64Bit())
29162940
{
29172941
generateRRInstruction(cg, TR::InstOpCode::getLoadRegWidenOpCode(), node, registerIndex, registerIndex);
@@ -2994,20 +3018,20 @@ hashCodeHelper(TR::Node* node, TR::CodeGenerator* cg, TR::DataType elementType,
29943018
{
29953019
case TR::Int8:
29963020
// registerVC = 4 consecutive (8 bit) bytes at the current index
2997-
generateVRXInstruction(cg, TR::InstOpCode::VLLEZ, node, registerVC, generateS390MemoryReference(registerValue, registerIndex, TR::Compiler->om.contiguousArrayHeaderSizeInBytes(), cg), 2);
3021+
generateVRXInstruction(cg, TR::InstOpCode::VLLEZ, node, registerVC, generateS390MemoryReference(registerValue, registerIndex, offsetToDataElements, cg), 2);
29983022
// registerVC = unpack 4 (8 bit) byte elements into 4 (32 bit) int elements
29993023
generateVRRaInstruction(cg, isSigned ? TR::InstOpCode::VUPH : TR::InstOpCode::VUPLH, node, registerVC, registerVC, 0, 0, 0);
30003024
generateVRRaInstruction(cg, isSigned ? TR::InstOpCode::VUPL : TR::InstOpCode::VUPLL, node, registerVC, registerVC, 0, 0, 1);
30013025
break;
30023026
case TR::Int16:
30033027
// registerVC = 4 consecutive (16 bit) shorts at the current index
3004-
generateVRXInstruction(cg, TR::InstOpCode::VLLEZ, node, registerVC, generateS390MemoryReference(registerValue, registerIndex, TR::Compiler->om.contiguousArrayHeaderSizeInBytes(), cg), 3);
3028+
generateVRXInstruction(cg, TR::InstOpCode::VLLEZ, node, registerVC, generateS390MemoryReference(registerValue, registerIndex, offsetToDataElements, cg), 3);
30053029
// registerVC = unpack 4 (16 bit) short elements into 4 (32 bit) int elements
30063030
generateVRRaInstruction(cg, isSigned ? TR::InstOpCode::VUPH : TR::InstOpCode::VUPLH, node, registerVC, registerVC, 0, 0, 1);
30073031
break;
30083032
case TR::Int32:
30093033
// registerVC = 4 consecutive (32 bit) ints at the current index
3010-
generateVRXInstruction(cg, TR::InstOpCode::VL, node, registerVC, generateS390MemoryReference(registerValue, registerIndex, TR::Compiler->om.contiguousArrayHeaderSizeInBytes(), cg));
3034+
generateVRXInstruction(cg, TR::InstOpCode::VL, node, registerVC, generateS390MemoryReference(registerValue, registerIndex, offsetToDataElements, cg));
30113035
break;
30123036
default:
30133037
TR_ASSERT_FATAL(false, "Unsupported vectorizedHashCode element type");
@@ -3073,15 +3097,15 @@ hashCodeHelper(TR::Node* node, TR::CodeGenerator* cg, TR::DataType elementType,
30733097
{
30743098
case TR::Int8:
30753099
// registerHash = byte at registerIndex
3076-
generateRXInstruction(cg, isSigned ? TR::InstOpCode::LB : TR::InstOpCode::LLC, node, registerHash, generateS390MemoryReference(registerValue, registerIndex, TR::Compiler->om.contiguousArrayHeaderSizeInBytes(), cg));
3100+
generateRXInstruction(cg, isSigned ? TR::InstOpCode::LB : TR::InstOpCode::LLC, node, registerHash, generateS390MemoryReference(registerValue, registerIndex, offsetToDataElements, cg));
30773101
break;
30783102
case TR::Int16:
30793103
// registerHash = short at registerIndex
3080-
generateRXInstruction(cg, isSigned ? TR::InstOpCode::LH : TR::InstOpCode::LLH, node, registerHash, generateS390MemoryReference(registerValue, registerIndex, TR::Compiler->om.contiguousArrayHeaderSizeInBytes(), cg));
3104+
generateRXInstruction(cg, isSigned ? TR::InstOpCode::LH : TR::InstOpCode::LLH, node, registerHash, generateS390MemoryReference(registerValue, registerIndex, offsetToDataElements, cg));
30813105
break;
30823106
case TR::Int32:
30833107
// registerHash = int at registerIndex
3084-
generateRXInstruction(cg, TR::InstOpCode::L, node, registerHash, generateS390MemoryReference(registerValue, registerIndex, TR::Compiler->om.contiguousArrayHeaderSizeInBytes(), cg));
3108+
generateRXInstruction(cg, TR::InstOpCode::L, node, registerHash, generateS390MemoryReference(registerValue, registerIndex, offsetToDataElements, cg));
30853109
break;
30863110
default:
30873111
TR_ASSERT_FATAL(false, "Unsupported vectorizedHashCode element type");

0 commit comments

Comments
 (0)