3265 Register Rret_type = Rret_addr;
3266 address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
3267
3268 // Get return type. It's coded into the upper 4 bits of the lower half of the 64 bit value.
3269 __ rldicl(Rret_type, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits);
3270 __ load_dispatch_table(Rtable_addr, (address*)table_addr);
3271 __ sldi(Rret_type, Rret_type, LogBytesPerWord);
3272 // Get return address.
3273 __ ldx(Rret_addr, Rtable_addr, Rret_type);
3274 }
3275 }
3276
3277 // Helper for virtual calls. Load target out of vtable and jump off!
3278 // Kills all passed registers.
3279 void TemplateTable::generate_vtable_call(Register Rrecv_klass, Register Rindex, Register Rret, Register Rtemp) {
3280
3281 assert_different_registers(Rrecv_klass, Rtemp, Rret);
3282 const Register Rtarget_method = Rindex;
3283
3284 // Get target method & entry point.
3285 const int base = in_bytes(InstanceKlass::vtable_start_offset());
3286 // Calc vtable addr scale the vtable index by 8.
3287 __ sldi(Rindex, Rindex, exact_log2(vtableEntry::size_in_bytes()));
3288 // Load target.
3289 __ addi(Rrecv_klass, Rrecv_klass, base + vtableEntry::method_offset_in_bytes());
3290 __ ldx(Rtarget_method, Rindex, Rrecv_klass);
3291 // Argument and return type profiling.
3292 __ profile_arguments_type(Rtarget_method, Rrecv_klass /* scratch1 */, Rtemp /* scratch2 */, true);
3293 __ call_from_interpreter(Rtarget_method, Rret, Rrecv_klass /* scratch1 */, Rtemp /* scratch2 */);
3294 }
3295
3296 // Virtual or final call. Final calls are rewritten on the fly to run through "fast_finalcall" next time.
3297 void TemplateTable::invokevirtual(int byte_no) {
3298 transition(vtos, vtos);
3299
3300 Register Rtable_addr = R11_scratch1,
3301 Rret_type = R12_scratch2,
3302 Rret_addr = R5_ARG3,
3303 Rflags = R22_tmp2, // Should survive C call.
3304 Rrecv = R3_ARG1,
3305 Rrecv_klass = Rrecv,
|
3265 Register Rret_type = Rret_addr;
3266 address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
3267
3268 // Get return type. It's coded into the upper 4 bits of the lower half of the 64 bit value.
3269 __ rldicl(Rret_type, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits);
3270 __ load_dispatch_table(Rtable_addr, (address*)table_addr);
3271 __ sldi(Rret_type, Rret_type, LogBytesPerWord);
3272 // Get return address.
3273 __ ldx(Rret_addr, Rtable_addr, Rret_type);
3274 }
3275 }
3276
3277 // Helper for virtual calls. Load target out of vtable and jump off!
3278 // Kills all passed registers.
3279 void TemplateTable::generate_vtable_call(Register Rrecv_klass, Register Rindex, Register Rret, Register Rtemp) {
3280
3281 assert_different_registers(Rrecv_klass, Rtemp, Rret);
3282 const Register Rtarget_method = Rindex;
3283
3284 // Get target method & entry point.
3285 const int base = in_bytes(Klass::vtable_start_offset());
3286 // Calc vtable addr scale the vtable index by 8.
3287 __ sldi(Rindex, Rindex, exact_log2(vtableEntry::size_in_bytes()));
3288 // Load target.
3289 __ addi(Rrecv_klass, Rrecv_klass, base + vtableEntry::method_offset_in_bytes());
3290 __ ldx(Rtarget_method, Rindex, Rrecv_klass);
3291 // Argument and return type profiling.
3292 __ profile_arguments_type(Rtarget_method, Rrecv_klass /* scratch1 */, Rtemp /* scratch2 */, true);
3293 __ call_from_interpreter(Rtarget_method, Rret, Rrecv_klass /* scratch1 */, Rtemp /* scratch2 */);
3294 }
3295
3296 // Virtual or final call. Final calls are rewritten on the fly to run through "fast_finalcall" next time.
3297 void TemplateTable::invokevirtual(int byte_no) {
3298 transition(vtos, vtos);
3299
3300 Register Rtable_addr = R11_scratch1,
3301 Rret_type = R12_scratch2,
3302 Rret_addr = R5_ARG3,
3303 Rflags = R22_tmp2, // Should survive C call.
3304 Rrecv = R3_ARG1,
3305 Rrecv_klass = Rrecv,
|