< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page

2228 
2229   __ bind(resolved);
2230 
2231   // Class initialization barrier for static methods
2232   if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2233     const Register method = temp;
2234     const Register klass  = temp;
2235 
2236     __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2237     __ load_method_holder(klass, method);
2238     __ clinit_barrier(klass, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2239   }
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 resolved;
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 
2257   assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2258   __ load_field_entry(cache, index);
2259   if (byte_no == f1_byte) {
2260     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::get_code_offset())));
2261   } else {
2262     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::put_code_offset())));
2263   }
2264   __ cmpl(temp, code);  // have we resolved this bytecode?
2265   __ jcc(Assembler::equal, resolved);
2266 
2267   // resolve first time through

2268   address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2269   __ movl(temp, code);
2270   __ call_VM(noreg, entry, temp);
2271   // Update registers with resolved info
2272   __ load_field_entry(cache, index);
2273 
2274   __ bind(resolved);











2275 }
2276 
2277 void TemplateTable::load_resolved_field_entry(Register obj,
2278                                               Register cache,
2279                                               Register tos_state,
2280                                               Register offset,
2281                                               Register flags,
2282                                               bool is_static = false) {
2283   assert_different_registers(cache, tos_state, flags, offset);
2284 
2285   // Field offset
2286   __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2287 
2288   // Flags
2289   __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2290 
2291   // TOS state
2292   __ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2293 
2294   // Klass overwrite register

2228 
2229   __ bind(resolved);
2230 
2231   // Class initialization barrier for static methods
2232   if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2233     const Register method = temp;
2234     const Register klass  = temp;
2235 
2236     __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2237     __ load_method_holder(klass, method);
2238     __ clinit_barrier(klass, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2239   }
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;
2249   Label resolved;
2250 
2251   Bytecodes::Code code = bytecode();
2252   switch (code) {
2253     case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2254     case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2255     default: break;
2256   }
2257 
2258   assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2259   __ load_field_entry(cache, index);
2260   if (byte_no == f1_byte) {
2261     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::get_code_offset())));
2262   } else {
2263     __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::put_code_offset())));
2264   }
2265   __ cmpl(temp, code);  // have we resolved this bytecode?
2266   __ jcc(Assembler::equal, resolved);
2267 
2268   // resolve first time through
2269   __ bind(L_clinit_barrier_slow);
2270   address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2271   __ movl(temp, code);
2272   __ call_VM(noreg, entry, temp);
2273   // Update registers with resolved info
2274   __ load_field_entry(cache, index);
2275 
2276   __ bind(resolved);
2277 
2278   // Class initialization barrier for static fields
2279   if (VM_Version::supports_fast_class_init_checks() &&
2280       (bytecode() == Bytecodes::_getstatic || bytecode() == Bytecodes::_putstatic)) {
2281     const Register field_holder = temp;
2282     const Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
2283     assert(thread != noreg, "x86_32 not supported");
2284 
2285     __ movptr(field_holder, Address(cache, in_bytes(ResolvedFieldEntry::field_holder_offset())));
2286     __ clinit_barrier(field_holder, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2287   }
2288 }
2289 
2290 void TemplateTable::load_resolved_field_entry(Register obj,
2291                                               Register cache,
2292                                               Register tos_state,
2293                                               Register offset,
2294                                               Register flags,
2295                                               bool is_static = false) {
2296   assert_different_registers(cache, tos_state, flags, offset);
2297 
2298   // Field offset
2299   __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2300 
2301   // Flags
2302   __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2303 
2304   // TOS state
2305   __ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2306 
2307   // Klass overwrite register
< prev index next >