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

8247357: Flattenable field concept needs some cleanup #77

Closed
wants to merge 9 commits into from
10 changes: 5 additions & 5 deletions src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
Expand Up @@ -1505,17 +1505,17 @@ void MacroAssembler::test_klass_is_value(Register klass, Register temp_reg, Labe
cbnz(temp_reg, is_value);
}

void MacroAssembler::test_field_is_flattenable(Register flags, Register temp_reg, Label& is_flattenable) {
void MacroAssembler::test_field_is_inline_type(Register flags, Register temp_reg, Label& is_inline) {
(void) temp_reg; // keep signature uniform with x86
tbnz(flags, ConstantPoolCacheEntry::is_flattenable_field_shift, is_flattenable);
tbnz(flags, ConstantPoolCacheEntry::is_inline_field_shift, is_inline);
}

void MacroAssembler::test_field_is_not_flattenable(Register flags, Register temp_reg, Label& not_flattenable) {
void MacroAssembler::test_field_is_not_inline_type(Register flags, Register temp_reg, Label& not_inline) {
(void) temp_reg; // keep signature uniform with x86
tbz(flags, ConstantPoolCacheEntry::is_flattenable_field_shift, not_flattenable);
tbz(flags, ConstantPoolCacheEntry::is_inline_field_shift, not_inline);
}

void MacroAssembler::test_field_is_flattened(Register flags, Register temp_reg, Label& is_flattened) {
void MacroAssembler::test_field_is_inlined(Register flags, Register temp_reg, Label& is_flattened) {
(void) temp_reg; // keep signature uniform with x86
tbnz(flags, ConstantPoolCacheEntry::is_flattened_field_shift, is_flattened);
}
Expand Down
6 changes: 3 additions & 3 deletions src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
Expand Up @@ -615,9 +615,9 @@ class MacroAssembler: public Assembler {

void test_klass_is_value(Register klass, Register temp_reg, Label& is_value);

void test_field_is_flattenable(Register flags, Register temp_reg, Label& is_flattenable);
void test_field_is_not_flattenable(Register flags, Register temp_reg, Label& notFlattenable);
void test_field_is_flattened(Register flags, Register temp_reg, Label& is_flattened);
void test_field_is_inline_type(Register flags, Register temp_reg, Label& is_inline);
void test_field_is_not_inline_type(Register flags, Register temp_reg, Label& not_inline);
void test_field_is_inlined(Register flags, Register temp_reg, Label& is_flattened);

// Check klass/oops is flat value type array (oop->_klass->_layout_helper & vt_bit)
void test_flattened_array_oop(Register klass, Register temp_reg, Label& is_flattened_array);
Expand Down
54 changes: 27 additions & 27 deletions src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
Expand Up @@ -2667,14 +2667,14 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteContr

if (is_static) {
__ load_heap_oop(r0, field);
Label isFlattenable, isUninitialized;
Label is_inline, isUninitialized;
// Issue below if the static field has not been initialized yet
__ test_field_is_flattenable(raw_flags, r8 /*temp*/, isFlattenable);
// Not flattenable case
__ test_field_is_inline_type(raw_flags, r8 /*temp*/, is_inline);
// Not inline case
__ push(atos);
__ b(Done);
// Flattenable case, must not return null even if uninitialized
__ bind(isFlattenable);
// Inline case, must not return null even if uninitialized
__ bind(is_inline);
__ cbz(r0, isUninitialized);
__ push(atos);
__ b(Done);
Expand All @@ -2685,33 +2685,33 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteContr
__ push(atos);
__ b(Done);
} else {
Label isFlattened, isInitialized, isFlattenable, rewriteFlattenable;
__ test_field_is_flattenable(raw_flags, r8 /*temp*/, isFlattenable);
// Non-flattenable field case, also covers the object case
Label isFlattened, isInitialized, is_inline, rewrite_inline;
__ test_field_is_inline_type(raw_flags, r8 /*temp*/, is_inline);
// Non-inline field case
__ load_heap_oop(r0, field);
__ push(atos);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_agetfield, bc, r1);
}
__ b(Done);
__ bind(isFlattenable);
__ test_field_is_flattened(raw_flags, r8 /* temp */, isFlattened);
// Non-flattened field case
__ bind(is_inline);
__ test_field_is_inlined(raw_flags, r8 /* temp */, isFlattened);
// Non-inline field case
__ load_heap_oop(r0, field);
__ cbnz(r0, isInitialized);
__ andw(raw_flags, raw_flags, ConstantPoolCacheEntry::field_index_mask);
__ call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::uninitialized_instance_value_field), obj, raw_flags);
__ bind(isInitialized);
__ verify_oop(r0);
__ push(atos);
__ b(rewriteFlattenable);
__ b(rewrite_inline);
__ bind(isFlattened);
__ ldr(r10, Address(cache, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f1_offset())));
__ andw(raw_flags, raw_flags, ConstantPoolCacheEntry::field_index_mask);
call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::read_flattened_field), obj, raw_flags, r10);
__ verify_oop(r0);
__ push(atos);
__ bind(rewriteFlattenable);
__ bind(rewrite_inline);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_qgetfield, bc, r1);
}
Expand Down Expand Up @@ -2967,37 +2967,37 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr

