@@ -3298,6 +3298,23 @@ genInitArrayHeader(TR::Node *node, TR::CodeGenerator *cg, TR_OpaqueClassBlock *c
3298
3298
tempReg1);
3299
3299
}
3300
3300
}
3301
+
3302
+ // Clear padding after the size field
3303
+ if (!isTLHHasNotBeenCleared)
3304
+ {
3305
+ if (TR::Compiler->om .generateCompressedObjectHeaders ())
3306
+ {
3307
+ generateMemSrc1Instruction (cg, TR::InstOpCode::strimmw, node,
3308
+ TR::MemoryReference::createWithDisplacement (cg, objectReg, fej9->getOffsetOfDiscontiguousArraySizeField () + 4 ),
3309
+ zeroReg);
3310
+ }
3311
+ else
3312
+ {
3313
+ generateMemSrc1Instruction (cg, TR::InstOpCode::strimmw, node,
3314
+ TR::MemoryReference::createWithDisplacement (cg, objectReg, fej9->getOffsetOfContiguousArraySizeField () + 4 ),
3315
+ zeroReg);
3316
+ }
3317
+ }
3301
3318
}
3302
3319
3303
3320
/* *
@@ -3462,7 +3479,8 @@ J9::ARM64::TreeEvaluator::VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg)
3462
3479
* runtime size checks are needed to determine whether to use contiguous or discontiguous header layout.
3463
3480
*
3464
3481
* In both scenarios, arrays of non-zero size use contiguous header layout while zero size arrays use
3465
- * discontiguous header layout.
3482
+ * discontiguous header layout. DataAddr field of zero size arrays is intialized to NULL because they
3483
+ * don't have any data elements.
3466
3484
*/
3467
3485
TR::Register *offsetReg = tempReg1;
3468
3486
TR::Register *firstDataElementReg = tempReg2;
@@ -3491,14 +3509,18 @@ J9::ARM64::TreeEvaluator::VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg)
3491
3509
3492
3510
dataAddrSlotMR = TR::MemoryReference::createWithDisplacement (cg, offsetReg, fej9->getOffsetOfContiguousDataAddrField ());
3493
3511
generateTrg1Src1ImmInstruction (cg, TR::InstOpCode::addimmx, node, firstDataElementReg, offsetReg, TR::Compiler->om .contiguousArrayHeaderSizeInBytes ());
3512
+
3513
+ // Clear firstDataElementReg reg if dealing with 0 size arrays
3514
+ generateCompareImmInstruction (cg, node, lengthReg, 0 , false );
3515
+ generateCondTrg1Src2Instruction (cg, TR::InstOpCode::cselx, node, firstDataElementReg, zeroReg, firstDataElementReg, TR::CC_EQ);
3494
3516
}
3495
3517
else if (!isVariableLength && node->getFirstChild ()->getOpCode ().isLoadConst () && node->getFirstChild ()->getInt () == 0 )
3496
3518
{
3497
3519
if (comp->getOption (TR_TraceCG))
3498
3520
traceMsg (comp, " Node (%p): Dealing with full/compressed refs fixed length zero size array.\n " , node);
3499
3521
3500
3522
dataAddrSlotMR = TR::MemoryReference::createWithDisplacement (cg, resultReg, fej9->getOffsetOfDiscontiguousDataAddrField ());
3501
- generateTrg1Src1ImmInstruction (cg, TR::InstOpCode::addimmx, node, firstDataElementReg, resultReg, TR::Compiler-> om . discontiguousArrayHeaderSizeInBytes ()) ;
3523
+ firstDataElementReg = zeroReg ;
3502
3524
}
3503
3525
else
3504
3526
{
@@ -3520,8 +3542,14 @@ J9::ARM64::TreeEvaluator::VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg)
3520
3542
3521
3543
dataAddrSlotMR = TR::MemoryReference::createWithDisplacement (cg, resultReg, fej9->getOffsetOfContiguousDataAddrField ());
3522
3544
generateTrg1Src1ImmInstruction (cg, TR::InstOpCode::addimmx, node, firstDataElementReg, resultReg, TR::Compiler->om .contiguousArrayHeaderSizeInBytes ());
3523
- }
3524
3545
3546
+ if (isVariableLength && !TR::Compiler->om .compressObjectReferences ())
3547
+ {
3548
+ // Clear firstDataElementReg reg if dealing with variable length 0 size arrays
3549
+ generateCompareImmInstruction (cg, node, lengthReg, 0 , false );
3550
+ generateCondTrg1Src2Instruction (cg, TR::InstOpCode::cselx, node, offsetReg, zeroReg, offsetReg, TR::CC_EQ);
3551
+ }
3552
+ }
3525
3553
generateMemSrc1Instruction (cg, TR::InstOpCode::strimmx, node, dataAddrSlotMR, firstDataElementReg);
3526
3554
}
3527
3555
#endif /* J9VM_GC_SPARSE_HEAP_ALLOCATION */
0 commit comments