< prev index next >
src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp
Print this page
*** 673,682 ****
--- 673,708 ----
should_not_reach_here();
bind(no_reserved_zone_enabling);
}
+
+ if (state == atos && ValueTypeReturnedAsFields) {
+ Label skip;
+ // Test if the return type is a value type
+ ldr(rscratch1, Address(rfp, frame::interpreter_frame_method_offset * wordSize));
+ ldr(rscratch1, Address(rscratch1, Method::const_offset()));
+ ldrb(rscratch1, Address(rscratch1, ConstMethod::result_type_offset()));
+ cmpw(rscratch1, (u1) T_VALUETYPE);
+ br(Assembler::NE, skip);
+
+ // We are returning a value type, load its fields into registers
+ // Load fields from a buffered value with a value class specific handler
+
+ load_klass(rscratch1 /*dst*/, r0 /*src*/);
+ ldr(rscratch1, Address(rscratch1, InstanceKlass::adr_valueklass_fixed_block_offset()));
+ ldr(rscratch1, Address(rscratch1, ValueKlass::unpack_handler_offset()));
+ cbz(rscratch1, skip);
+
+ blr(rscratch1);
+
+ // call above kills the value in r1. Reload it.
+ ldr(r1, Address(rfp, frame::interpreter_frame_sender_sp_offset * wordSize));
+ bind(skip);
+ }
+
+
// remove frame anchor
leave();
// If we're returning to interpreted code we will shortly be
// adjusting SP to allow some space for ESP. If we're returning to
// compiled code the saved sender SP was saved in sender_sp, so this
< prev index next >