< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page

        

*** 3450,3461 **** // Store into the field do_oop_store(_masm, field, rax); __ jmp(rewriteFlattenable); __ bind(isFlattened); pop_and_check_object(obj); ! call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::write_flattened_value), ! rax, off, obj); __ bind(rewriteFlattenable); if (rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_qputfield, bc, rbx, true, byte_no); } __ jmp(Done); --- 3450,3464 ---- // Store into the field do_oop_store(_masm, field, rax); __ jmp(rewriteFlattenable); __ bind(isFlattened); pop_and_check_object(obj); ! assert_different_registers(rax, rdx, obj, off); ! __ load_klass(rdx, rax); ! __ data_for_oop(rax, rax, rdx); ! __ addptr(obj, off); ! __ access_value_copy(IN_HEAP, rax, obj, rdx); __ bind(rewriteFlattenable); if (rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_qputfield, bc, rbx, true, byte_no); } __ jmp(Done);
*** 3664,3674 **** // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore | // Assembler::StoreStore)); Label notVolatile, Done; if (bytecode() == Bytecodes::_fast_qputfield) { ! __ movl(rscratch2, rdx); } __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); __ andl(rdx, 0x1); --- 3667,3677 ---- // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore | // Assembler::StoreStore)); Label notVolatile, Done; if (bytecode() == Bytecodes::_fast_qputfield) { ! __ movl(rscratch2, rdx); // saving flags for isFlattened test } __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); __ andl(rdx, 0x1);
*** 3680,3715 **** // Check for volatile store __ testl(rdx, rdx); __ jcc(Assembler::zero, notVolatile); ! fast_storefield_helper(field, rax); volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad | Assembler::StoreStore)); __ jmp(Done); __ bind(notVolatile); ! fast_storefield_helper(field, rax); __ bind(Done); } ! void TemplateTable::fast_storefield_helper(Address field, Register rax) { // access field switch (bytecode()) { case Bytecodes::_fast_qputfield: { Label isFlattened, done; __ null_check(rax); ! __ test_field_is_flattened(rscratch2, rscratch1, isFlattened); // No Flattened case do_oop_store(_masm, field, rax); __ jmp(done); __ bind(isFlattened); ! call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::write_flattened_value), ! rax, rbx, rcx); __ bind(done); } break; case Bytecodes::_fast_aputfield: { --- 3683,3727 ---- // Check for volatile store __ testl(rdx, rdx); __ jcc(Assembler::zero, notVolatile); ! if (bytecode() == Bytecodes::_fast_qputfield) { ! __ movl(rdx, rscratch2); // restoring flags for isFlattened test ! } ! fast_storefield_helper(field, rax, rdx); volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad | Assembler::StoreStore)); __ jmp(Done); __ bind(notVolatile); ! if (bytecode() == Bytecodes::_fast_qputfield) { ! __ movl(rdx, rscratch2); // restoring flags for isFlattened test ! } ! fast_storefield_helper(field, rax, rdx); __ bind(Done); } ! void TemplateTable::fast_storefield_helper(Address field, Register rax, Register flags) { // access field switch (bytecode()) { case Bytecodes::_fast_qputfield: { Label isFlattened, done; __ null_check(rax); ! __ test_field_is_flattened(flags, rscratch1, isFlattened); // No Flattened case do_oop_store(_masm, field, rax); __ jmp(done); __ bind(isFlattened); ! // Flattened case ! __ load_klass(rdx, rax); ! __ data_for_oop(rax, rax, rdx); ! __ lea(rcx, field); ! __ access_value_copy(IN_HEAP, rax, rcx, rdx); __ bind(done); } break; case Bytecodes::_fast_aputfield: {
< prev index next >