< prev index next >

src/hotspot/cpu/x86/interp_masm_x86.cpp

Print this page

        

*** 29,38 **** --- 29,39 ---- #include "logging/log.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/frame.inline.hpp"
*** 1095,1109 **** notify_method_exit(state, NotifyJVMTI); // preserve TOSCA } else { notify_method_exit(state, SkipNotifyJVMTI); // preserve TOSCA } ! // remove activation ! // get sender sp movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); - if (StackReservedPages > 0) { // testing if reserved zone needs to be re-enabled Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx); Label no_reserved_zone_enabling; NOT_LP64(get_thread(rthread);) --- 1096,1108 ---- notify_method_exit(state, NotifyJVMTI); // preserve TOSCA } else { notify_method_exit(state, SkipNotifyJVMTI); // preserve TOSCA } ! if (StackReservedPages > 0) { movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // testing if reserved zone needs to be re-enabled Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx); Label no_reserved_zone_enabling; NOT_LP64(get_thread(rthread);)
*** 1120,1129 **** --- 1119,1161 ---- InterpreterRuntime::throw_delayed_StackOverflowError)); should_not_reach_here(); bind(no_reserved_zone_enabling); } + + // remove activation + // get sender sp + movptr(rbx, + Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); + + if (state == atos && ValueTypeReturnedAsFields) { + Label skip; + // Test if the return type is a value type + movptr(rdi, Address(rbp, frame::interpreter_frame_method_offset * wordSize)); + movptr(rdi, Address(rdi, Method::const_offset())); + load_unsigned_byte(rdi, Address(rdi, ConstMethod::result_type_offset())); + cmpl(rdi, T_VALUETYPE); + jcc(Assembler::notEqual, skip); + + // 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 fields from a buffered value with a value class specific handler + load_klass(rdi, rax); + movptr(rdi, Address(rdi, InstanceKlass::adr_valueklass_fixed_block_offset())); + movptr(rdi, Address(rdi, ValueKlass::unpack_handler_offset())); + + testptr(rdi, rdi); + jcc(Assembler::equal, skip); + + call(rdi); + #endif + // call above kills the value in rbx. Reload it. + movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); + bind(skip); + } leave(); // remove frame anchor pop(ret_addr); // get return address mov(rsp, rbx); // set sp to sender sp }
*** 1182,1191 **** --- 1214,1227 ---- // Load immediate 1 into swap_reg %rax movl(swap_reg, (int32_t)1); // Load (object->mark() | 1) into swap_reg %rax orptr(swap_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes())); + if (EnableValhalla && !UseBiasedLocking) { + // For slow path is_always_locked, using biased, which is never natural for !UseBiasLocking + andptr(swap_reg, ~markOopDesc::biased_lock_bit_in_place); + } // Save (object->mark() | 1) into BasicLock's displaced header movptr(Address(lock_reg, mark_offset), swap_reg); assert(lock_offset == 0,
< prev index next >