Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8305895: Implementation: JEP 450: Compact Object Headers (Experimental) #13961

Closed
wants to merge 112 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
619e3fa
8305898: Alternative self-forwarding mechanism
rkennke May 3, 2023
7dca17a
Replace uses of decode_pointer() with forwardee()
rkennke May 3, 2023
d6c0bd0
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 3, 2023
0d066ea
Merge branch 'JDK-8305896' into JDK-8305898
May 4, 2023
efb08a6
Use forwardee() in forward_to_atomic() method
May 4, 2023
909a810
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 4, 2023
b9c8ca0
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 4, 2023
ba3e684
8305895: Implementation: JEP: Compact Object Headers (Experimental)
rkennke May 5, 2023
146c815
x86 parts
May 6, 2023
2850ce8
x86_32 build fixes
rkennke May 6, 2023
2bb8782
Zero build fix
rkennke May 6, 2023
d885810
Fix release builds
rkennke May 6, 2023
34d6a5b
Dummy impls for unsupported platforms
rkennke May 6, 2023
8c19ca2
Remove mistake
rkennke May 6, 2023
f1da451
Disable part of oop verification with compact headers
rkennke May 6, 2023
1ace1a2
SA implementation
rkennke May 7, 2023
f0dfd1c
CDS support
rkennke May 7, 2023
2d45015
Various little fixes
rkennke May 7, 2023
65f14d8
Turn off CDS when UseCompactObjectHeaders is not at default setting
rkennke May 7, 2023
e10140e
CDS fix
rkennke May 7, 2023
36453f5
SA fix
rkennke May 7, 2023
2d20bd3
Fix OldLayoutCheck test
rkennke May 7, 2023
23d1b59
Fix typeArrayOop gtest
rkennke May 7, 2023
1245588
Turn off UseCompactObjectHeaders by default
May 7, 2023
e89f70f
Check UseCompactObjectHeaders flag in TestPLABPromotion
rkennke May 8, 2023
d2e70c7
Add BaseOffsets test
rkennke May 8, 2023
85529de
Some GC fixes
rkennke May 8, 2023
7b87ae9
Imporve GetObjectSizeIntrinsicsTest
rkennke May 8, 2023
ab4aea0
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 8, 2023
15a8626
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 8, 2023
05222a8
Merge branch 'JDK-8305898' into JDK-8305895
rkennke May 8, 2023
2d580f8
Use new lightweight locking with compact headers
rkennke May 8, 2023
a258413
Allow to resolve mark with LW locking
rkennke May 8, 2023
1313a45
Update src/hotspot/share/oops/oop.inline.hpp
rkennke May 9, 2023
06e555d
Update src/hotspot/share/oops/oop.inline.hpp
rkennke May 9, 2023
1d3e833
Update src/hotspot/share/oops/oop.inline.hpp
rkennke May 9, 2023
a559e8d
Update src/hotspot/share/oops/oop.inline.hpp
rkennke May 9, 2023
94e3d07
@shipilev suggestions
May 9, 2023
a142343
Merge branch 'JDK-8305896' into JDK-8305898
May 9, 2023
915c20b
Fix assert
May 9, 2023
6d39d57
Fix asserts (again)
May 9, 2023
eb04cd7
Update src/hotspot/share/oops/oop.inline.hpp
rkennke May 10, 2023
40c1b0b
Update src/hotspot/share/oops/oop.inline.hpp
rkennke May 10, 2023
4d9713c
Rename self-forwarded -> forward-failed
rkennke May 10, 2023
39c3372
Merge remote-tracking branch 'origin/JDK-8305898' into JDK-8305898
rkennke May 10, 2023
b39b71b
@shipilev comments, round 1
rkennke May 10, 2023
8761447
Fix build
rkennke May 10, 2023
48e8d10
@shipilev review, round 2
rkennke May 10, 2023
58046e5
Merge branch 'JDK-8305898' into JDK-8305895
rkennke May 10, 2023
0229792
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 10, 2023
0d43ed2
Merge branch 'JDK-8305898' into JDK-8305895
rkennke May 10, 2023
866771c
wqRevert "Rename self-forwarded -> forward-failed"
rkennke May 11, 2023
95341f0
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 11, 2023
7bd036a
Merge branch 'JDK-8305898' into JDK-8305895
rkennke May 11, 2023
698384e
More @shipilev comments
rkennke May 11, 2023
a725dfb
Move compact klass offset into C2
rkennke May 11, 2023
e7a0f67
Merge remote-tracking branch 'origin/JDK-8305895' into JDK-8305895
rkennke May 11, 2023
f281791
Fix args checking
May 11, 2023
d83ff0e
Fix some uses of klass_offset_in_bytes()
May 11, 2023
0334fe7
Re-format some hash-code related code-paths
rkennke May 12, 2023
07e1ede
Use plain mark() instead of mark_acquire()
rkennke May 12, 2023
32e00c2
Merge remote-tracking branch 'origin/JDK-8305895' into JDK-8305895
rkennke May 12, 2023
d44247c
Some hashcode improvements (mostly SA)
rkennke May 12, 2023
00f6d40
Remove obsolete code
rkennke May 12, 2023
5788eea
@colenp review comments
May 12, 2023
880d564
Merge branch 'JDK-8305896' into JDK-8305898
May 12, 2023
28276ed
Merge branch 'JDK-8305898' into JDK-8305895-v2
May 12, 2023
e660731
Disable CDS tests when running with +UseCompactObjectHeaders
May 12, 2023
5b4b07e
Handle klass offset in JVMCI
May 12, 2023
be314ff
Remove obsolete check
May 12, 2023
a6e9f10
Consolidate _LP64 #ifdef
rkennke May 12, 2023
6a9187a
Fix 32bit builds
rkennke May 12, 2023
69d469a
Properly deal with flag mismatch in CDS
rkennke May 12, 2023
4d947d9
Fix ZGC support
rkennke May 12, 2023
e7c2370
Merge remote-tracking branch 'origin/JDK-8305895-v2' into JDK-8305895-v2
rkennke May 12, 2023
d35cfb4
Fix tests on 32bit builds
rkennke May 13, 2023
5a03f81
Merge branch 'JDK-8305898' into JDK-8305895-v2
rkennke May 13, 2023
4c2c30d
Fix and extend BaseOffsets test
rkennke May 15, 2023
3a18945
Optimize allocation path (fewer instructions) by @shipilev
rkennke May 15, 2023
5f60e0c
ZGC fixlets
rkennke May 15, 2023
9e934ba
Merge branch 'JDK-8305896' into JDK-8305898
rkennke May 17, 2023
4895ad8
Update comment about mark-word layout
rkennke May 17, 2023
c313fc8
Merge branch 'JDK-8305898' into JDK-8305895-v2
rkennke May 17, 2023
efeee86
Adjust alt-forwarding tests to deal with product & experimental flag
rkennke May 17, 2023
3519da7
Merge branch 'JDK-8305896' into JDK-8305898
May 18, 2023
58d5a51
Merge branch 'JDK-8305898' into JDK-8305895-v2
May 18, 2023
0edc3eb
ZGC fix
May 18, 2023
3838ac0
Merge branch 'JDK-8305896' into JDK-8305898
Jun 16, 2023
a8c8cbc
Merge remote-tracking branch 'origin/JDK-8305898' into JDK-8305895-v2
rkennke Jun 19, 2023
a9773c1
Ensure safe Klass* access in G1 and ParGC promotion path
rkennke Jun 29, 2023
3d00c2b
Attempt to relax dst reg of loadNKlassCompact
rkennke Aug 10, 2023
cd5f237
Merge branch 'JDK-8305896' into JDK-8305898
rkennke Aug 11, 2023
c846c5a
Merge branch 'JDK-8305898' into JDK-8305895-v2
rkennke Aug 11, 2023
7cc73c9
Fix merge error
rkennke Aug 12, 2023
4e6c15b
ZGC fixes
rkennke Aug 25, 2023
2a00d30
Merge branch 'JDK-8305896' into JDK-8305898
rkennke Aug 25, 2023
b934436
Merge branch 'JDK-8305898' into JDK-8305895-v2
rkennke Aug 25, 2023
a76bc68
Fix CDS
rkennke Sep 19, 2023
f85554a
Missing include
Sep 20, 2023
1c0d91f
Cleanup and add asserts
Sep 21, 2023
dbb74fb
Merge branch 'JDK-8305896' into JDK-8305898
rkennke Sep 29, 2023
4b92a27
Merge branch 'JDK-8305898' into JDK-8305895-v2
rkennke Sep 29, 2023
792d7f4
Revert C2 klass_offset changes
Oct 11, 2023
9202842
Make C2 LoadNKlassCompactHeader more robust
Oct 11, 2023
f08f147
Fix scale decoding
rkennke Oct 12, 2023
467ccb8
Adjust itable stub size estimate on aarch64
rkennke Oct 16, 2023
66051fd
Fix CDS tests with ZGC
rkennke Oct 16, 2023
365b4f8
8319724: [Lilliput] ParallelGC: Forwarded objects found during heap i…
rkennke Nov 9, 2023
eee8ab5
Merge branch 'JDK-8305896' into JDK-8305898
rkennke Nov 9, 2023
e1f118f
Merge branch 'JDK-8305898' into JDK-8305895-v2
rkennke Nov 9, 2023
1a4dda1
Merge branch 'JDK-8305896' into JDK-8305898
rkennke Dec 11, 2023
c5a5b5c
Merge branch 'JDK-8305898' into JDK-8305895-v2
rkennke Dec 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion src/hotspot/cpu/aarch64/aarch64.ad
Original file line number Diff line number Diff line change
Expand Up @@ -7131,7 +7131,7 @@ instruct loadKlass(iRegPNoSp dst, memory8 mem)
instruct loadNKlass(iRegNNoSp dst, memory4 mem)
%{
match(Set dst (LoadNKlass mem));
predicate(!needs_acquiring_load(n));
predicate(!needs_acquiring_load(n) && !UseCompactObjectHeaders);

ins_cost(4 * INSN_COST);
format %{ "ldrw $dst, $mem\t# compressed class ptr" %}
Expand All @@ -7141,6 +7141,20 @@ instruct loadNKlass(iRegNNoSp dst, memory4 mem)
ins_pipe(iload_reg_mem);
%}