__ pop(atos);
if (is_static) {
Label notFlattenable;
__ test_field_is_not_flattenable(flags2, r8 /* temp */, notFlattenable);
Label not_inline;
__ test_field_is_not_inline_type(flags2, r8 /* temp */, not_inline);
__ null_check(r0);
__ bind(notFlattenable);
__ bind(not_inline);
do_oop_store(_masm, field, r0, IN_HEAP);
__ b(Done);
} else {
Label isFlattenable, isFlattened, notBuffered, notBuffered2, rewriteNotFlattenable, rewriteFlattenable;
__ test_field_is_flattenable(flags2, r8 /*temp*/, isFlattenable);
// Not flattenable case, covers not flattenable values and objects
Label is_inline, isFlattened, rewrite_not_inline, rewrite_inline;
__ test_field_is_inline_type(flags2, r8 /*temp*/, is_inline);
// Not inline case
pop_and_check_object(obj);
// Store into the field
do_oop_store(_masm, field, r0, IN_HEAP);
__ bind(rewriteNotFlattenable);
__ bind(rewrite_not_inline);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_aputfield, bc, r19, true, byte_no);
}
__ b(Done);
// Implementation of the flattenable semantic
__ bind(isFlattenable);
// Implementation of the inline semantic
__ bind(is_inline);
__ null_check(r0);
__ test_field_is_flattened(flags2, r8 /*temp*/, isFlattened);
// Not flattened case
__ test_field_is_inlined(flags2, r8 /*temp*/, isFlattened);
// Not inline case
pop_and_check_object(obj);
// Store into the field
do_oop_store(_masm, field, r0, IN_HEAP);
__ b(rewriteFlattenable);
__ b(rewrite_inline);
__ bind(isFlattened);
pop_and_check_object(obj);
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::write_flattened_value), r0, off, obj);
__ bind(rewriteFlattenable);
__ bind(rewrite_inline);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_qputfield, bc, r19, true, byte_no);
}
Expand Down Expand Up @@ -3332,7 +3332,7 @@ void TemplateTable::fast_accessfield(TosState state)
Label isFlattened, isInitialized, Done;
// FIXME: We don't need to reload registers multiple times, but stay close to x86 code
__ ldrw(r9, Address(r2, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset())));
__ test_field_is_flattened(r9, r8 /* temp */, isFlattened);
__ test_field_is_inlined(r9, r8 /* temp */, isFlattened);
// Non-flattened field case
__ mov(r9, r0);
__ load_heap_oop(r0, field);
Expand Down
4 changes: 2 additions & 2 deletions src/hotspot/cpu/x86/interp_masm_x86.cpp
Expand Up @@ -1215,7 +1215,7 @@ void InterpreterMacroAssembler::allocate_instance(Register klass, Register new_o
}


