--- old/src/hotspot/cpu/x86/templateTable_x86.cpp 2019-12-02 11:00:11.000000000 -0500 +++ new/src/hotspot/cpu/x86/templateTable_x86.cpp 2019-12-02 11:00:11.000000000 -0500 @@ -3071,8 +3071,19 @@ __ 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); @@ -3090,13 +3101,16 @@ __ 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); - __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::uninitialized_instance_value_field), - obj, flags2); + __ get_value_field_klass(rcx, flags2, rbx); + __ get_default_value_oop(rbx, rcx, rax); __ bind(nonnull); __ verify_oop(rax); __ push(atos); @@ -3814,17 +3828,18 @@ 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, + __ movl(rdx, 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); + __ 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); --- old/src/hotspot/share/interpreter/interpreterRuntime.cpp 2019-12-02 11:00:12.000000000 -0500 +++ new/src/hotspot/share/interpreter/interpreterRuntime.cpp 2019-12-02 11:00:12.000000000 -0500 @@ -418,17 +418,6 @@ } JRT_END -JRT_ENTRY(void, InterpreterRuntime::uninitialized_instance_value_field(JavaThread* thread, oopDesc* obj, int index)) - instanceHandle obj_h(THREAD, (instanceOop)obj); - InstanceKlass* klass = InstanceKlass::cast(obj_h()->klass()); - Klass* field_k = klass->get_value_field_klass_or_null(index); - assert(field_k != NULL, "Must have been initialized"); - ValueKlass* field_vklass = ValueKlass::cast(field_k); - assert(field_vklass->is_initialized(), "Must have been initialized at this point"); - instanceOop res = (instanceOop)field_vklass->default_value(); - thread->set_vm_result(res); -JRT_END - JRT_ENTRY(void, InterpreterRuntime::read_flattened_field(JavaThread* thread, oopDesc* obj, int index, Klass* field_holder)) Handle obj_h(THREAD, obj); --- old/src/hotspot/share/interpreter/interpreterRuntime.hpp 2019-12-02 11:00:13.000000000 -0500 +++ new/src/hotspot/share/interpreter/interpreterRuntime.hpp 2019-12-02 11:00:13.000000000 -0500 @@ -68,7 +68,6 @@ static void defaultvalue (JavaThread* thread, ConstantPool* pool, int index); static int withfield (JavaThread* thread, ConstantPoolCache* cp_cache); static void uninitialized_static_value_field(JavaThread* thread, oopDesc* mirror, int offset); - static void uninitialized_instance_value_field(JavaThread* thread, oopDesc* obj, int offset); static void write_heap_copy (JavaThread* thread, oopDesc* value, int offset, oopDesc* rcv); static void read_flattened_field(JavaThread* thread, oopDesc* value, int index, Klass* field_holder);