2216 __ cmpl(temp, code); // have we resolved this bytecode?
2217
2218 // Class initialization barrier for static methods
2219 if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2220 const Register method = temp;
2221 const Register klass = temp;
2222
2223 __ jcc(Assembler::notEqual, L_clinit_barrier_slow);
2224 __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2225 __ load_method_holder(klass, method);
2226 __ clinit_barrier(klass, &L_done, /*L_slow_path*/ nullptr);
2227 __ bind(L_clinit_barrier_slow);
2228 } else {
2229 __ jcc(Assembler::equal, L_done);
2230 }
2231
2232 // resolve first time through
2233 // Class initialization barrier slow path lands here as well.
2234 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2235 __ movl(temp, code);
2236 __ call_VM(noreg, entry, temp);
2237 // Update registers with resolved info
2238 __ load_method_entry(cache, index);
2239 __ bind(L_done);
2240 }
2241
2242 void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
2243 Register cache,
2244 Register index) {
2245 const Register temp = rbx;
2246 assert_different_registers(cache, index, temp);
2247
2248 Label L_clinit_barrier_slow, L_done;
2249
2250 Bytecodes::Code code = bytecode();
2251 switch (code) {
2252 case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2253 case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2254 default: break;
2255 }
2256
2263 }
2264 __ cmpl(temp, code); // have we resolved this bytecode?
2265
2266 // Class initialization barrier for static fields
2267 if (VM_Version::supports_fast_class_init_checks() &&
2268 (bytecode() == Bytecodes::_getstatic || bytecode() == Bytecodes::_putstatic)) {
2269 const Register field_holder = temp;
2270
2271 __ jcc(Assembler::notEqual, L_clinit_barrier_slow);
2272 __ movptr(field_holder, Address(cache, in_bytes(ResolvedFieldEntry::field_holder_offset())));
2273 __ clinit_barrier(field_holder, &L_done, /*L_slow_path*/ nullptr);
2274 __ bind(L_clinit_barrier_slow);
2275 } else {
2276 __ jcc(Assembler::equal, L_done);
2277 }
2278
2279 // resolve first time through
2280 // Class initialization barrier slow path lands here as well.
2281 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2282 __ movl(temp, code);
2283 __ call_VM(noreg, entry, temp);
2284 // Update registers with resolved info
2285 __ load_field_entry(cache, index);
2286 __ bind(L_done);
2287 }
2288
2289 void TemplateTable::load_resolved_field_entry(Register obj,
2290 Register cache,
2291 Register tos_state,
2292 Register offset,
2293 Register flags,
2294 bool is_static = false) {
2295 assert_different_registers(cache, tos_state, flags, offset);
2296
2297 // Field offset
2298 __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2299
2300 // Flags
2301 __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2302
2303 // TOS state
3627 }
3628
3629 if (DTraceAllocProbes) {
3630 // Trigger dtrace event for fastpath
3631 __ push(atos);
3632 __ call_VM_leaf(
3633 CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)), rax);
3634 __ pop(atos);
3635 }
3636
3637 __ jmp(done);
3638 }
3639
3640 // slow case
3641 __ bind(slow_case);
3642 __ pop(rcx); // restore stack pointer to what it was when we came in.
3643 __ bind(slow_case_no_pop);
3644
3645 __ get_constant_pool(c_rarg1);
3646 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3647 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
3648 __ verify_oop(rax);
3649
3650 // continue
3651 __ bind(done);
3652 }
3653
3654 void TemplateTable::newarray() {
3655 transition(itos, atos);
3656 __ load_unsigned_byte(c_rarg1, at_bcp(1));
3657 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray),
3658 c_rarg1, rax);
3659 }
3660
3661 void TemplateTable::anewarray() {
3662 transition(itos, atos);
3663
3664 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3665 __ get_constant_pool(c_rarg1);
3666 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray),
3667 c_rarg1, c_rarg2, rax);
3668 }
|
2216 __ cmpl(temp, code); // have we resolved this bytecode?
2217
2218 // Class initialization barrier for static methods
2219 if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2220 const Register method = temp;
2221 const Register klass = temp;
2222
2223 __ jcc(Assembler::notEqual, L_clinit_barrier_slow);
2224 __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2225 __ load_method_holder(klass, method);
2226 __ clinit_barrier(klass, &L_done, /*L_slow_path*/ nullptr);
2227 __ bind(L_clinit_barrier_slow);
2228 } else {
2229 __ jcc(Assembler::equal, L_done);
2230 }
2231
2232 // resolve first time through
2233 // Class initialization barrier slow path lands here as well.
2234 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2235 __ movl(temp, code);
2236 __ call_VM_preemptable(noreg, entry, temp);
2237 // Update registers with resolved info
2238 __ load_method_entry(cache, index);
2239 __ bind(L_done);
2240 }
2241
2242 void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
2243 Register cache,
2244 Register index) {
2245 const Register temp = rbx;
2246 assert_different_registers(cache, index, temp);
2247
2248 Label L_clinit_barrier_slow, L_done;
2249
2250 Bytecodes::Code code = bytecode();
2251 switch (code) {
2252 case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2253 case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2254 default: break;
2255 }
2256
2263 }
2264 __ cmpl(temp, code); // have we resolved this bytecode?
2265
2266 // Class initialization barrier for static fields
2267 if (VM_Version::supports_fast_class_init_checks() &&
2268 (bytecode() == Bytecodes::_getstatic || bytecode() == Bytecodes::_putstatic)) {
2269 const Register field_holder = temp;
2270
2271 __ jcc(Assembler::notEqual, L_clinit_barrier_slow);
2272 __ movptr(field_holder, Address(cache, in_bytes(ResolvedFieldEntry::field_holder_offset())));
2273 __ clinit_barrier(field_holder, &L_done, /*L_slow_path*/ nullptr);
2274 __ bind(L_clinit_barrier_slow);
2275 } else {
2276 __ jcc(Assembler::equal, L_done);
2277 }
2278
2279 // resolve first time through
2280 // Class initialization barrier slow path lands here as well.
2281 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2282 __ movl(temp, code);
2283 __ call_VM_preemptable(noreg, entry, temp);
2284 // Update registers with resolved info
2285 __ load_field_entry(cache, index);
2286 __ bind(L_done);
2287 }
2288
2289 void TemplateTable::load_resolved_field_entry(Register obj,
2290 Register cache,
2291 Register tos_state,
2292 Register offset,
2293 Register flags,
2294 bool is_static = false) {
2295 assert_different_registers(cache, tos_state, flags, offset);
2296
2297 // Field offset
2298 __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2299
2300 // Flags
2301 __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2302
2303 // TOS state
3627 }
3628
3629 if (DTraceAllocProbes) {
3630 // Trigger dtrace event for fastpath
3631 __ push(atos);
3632 __ call_VM_leaf(
3633 CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)), rax);
3634 __ pop(atos);
3635 }
3636
3637 __ jmp(done);
3638 }
3639
3640 // slow case
3641 __ bind(slow_case);
3642 __ pop(rcx); // restore stack pointer to what it was when we came in.
3643 __ bind(slow_case_no_pop);
3644
3645 __ get_constant_pool(c_rarg1);
3646 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3647 __ call_VM_preemptable(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
3648 __ verify_oop(rax);
3649
3650 // continue
3651 __ bind(done);
3652 }
3653
3654 void TemplateTable::newarray() {
3655 transition(itos, atos);
3656 __ load_unsigned_byte(c_rarg1, at_bcp(1));
3657 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray),
3658 c_rarg1, rax);
3659 }
3660
3661 void TemplateTable::anewarray() {
3662 transition(itos, atos);
3663
3664 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3665 __ get_constant_pool(c_rarg1);
3666 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray),
3667 c_rarg1, c_rarg2, rax);
3668 }
|