void InterpreterMacroAssembler::read_flattened_field(Register holder_klass,
void InterpreterMacroAssembler::read_inlined_field(Register holder_klass,
Register field_index, Register field_offset,
Register obj) {
Label alloc_failed, empty_value, done;
Expand Down Expand Up @@ -1255,7 +1255,7 @@ void InterpreterMacroAssembler::read_flattened_field(Register holder_klass,
bind(alloc_failed);
pop(obj);
pop(holder_klass);
call_VM(obj, CAST_FROM_FN_PTR(address, InterpreterRuntime::read_flattened_field),
call_VM(obj, CAST_FROM_FN_PTR(address, InterpreterRuntime::read_inlined_field),
obj, field_index, holder_klass);

bind(done);
Expand Down
6 changes: 3 additions & 3 deletions src/hotspot/cpu/x86/interp_masm_x86.hpp
Expand Up @@ -227,13 +227,13 @@ class InterpreterMacroAssembler: public MacroAssembler {
void allocate_instance(Register klass, Register new_obj,
Register t1, Register t2,
bool clear_fields, Label& alloc_failed);
// Allocate value buffer in "obj" and read in flattened field
// Allocate instance in "obj" and read in the content of the inline field
// NOTES:
// - input holder object via "obj", which must be rax,
// will return new value buffer obj via the same reg
// will return new instance via the same reg
// - assumes holder_klass and valueKlass field klass have both been resolved
// - 32 bits: kills rdi and rsi
void read_flattened_field(Register holder_klass,
void read_inlined_field(Register holder_klass,
Register field_index, Register field_offset,
Register obj = rax);

Expand Down
18 changes: 9 additions & 9 deletions src/hotspot/cpu/x86/macroAssembler_x86.cpp
Expand Up @@ -2637,28 +2637,28 @@ void MacroAssembler::test_klass_is_empty_value(Register klass, Register temp_reg
jcc(Assembler::notZero, is_empty_value);
}

void MacroAssembler::test_field_is_flattenable(Register flags, Register temp_reg, Label& is_flattenable) {
void MacroAssembler::test_field_is_inline_type(Register flags, Register temp_reg, Label& is_inline_type) {
movl(temp_reg, flags);
shrl(temp_reg, ConstantPoolCacheEntry::is_flattenable_field_shift);
shrl(temp_reg, ConstantPoolCacheEntry::is_inline_type_shift);
andl(temp_reg, 0x1);
testl(temp_reg, temp_reg);
jcc(Assembler::notZero, is_flattenable);
jcc(Assembler::notZero, is_inline_type);
}

void MacroAssembler::test_field_is_not_flattenable(Register flags, Register temp_reg, Label& notFlattenable) {
void MacroAssembler::test_field_is_not_inline_type(Register flags, Register temp_reg, Label& not_inline_type) {
movl(temp_reg, flags);
shrl(temp_reg, ConstantPoolCacheEntry::is_flattenable_field_shift);
shrl(temp_reg, ConstantPoolCacheEntry::is_inline_type_shift);
andl(temp_reg, 0x1);
testl(temp_reg, temp_reg);
jcc(Assembler::zero, notFlattenable);
jcc(Assembler::zero, not_inline_type);
}

void MacroAssembler::test_field_is_flattened(Register flags, Register temp_reg, Label& is_flattened) {
void MacroAssembler::test_field_is_inlined(Register flags, Register temp_reg, Label& is_inlined) {
movl(temp_reg, flags);
shrl(temp_reg, ConstantPoolCacheEntry::is_flattened_field_shift);
shrl(temp_reg, ConstantPoolCacheEntry::is_inlined_shift);
andl(temp_reg, 0x1);
testl(temp_reg, temp_reg);
jcc(Assembler::notZero, is_flattened);
jcc(Assembler::notZero, is_inlined);
}

void MacroAssembler::test_flattened_array_oop(Register oop, Register temp_reg,
Expand Down
6 changes: 3 additions & 3 deletions src/hotspot/cpu/x86/macroAssembler_x86.hpp
Expand Up @@ -111,9 +111,9 @@ class MacroAssembler: public Assembler {
// get_default_value_oop with extra assertion for empty value klass
void get_empty_value_oop(Register value_klass, Register temp_reg, Register obj);

void test_field_is_flattenable(Register flags, Register temp_reg, Label& is_flattenable);
void test_field_is_not_flattenable(Register flags, Register temp_reg, Label& notFlattenable);
void test_field_is_flattened(Register flags, Register temp_reg, Label& is_flattened);
void test_field_is_inline_type(Register flags, Register temp_reg, Label& is_inline);
void test_field_is_not_inline_type(Register flags, Register temp_reg, Label& not_inline);
void test_field_is_inlined(Register flags, Register temp_reg, Label& is_inlined);

// Check oops array storage properties, i.e. flattened and/or null-free
void test_flattened_array_oop(Register oop, Register temp_reg, Label&is_flattened_array);
Expand Down