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