@@ -10635,14 +10635,14 @@ hashCodeHelper(TR::Node *node, TR::CodeGenerator *cg, TR::DataType elementType,
10635
10635
generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::cmpi4, node, condReg, tempReg, 0x0);
10636
10636
generateConditionalBranchInstruction(cg, TR::InstOpCode::beq, node, VSXLoopPrep, condReg);
10637
10637
10638
- // deal with misaligned data
10638
+ // Deal with misaligned data:
10639
10639
// The reason we don't do VSX loop directly is we want to avoid loading unaligned data
10640
10640
// and deal with it with vperm.
10641
10641
// Instead, we load the first unaligned part, let VSX handle the rest aligned part.
10642
10642
// load unaligned v, mask out unwanted part
10643
10643
// for example, if value = 0x12345, we mask out 0x12340~0x12344, keep 0x12345~0x1234F
10644
10644
10645
- // vtmp1Reg = mem(valueReg & 0xFFFFFFFFFFFFFFF0)
10645
+ // vtmp1Reg = mem(valueReg & 0xFFFFFFFFFFFFFFF0) - due to lvx only loading aligned
10646
10646
generateTrg1MemInstruction(cg, TR::InstOpCode::lvx, node, vtmp1Reg, TR::MemoryReference::createWithIndexReg(cg, valueReg, constant0Reg, 16));
10647
10647
// vtmp2Reg = tempReg = (valueReg & 0xF) << 3 i.e. the number of bits that are mis-aligned
10648
10648
loadConstant(cg, node, 0xF, tempReg);
@@ -10688,7 +10688,7 @@ hashCodeHelper(TR::Node *node, TR::CodeGenerator *cg, TR::DataType elementType,
10688
10688
default:
10689
10689
TR_ASSERT_FATAL(false, "Unsupported hashCodeHelper elementType");
10690
10690
}
10691
- // make it so that tempReg point it to the appropriate byte in the multiplierVectors
10691
+ // make it so that tempReg point it to the appropriate word in the multiplierVectors
10692
10692
if (isLE) {
10693
10693
// for LE, we first index by 4*4=16 bytes for the highest powers, then we index by
10694
10694
// the value of tempReg
@@ -10697,6 +10697,7 @@ hashCodeHelper(TR::Node *node, TR::CodeGenerator *cg, TR::DataType elementType,
10697
10697
// for BE, we will index all the way to the back of the array, subtract by the value
10698
10698
// of tempReg, then subtract by an additional 16 bytes for the 4 padded zeros, and then
10699
10699
// index backward by 16 bytes to make sure the value we want is in word[3]
10700
+
10700
10701
// tempReg = -tempReg - 1, so we should add the one back later
10701
10702
generateTrg1Src2Instruction(cg, TR::InstOpCode::nor, node, tempReg, tempReg, tempReg);
10702
10703
switch (elementType)
@@ -10934,10 +10935,10 @@ hashCodeHelper(TR::Node *node, TR::CodeGenerator *cg, TR::DataType elementType,
10934
10935
// Head of the serialLabel
10935
10936
generateLabelInstruction(cg, TR::InstOpCode::label, node, serialLabel);
10936
10937
10937
- #define UNROLL_FACTOR 4
10938
- // vendReg = endReg - [(unroll_factor - 1) * elementSize]
10938
+ const int unrollFactor = 4;
10939
+ // vendReg = endReg - [(unrollFactor - 1) * elementSize]
10939
10940
generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addi, node,
10940
- vendReg, endReg, (UNROLL_FACTOR -1) * -1 * TR::DataType::getSize(elementType));
10941
+ vendReg, endReg, (unrollFactor -1) * TR::DataType::getSize(elementType) * -1 );
10941
10942
10942
10943
// --- unrolled loop
10943
10944
generateLabelInstruction(cg, TR::InstOpCode::label, node, serialUnrollLabel);
@@ -10947,7 +10948,7 @@ hashCodeHelper(TR::Node *node, TR::CodeGenerator *cg, TR::DataType elementType,
10947
10948
// hash = hash + temp
10948
10949
generateTrg1Src2Instruction(cg, TR::InstOpCode::cmp8, node, condReg, valueReg, vendReg);
10949
10950
generateConditionalBranchInstruction(cg, TR::InstOpCode::bge, node, serialLoopLabel, condReg);
10950
- for (int i = 0; i < UNROLL_FACTOR ; i++)
10951
+ for (int i = 0; i < unrollFactor ; i++)
10951
10952
{
10952
10953
generateTrg1Src1Imm2Instruction(cg, TR::InstOpCode::rlwinm, node, tempReg, hashReg, 5, 0xFFFFFFFFFFFFFFE0);
10953
10954
generateTrg1Src2Instruction(cg, TR::InstOpCode::subf, node, hashReg, hashReg, tempReg);
@@ -10971,7 +10972,7 @@ hashCodeHelper(TR::Node *node, TR::CodeGenerator *cg, TR::DataType elementType,
10971
10972
}
10972
10973
generateTrg1Src2Instruction(cg, TR::InstOpCode::add, node, hashReg, hashReg, tempReg);
10973
10974
}
10974
- generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addi, node, valueReg, valueReg, TR::DataType::getSize(elementType) * UNROLL_FACTOR );
10975
+ generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addi, node, valueReg, valueReg, TR::DataType::getSize(elementType) * unrollFactor );
10975
10976
generateLabelInstruction(cg, TR::InstOpCode::b, node, serialUnrollLabel);
10976
10977
10977
10978
@@ -11089,7 +11090,8 @@ hashCodeHelper(TR::Node *node, TR::CodeGenerator *cg, TR::DataType elementType,
11089
11090
// End of this method
11090
11091
TR::RegisterDependencyConditions *dependencies =
11091
11092
new (cg->trHeapMemory()) TR::RegisterDependencyConditions(0,
11092
- (TR::Int8 == elementType ? 19 : (TR::Int16 == elementType ? 16 : 14)), // extra vector regs
11093
+ (TR::Int8 == elementType ? 18 : (TR::Int16 == elementType ? 15 : 14)) + // accumulators
11094
+ (!isSigned && TR::Int32 != elementType), // vunpackMaskReg
11093
11095
cg->trMemory());
11094
11096
11095
11097
dependencies->addPostCondition(valueReg, TR::RealRegister::NoReg);
0 commit comments