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
|