instruct loadNKlassCompactHeaders(iRegNNoSp dst, memory4 mem, rFlagsReg cr)
%{
match(Set dst (LoadNKlass mem));
effect(KILL cr);
predicate(!needs_acquiring_load(n) && UseCompactObjectHeaders);

ins_cost(4 * INSN_COST);
format %{ "ldrw $dst, $mem\t# compressed class ptr" %}
ins_encode %{
__ load_nklass_compact($dst$$Register, $mem$$base$$Register, $mem$$index$$Register, $mem$$scale, $mem$$disp);
%}
ins_pipe(pipe_slow);
%}

// Load Float
instruct loadF(vRegF dst, memory4 mem)
%{
Expand Down
8 changes: 8 additions & 0 deletions src/hotspot/cpu/aarch64/c1_CodeStubs_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "c1/c1_Runtime1.hpp"
#include "classfile/javaClasses.hpp"
#include "nativeInst_aarch64.hpp"
#include "runtime/objectMonitor.hpp"
#include "runtime/sharedRuntime.hpp"
#include "vmreg_aarch64.inline.hpp"

Expand Down Expand Up @@ -233,6 +234,13 @@ void MonitorExitStub::emit_code(LIR_Assembler* ce) {
__ far_jump(RuntimeAddress(Runtime1::entry_for(exit_id)));
}

void LoadKlassStub::emit_code(LIR_Assembler* ce) {
assert(UseCompactObjectHeaders, "Only use with compact object headers");
__ bind(_entry);
Register d = _result->as_register();
__ ldr(d, Address(d, OM_OFFSET_NO_MONITOR_VALUE_TAG(header)));
__ b(_continuation);
}

// Implementation of patching:
// - Copy the code at given offset to an inlined buffer (first the bytes, then the number of bytes)
Expand Down
53 changes: 16 additions & 37 deletions src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2265,8 +2265,6 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {

Address src_length_addr = Address(src, arrayOopDesc::length_offset_in_bytes());
Address dst_length_addr = Address(dst, arrayOopDesc::length_offset_in_bytes());
Address src_klass_addr = Address(src, oopDesc::klass_offset_in_bytes());
Address dst_klass_addr = Address(dst, oopDesc::klass_offset_in_bytes());

// test for null
if (flags & LIR_OpArrayCopy::src_null_check) {
Expand Down Expand Up @@ -2327,15 +2325,7 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
// We don't know the array types are compatible
if (basic_type != T_OBJECT) {
// Simple test for basic type arrays
if (UseCompressedClassPointers) {
__ ldrw(tmp, src_klass_addr);
__ ldrw(rscratch1, dst_klass_addr);
__ cmpw(tmp, rscratch1);
} else {
__ ldr(tmp, src_klass_addr);
__ ldr(rscratch1, dst_klass_addr);
__ cmp(tmp, rscratch1);
}
__ cmp_klass(src, dst, tmp, rscratch1);
__ br(Assembler::NE, *stub->entry());
} else {
// For object arrays, if src is a sub class of dst then we can
Expand Down Expand Up @@ -2457,36 +2447,14 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
// but not necessarily exactly of type default_type.
Label known_ok, halt;
__ mov_metadata(tmp, default_type->constant_encoding());
if (UseCompressedClassPointers) {
__ encode_klass_not_null(tmp);
}

if (basic_type != T_OBJECT) {

if (UseCompressedClassPointers) {
__ ldrw(rscratch1, dst_klass_addr);
__ cmpw(tmp, rscratch1);
} else {
__ ldr(rscratch1, dst_klass_addr);
__ cmp(tmp, rscratch1);
}
__ cmp_klass(dst, tmp, rscratch1);
__ br(Assembler::NE, halt);
if (UseCompressedClassPointers) {
__ ldrw(rscratch1, src_klass_addr);
__ cmpw(tmp, rscratch1);
} else {
__ ldr(rscratch1, src_klass_addr);
__ cmp(tmp, rscratch1);
}
__ cmp_klass(src, tmp, rscratch1);
__ br(Assembler::EQ, known_ok);
} else {
if (UseCompressedClassPointers) {
__ ldrw(rscratch1, dst_klass_addr);
__ cmpw(tmp, rscratch1);
} else {
__ ldr(rscratch1, dst_klass_addr);
__ cmp(tmp, rscratch1);
}
__ cmp_klass(dst, tmp, rscratch1);
__ br(Assembler::EQ, known_ok);
__ cmp(src, dst);
__ br(Assembler::EQ, known_ok);
Expand Down Expand Up @@ -2568,7 +2536,18 @@ void LIR_Assembler::emit_load_klass(LIR_OpLoadKlass* op) {
}

if (UseCompressedClassPointers) {
__ ldrw(result, Address (obj, oopDesc::klass_offset_in_bytes()));
if (UseCompactObjectHeaders) {
// Check if we can take the (common) fast path, if obj is unlocked.
__ ldr(result, Address(obj, oopDesc::mark_offset_in_bytes()));
__ tst(result, markWord::monitor_value);
__ br(Assembler::NE, *op->stub()->entry());
__ bind(*op->stub()->continuation());

// Shift to get proper narrow Klass*.
__ lsr(result, result, markWord::klass_shift);
} else {
__ ldrw(result, Address (obj, oopDesc::klass_offset_in_bytes()));
}
__ decode_klass_not_null(result);
} else {
__ ldr(result, Address (obj, oopDesc::klass_offset_in_bytes()));
Expand Down
32 changes: 20 additions & 12 deletions src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,20 +180,30 @@ void C1_MacroAssembler::try_allocate(Register obj, Register var_size_in_bytes, i

void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
assert_different_registers(obj, klass, len);
// This assumes that all prototype bits fit in an int32_t
mov(t1, (int32_t)(intptr_t)markWord::prototype().value());
str(t1, Address(obj, oopDesc::mark_offset_in_bytes()));

if (UseCompressedClassPointers) { // Take care not to kill klass
encode_klass_not_null(t1, klass);
strw(t1, Address(obj, oopDesc::klass_offset_in_bytes()));
if (UseCompactObjectHeaders) {
ldr(t1, Address(klass, Klass::prototype_header_offset()));
str(t1, Address(obj, oopDesc::mark_offset_in_bytes()));
} else {
str(klass, Address(obj, oopDesc::klass_offset_in_bytes()));
// This assumes that all prototype bits fit in an int32_t
mov(t1, (int32_t)(intptr_t)markWord::prototype().value());
str(t1, Address(obj, oopDesc::mark_offset_in_bytes()));

if (UseCompressedClassPointers) { // Take care not to kill klass
encode_klass_not_null(t1, klass);
strw(t1, Address(obj, oopDesc::klass_offset_in_bytes()));
} else {
str(klass, Address(obj, oopDesc::klass_offset_in_bytes()));
}
}

if (len->is_valid()) {
strw(len, Address(obj, arrayOopDesc::length_offset_in_bytes()));
} else if (UseCompressedClassPointers) {
if (UseCompactObjectHeaders) {
// With compact headers, arrays have a 32bit alignment gap after the length.
assert(arrayOopDesc::length_offset_in_bytes() == 8, "check length offset");
strw(zr, Address(obj, arrayOopDesc::length_offset_in_bytes() + sizeof(jint)));
}
} else if (UseCompressedClassPointers && !UseCompactObjectHeaders) {
store_klass_gap(obj, zr);
}
}
Expand Down Expand Up @@ -312,9 +322,7 @@ void C1_MacroAssembler::allocate_array(Register obj, Register len, Register t1,
void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
verify_oop(receiver);
// explicit null check not needed since load from [klass_offset] causes a trap
// check against inline cache
assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()), "must add explicit null check");

// check against inline cache. This is checked in Universe::genesis()..
cmp_klass(receiver, iCache, rscratch1);
}

Expand Down
11 changes: 11 additions & 0 deletions src/hotspot/cpu/aarch64/c2_CodeStubs_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,15 @@ void C2HandleAnonOMOwnerStub::emit(C2_MacroAssembler& masm) {
__ b(continuation());
}

int C2LoadNKlassStub::max_size() const {
return 8;
}

void C2LoadNKlassStub::emit(C2_MacroAssembler& masm) {
__ bind(entry());
Register d = dst();
__ ldr(d, Address(d, OM_OFFSET_NO_MONITOR_VALUE_TAG(header)));
__ b(continuation());
}

#undef __
27 changes: 27 additions & 0 deletions src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2255,3 +2255,30 @@ bool C2_MacroAssembler::in_scratch_emit_size() {
}
return MacroAssembler::in_scratch_emit_size();
}

void C2_MacroAssembler::load_nklass_compact(Register dst, Register obj, Register index, int scale, int disp) {
C2LoadNKlassStub* stub = new (Compile::current()->comp_arena()) C2LoadNKlassStub(dst);
Compile::current()->output()->add_stub(stub);

// Note: Don't clobber obj anywhere in that method!

// The incoming address is pointing into obj-start + klass_offset_in_bytes. We need to extract
// obj-start, so that we can load from the object's mark-word instead. Usually the address
// comes as obj-start in obj and klass_offset_in_bytes in disp. However, sometimes C2
// emits code that pre-computes obj-start + klass_offset_in_bytes into a register, and
// then passes that register as obj and 0 in disp. The following code extracts the base
// and offset to load the mark-word.
int offset = oopDesc::mark_offset_in_bytes() + disp - oopDesc::klass_offset_in_bytes();
if (index == noreg) {
ldr(dst, Address(obj, offset));
} else {
lea(dst, Address(obj, index, Address::lsl(scale)));
ldr(dst, Address(dst, offset));
}
// NOTE: We can't use tbnz here, because the target is sometimes too far away
// and cannot be encoded.
tst(dst, markWord::monitor_value);
br(Assembler::NE, stub->entry());
bind(stub->continuation());
lsr(dst, dst, markWord::klass_shift);
}
2 changes: 2 additions & 0 deletions src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,6 @@
void vector_signum_sve(FloatRegister dst, FloatRegister src, FloatRegister zero,
FloatRegister one, FloatRegister vtmp, PRegister pgtmp, SIMD_RegVariant T);

void load_nklass_compact(Register dst, Register obj, Register index, int scale, int disp);

#endif // CPU_AARCH64_C2_MACROASSEMBLER_AARCH64_HPP
49 changes: 47 additions & 2 deletions src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4419,8 +4419,30 @@ void MacroAssembler::load_method_holder(Register holder, Register method) {
ldr(holder, Address(holder, ConstantPool::pool_holder_offset())); // InstanceKlass*
}

// Loads the obj's Klass* into dst.
// Preserves all registers (incl src, rscratch1 and rscratch2).
void MacroAssembler::load_nklass_compact(Register dst, Register src) {
assert(UseCompactObjectHeaders, "expects UseCompactObjectHeaders");

Label fast;

// Check if we can take the (common) fast path, if obj is unlocked.
ldr(dst, Address(src, oopDesc::mark_offset_in_bytes()));
tbz(dst, exact_log2(markWord::monitor_value), fast);

// Fetch displaced header
ldr(dst, Address(dst, OM_OFFSET_NO_MONITOR_VALUE_TAG(header)));

// Fast-path: shift and decode Klass*.
bind(fast);
lsr(dst, dst, markWord::klass_shift);
}

void MacroAssembler::load_klass(Register dst, Register src) {
if (UseCompressedClassPointers) {
if (UseCompactObjectHeaders) {
load_nklass_compact(dst, src);
decode_klass_not_null(dst);
} else if (UseCompressedClassPointers) {
ldrw(dst, Address(src, oopDesc::klass_offset_in_bytes()));
decode_klass_not_null(dst);
} else {
Expand Down Expand Up @@ -4476,8 +4498,13 @@ void MacroAssembler::load_mirror(Register dst, Register method, Register tmp1, R
}

void MacroAssembler::cmp_klass(Register oop, Register trial_klass, Register tmp) {
assert_different_registers(oop, trial_klass, tmp);
if (UseCompressedClassPointers) {
ldrw(tmp, Address(oop, oopDesc::klass_offset_in_bytes()));
if (UseCompactObjectHeaders) {
load_nklass_compact(tmp, oop);
} else {
ldrw(tmp, Address(oop, oopDesc::klass_offset_in_bytes()));
}
if (CompressedKlassPointers::base() == nullptr) {
cmp(trial_klass, tmp, LSL, CompressedKlassPointers::shift());
return;
Expand All @@ -4494,9 +4521,26 @@ void MacroAssembler::cmp_klass(Register oop, Register trial_klass, Register tmp)
cmp(trial_klass, tmp);
}

void MacroAssembler::cmp_klass(Register src, Register dst, Register tmp1, Register tmp2) {
if (UseCompactObjectHeaders) {
load_nklass_compact(tmp1, src);
load_nklass_compact(tmp2, dst);
cmpw(tmp1, tmp2);
} else if (UseCompressedClassPointers) {
ldrw(tmp1, Address(src, oopDesc::klass_offset_in_bytes()));
ldrw(tmp2, Address(dst, oopDesc::klass_offset_in_bytes()));
cmpw(tmp1, tmp2);
} else {
ldr(tmp1, Address(src, oopDesc::klass_offset_in_bytes()));
ldr(tmp2, Address(dst, oopDesc::klass_offset_in_bytes()));
cmp(tmp1, tmp2);
}
}

void MacroAssembler::store_klass(Register dst, Register src) {
// FIXME: Should this be a store release? concurrent gcs assumes
// klass length is valid if klass field is not null.
assert(!UseCompactObjectHeaders, "not with compact headers");
if (UseCompressedClassPointers) {
encode_klass_not_null(src);
strw(src, Address(dst, oopDesc::klass_offset_in_bytes()));
Expand All @@ -4506,6 +4550,7 @@ void MacroAssembler::store_klass(Register dst, Register src) {
}

void MacroAssembler::store_klass_gap(Register dst, Register src) {
assert(!UseCompactObjectHeaders, "not with compact headers");
if (UseCompressedClassPointers) {
// Store to klass gap in destination
strw(src, Address(dst, oopDesc::klass_gap_offset_in_bytes()));
Expand Down
2 changes: 2 additions & 0 deletions src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -863,9 +863,11 @@ class MacroAssembler: public Assembler {
void load_method_holder(Register holder, Register method);

// oop manipulations
void load_nklass_compact(Register dst, Register src);
void load_klass(Register dst, Register src);
void store_klass(Register dst, Register src);
void cmp_klass(Register oop, Register trial_klass, Register tmp);
void cmp_klass(Register src, Register dst, Register tmp1, Register tmp2);

void resolve_weak_handle(Register result, Register tmp1, Register tmp2);
void resolve_oop_handle(Register result, Register tmp1, Register tmp2);
Expand Down
28 changes: 21 additions & 7 deletions src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3635,12 +3635,22 @@ void TemplateTable::_new() {

// The object is initialized before the header. If the object size is
// zero, go directly to the header initialization.
__ sub(r3, r3, sizeof(oopDesc));
if (UseCompactObjectHeaders) {
assert(is_aligned(oopDesc::base_offset_in_bytes(), BytesPerLong), "oop base offset must be 8-byte-aligned");
__ sub(r3, r3, oopDesc::base_offset_in_bytes());
} else {
__ sub(r3, r3, sizeof(oopDesc));
}
__ cbz(r3, initialize_header);

// Initialize object fields
{
__ add(r2, r0, sizeof(oopDesc));
if (UseCompactObjectHeaders) {
assert(is_aligned(oopDesc::base_offset_in_bytes(), BytesPerLong), "oop base offset must be 8-byte-aligned");
__ add(r2, r0, oopDesc::base_offset_in_bytes());
} else {
__ add(r2, r0, sizeof(oopDesc));
}
Label loop;
__ bind(loop);
__ str(zr, Address(__ post(r2, BytesPerLong)));
Expand All @@ -3650,11 +3660,15 @@ void TemplateTable::_new() {

// initialize object header only.
__ bind(initialize_header);
__ mov(rscratch1, (intptr_t)markWord::prototype().value());
__ str(rscratch1, Address(r0, oopDesc::mark_offset_in_bytes()));
__ store_klass_gap(r0, zr); // zero klass gap for compressed oops
__ store_klass(r0, r4); // store klass last

if (UseCompactObjectHeaders) {
__ ldr(rscratch1, Address(r4, Klass::prototype_header_offset()));
__ str(rscratch1, Address(r0, oopDesc::mark_offset_in_bytes()));
} else {
__ mov(rscratch1, (intptr_t)markWord::prototype().value());
__ str(rscratch1, Address(r0, oopDesc::mark_offset_in_bytes()));
__ store_klass_gap(r0, zr); // zero klass gap for compressed oops
__ store_klass(r0, r4); // store klass last
}
{
SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
// Trigger dtrace event for fastpath
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
temp_reg, temp_reg2, itable_index, L_no_such_interface);

// Reduce "estimate" such that "padding" does not drop below 8.
const ptrdiff_t estimate = 124;
const ptrdiff_t estimate = UseCompactObjectHeaders ? 132 : 124;
const ptrdiff_t codesize = __ pc() - start_pc;
slop_delta = (int)(estimate - codesize);
slop_bytes += slop_delta;
Expand Down
Loading
Loading