< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page

2259 
2260   __ bind(resolved);
2261 
2262   // Class initialization barrier for static methods
2263   if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2264     const Register method = temp;
2265     const Register klass  = temp;
2266 
2267     __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2268     __ load_method_holder(klass, method);
2269     __ clinit_barrier(klass, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2270   }
2271 }
2272 
2273 void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
2274                                             Register cache,
2275                                             Register index) {
2276   const Register temp = rbx;
2277   assert_different_registers(cache, index, temp);
2278 

2279   Label resolved;
2280 
2281   Bytecodes::Code code = bytecode();
2282   switch (code) {
2283     case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2284     case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2285     default: break;
2286   }
2287 
2288   assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2289   __ load_field_entry(cache, index);
2290   if (byte_no == f1_byte) {
2291     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::get_code_offset())));
2292   } else {
2293     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::put_code_offset())));
2294   }
2295   __ cmpl(temp, code);  // have we resolved this bytecode?
2296   __ jcc(Assembler::equal, resolved);
2297 
2298   // resolve first time through

2299   address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2300   __ movl(temp, code);
2301   __ call_VM(noreg, entry, temp);
2302   // Update registers with resolved info
2303   __ load_field_entry(cache, index);
2304 
2305   __ bind(resolved);











2306 }
2307 
2308 void TemplateTable::load_resolved_field_entry(Register obj,
2309                                               Register cache,
2310                                               Register tos_state,
2311                                               Register offset,
2312                                               Register flags,
2313                                               bool is_static = false) {
2314   assert_different_registers(cache, tos_state, flags, offset);
2315 
2316   // Field offset
2317   __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2318 
2319   // Flags
2320   __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2321 
2322   // TOS state
2323   __ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2324 
2325   // Klass overwrite register

2259 
2260   __ bind(resolved);
2261 
2262   // Class initialization barrier for static methods
2263   if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2264     const Register method = temp;
2265     const Register klass  = temp;
2266 
2267     __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2268     __ load_method_holder(klass, method);
2269     __ clinit_barrier(klass, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2270   }
2271 }
2272 
2273 void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
2274                                             Register cache,
2275                                             Register index) {
2276   const Register temp = rbx;
2277   assert_different_registers(cache, index, temp);
2278 
2279   Label L_clinit_barrier_slow;
2280   Label resolved;
2281 
2282   Bytecodes::Code code = bytecode();
2283   switch (code) {
2284     case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2285     case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2286     default: break;
2287   }
2288 
2289   assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2290   __ load_field_entry(cache, index);
2291   if (byte_no == f1_byte) {
2292     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::get_code_offset())));
2293   } else {
2294     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::put_code_offset())));
2295   }
2296   __ cmpl(temp, code);  // have we resolved this bytecode?
2297   __ jcc(Assembler::equal, resolved);
2298 
2299   // resolve first time through
2300   __ bind(L_clinit_barrier_slow);
2301   address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2302   __ movl(temp, code);
2303   __ call_VM(noreg, entry, temp);
2304   // Update registers with resolved info
2305   __ load_field_entry(cache, index);
2306 
2307   __ bind(resolved);
2308 
2309   // Class initialization barrier for static fields
2310   if (VM_Version::supports_fast_class_init_checks() &&
2311       (bytecode() == Bytecodes::_getstatic || bytecode() == Bytecodes::_putstatic)) {
2312     const Register field_holder = temp;
2313     const Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
2314     assert(thread != noreg, "x86_32 not supported");
2315 
2316     __ movptr(field_holder, Address(cache, in_bytes(ResolvedFieldEntry::field_holder_offset())));
2317     __ clinit_barrier(field_holder, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2318   }
2319 }
2320 
2321 void TemplateTable::load_resolved_field_entry(Register obj,
2322                                               Register cache,
2323                                               Register tos_state,
2324                                               Register offset,
2325                                               Register flags,
2326                                               bool is_static = false) {
2327   assert_different_registers(cache, tos_state, flags, offset);
2328 
2329   // Field offset
2330   __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2331 
2332   // Flags
2333   __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2334 
2335   // TOS state
2336   __ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2337 
2338   // Klass overwrite register
< prev index next >