< 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 >