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
|