< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page

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 }
< prev index next >