< prev index next > src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
Print this page
// resolve first time through
// Class initialization barrier slow path lands here as well.
__ bind(clinit_barrier_slow);
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
__ mov(temp, (int) code);
! __ call_VM(noreg, entry, temp);
// Update registers with resolved info
__ load_method_entry(Rcache, index);
// n.b. unlike x86 Rcache is now rcpool plus the indexed offset
// so all clients ofthis method must be modified accordingly
// resolve first time through
// Class initialization barrier slow path lands here as well.
__ bind(clinit_barrier_slow);
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
__ mov(temp, (int) code);
! __ call_VM_preemptable(noreg, entry, temp);
// Update registers with resolved info
__ load_method_entry(Rcache, index);
// n.b. unlike x86 Rcache is now rcpool plus the indexed offset
// so all clients ofthis method must be modified accordingly
__ br(Assembler::EQ, resolved);
// resolve first time through
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
__ mov(temp, (int) code);
! __ call_VM(noreg, entry, temp);
// Update registers with resolved info
__ load_field_entry(Rcache, index);
__ bind(resolved);
}
__ br(Assembler::EQ, resolved);
// resolve first time through
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
__ mov(temp, (int) code);
! __ call_VM_preemptable(noreg, entry, temp);
// Update registers with resolved info
__ load_field_entry(Rcache, index);
__ bind(resolved);
}
Bytecodes::Code code = bytecode();
// Call to the interpreter runtime to resolve invokedynamic
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
__ mov(method, code); // this is essentially Bytecodes::_invokedynamic
! __ call_VM(noreg, entry, method);
// Update registers with resolved info
__ load_resolved_indy_entry(cache, index);
// Load-acquire the adapter method to match store-release in ResolvedIndyEntry::fill_in()
__ lea(method, Address(cache, in_bytes(ResolvedIndyEntry::method_offset())));
__ ldar(method, method);
Bytecodes::Code code = bytecode();
// Call to the interpreter runtime to resolve invokedynamic
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
__ mov(method, code); // this is essentially Bytecodes::_invokedynamic
! __ call_VM_preemptable(noreg, entry, method);
// Update registers with resolved info
__ load_resolved_indy_entry(cache, index);
// Load-acquire the adapter method to match store-release in ResolvedIndyEntry::fill_in()
__ lea(method, Address(cache, in_bytes(ResolvedIndyEntry::method_offset())));
__ ldar(method, method);
// slow case
__ bind(slow_case);
__ get_constant_pool(c_rarg1);
__ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
! call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
__ verify_oop(r0);
// continue
__ bind(done);
// Must prevent reordering of stores for object initialization with stores that publish the new object.
// slow case
__ bind(slow_case);
__ get_constant_pool(c_rarg1);
__ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
! __ call_VM_preemptable(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
__ verify_oop(r0);
// continue
__ bind(done);
// Must prevent reordering of stores for object initialization with stores that publish the new object.
< prev index next >