< prev index next >
src/hotspot/cpu/x86/templateTable_x86.cpp
Print this page
*** 3069,3080 ****
--- 3069,3091 ----
__ jcc(Assembler::zero, uninitialized);
__ push(atos);
__ jmp(Done);
__ bind(uninitialized);
__ andl(flags2, ConstantPoolCacheEntry::field_index_mask);
+ #ifdef _LP64
+ Label slow_case, finish;
+ __ cmpb(Address(rcx, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized);
+ __ jcc(Assembler::notEqual, slow_case);
+ __ get_default_value_oop(rcx, off, rax);
+ __ jmp(finish);
+ __ bind(slow_case);
+ #endif // LP64
__ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::uninitialized_static_value_field),
obj, flags2);
+ #ifdef _LP64
+ __ bind(finish);
+ #endif // _LP64
__ verify_oop(rax);
__ push(atos);
__ jmp(Done);
} else {
Label isFlattened, nonnull, isFlattenable, rewriteFlattenable;
*** 3088,3104 ****
}
__ jmp(Done);
__ bind(isFlattenable);
__ test_field_is_flattened(flags2, rscratch1, isFlattened);
// Non-flattened field case
pop_and_check_object(obj);
__ load_heap_oop(rax, field);
__ testptr(rax, rax);
__ jcc(Assembler::notZero, nonnull);
__ andl(flags2, ConstantPoolCacheEntry::field_index_mask);
! __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::uninitialized_instance_value_field),
! obj, flags2);
__ bind(nonnull);
__ verify_oop(rax);
__ push(atos);
__ jmp(rewriteFlattenable);
__ bind(isFlattened);
--- 3099,3118 ----
}
__ jmp(Done);
__ bind(isFlattenable);
__ test_field_is_flattened(flags2, rscratch1, isFlattened);
// Non-flattened field case
+ __ movptr(rax, rcx); // small dance required to preserve the klass_holder somewhere
pop_and_check_object(obj);
+ __ push(rax);
__ load_heap_oop(rax, field);
+ __ pop(rcx);
__ testptr(rax, rax);
__ jcc(Assembler::notZero, nonnull);
__ andl(flags2, ConstantPoolCacheEntry::field_index_mask);
! __ get_value_field_klass(rcx, flags2, rbx);
! __ get_default_value_oop(rbx, rcx, rax);
__ bind(nonnull);
__ verify_oop(rax);
__ push(atos);
__ jmp(rewriteFlattenable);
__ bind(isFlattened);
*** 3812,3832 ****
__ movptr(rscratch1, Address(rcx, rbx, Address::times_ptr,
in_bytes(ConstantPoolCache::base_offset() +
ConstantPoolCacheEntry::flags_offset())));
__ test_field_is_flattened(rscratch1, rscratch2, isFlattened);
// Non-flattened field case
- __ movptr(rscratch1, rax);
__ load_heap_oop(rax, field);
__ testptr(rax, rax);
__ jcc(Assembler::notZero, nonnull);
! __ movptr(rax, rscratch1);
! __ movl(rcx, Address(rcx, rbx, Address::times_ptr,
in_bytes(ConstantPoolCache::base_offset() +
ConstantPoolCacheEntry::flags_offset())));
! __ andl(rcx, ConstantPoolCacheEntry::field_index_mask);
! __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::uninitialized_instance_value_field),
! rax, rcx);
__ bind(nonnull);
__ verify_oop(rax);
__ jmp(Done);
__ bind(isFlattened);
__ push(rdx); // save offset
--- 3826,3847 ----
__ movptr(rscratch1, Address(rcx, rbx, Address::times_ptr,
in_bytes(ConstantPoolCache::base_offset() +
ConstantPoolCacheEntry::flags_offset())));
__ test_field_is_flattened(rscratch1, rscratch2, isFlattened);
// Non-flattened field case
__ load_heap_oop(rax, field);
__ testptr(rax, rax);
__ jcc(Assembler::notZero, nonnull);
! __ movl(rdx, Address(rcx, rbx, Address::times_ptr,
in_bytes(ConstantPoolCache::base_offset() +
ConstantPoolCacheEntry::flags_offset())));
! __ andl(rdx, ConstantPoolCacheEntry::field_index_mask);
! __ movptr(rcx, Address(rcx, rbx, Address::times_ptr,
! in_bytes(ConstantPoolCache::base_offset() +
! ConstantPoolCacheEntry::f1_offset())));
! __ get_value_field_klass(rcx, rdx, rbx);
! __ get_default_value_oop(rbx, rcx, rax);
__ bind(nonnull);
__ verify_oop(rax);
__ jmp(Done);
__ bind(isFlattened);
__ push(rdx); // save offset
< prev index next >