< prev index next >
src/cpu/x86/vm/interp_masm_x86.cpp
Print this page
*** 30,39 ****
--- 30,40 ----
#include "memory/vtBuffer.hpp"
#include "oops/arrayOop.hpp"
#include "oops/markOop.hpp"
#include "oops/methodData.hpp"
#include "oops/method.hpp"
+ #include "oops/valueKlass.hpp"
#include "prims/jvmtiExport.hpp"
#include "prims/jvmtiThreadState.hpp"
#include "runtime/basicLock.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/sharedRuntime.hpp"
*** 1126,1137 ****
--- 1127,1152 ----
bind(no_reserved_zone_enabling);
}
if (load_values) {
// We are returning a value type, load its fields into registers
+ #ifndef _LP64
super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
+ #else
+ load_klass(rdi, rax);
+ movptr(rdi, Address(rdi, ValueKlass::unpack_handler_offset()));
+ Label skip;
+ testptr(rdi, rdi);
+ jcc(Assembler::equal, skip);
+
+ // Load fields from a buffered value with a value class specific
+ // handler
+ call(rdi);
+
+ bind(skip);
+ #endif
// call above kills the value in rbx. Reload it.
movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
}
leave(); // remove frame anchor
pop(ret_addr); // get return address
< prev index next >