1472N/A * or visit www.oracle.com if you need additional information or have any
1879N/A#include "precompiled.hpp"
1879N/A#include "asm/assembler.hpp"
1879N/A#include "assembler_x86.inline.hpp"
1879N/A#include "code/debugInfoRec.hpp"
1879N/A#include "code/icBuffer.hpp"
1879N/A#include "code/vtableStubs.hpp"
1879N/A#include "interpreter/interpreter.hpp"
1879N/A#include "oops/compiledICHolderOop.hpp"
1879N/A#include "prims/jvmtiRedefineClassesTrace.hpp"
1879N/A#include "runtime/sharedRuntime.hpp"
1879N/A#include "runtime/vframeArray.hpp"
1879N/A#include "vmreg_x86.inline.hpp"
1879N/A#include "c1/c1_Runtime1.hpp"
1879N/A#include "opto/runtime.hpp"
4012N/A#define DEF_XMM_OFFS(regnum) xmm ## regnum ## _off = xmm_off + (regnum)*16/BytesPerInt, xmm ## regnum ## H_off
4012N/A if (save_vectors) {
0N/A if (verify_fpu) {
0N/A if (!verify_fpu) {
4012N/A if (vect_words > 0) {
4012N/A if (restore_vectors) {
4012N/A if (restore_vectors) {
0N/A return (r->reg2stack() + SharedRuntime::out_preserve_stack_slots()) * VMRegImpl::stack_slot_size;
0N/A int total_args_passed,
0N/A int is_outgoing) {
0N/A for( i = 0; i < total_args_passed; i++) {
0N/A for( i = 0; i < total_args_passed; i++) {
0N/A int total_args_passed,
0N/A int comp_args_on_stack,
0N/A for (int i = 0; i < total_args_passed; i++) {
0N/Astatic void move_i2c_double(MacroAssembler *masm, XMMRegister r, Register saved_sp, int ld_off) {
0N/A int total_args_passed,
0N/A int comp_args_on_stack,
3932N/A if (VerifyAdapterCalls &&
0N/A if (comp_args_on_stack) {
0N/A for (int i = 0; i < total_args_passed; i++) {
0N/A int total_args_passed,
0N/A int comp_args_on_stack,
1187N/A return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
0N/A int total_args_passed) {
0N/A for( int i = 0; i < total_args_passed; i++) {
0N/A int oop_handle_offset,
0N/A int framesize_in_slots,
0N/A bool is_receiver,
0N/A int* receiver_offset) {
0N/A int offset_in_older_frame = src.first()->reg2stack() + SharedRuntime::out_preserve_stack_slots();
0N/A if (is_receiver) {
0N/A if (is_receiver) {
0N/A assert(dst.first()->is_stack() && ( src.first()->is_stack() || src.first()->is_XMMRegister()), "bad parameters");
0N/A assert(dst.first()->is_stack() && (src.first()->is_XMMRegister() || src.first()->is_stack()), "bad args");
0N/Avoid SharedRuntime::save_native_result(MacroAssembler *masm, BasicType ret_type, int frame_slots) {
0N/Avoid SharedRuntime::restore_native_result(MacroAssembler *masm, BasicType ret_type, int frame_slots) {
3158N/A const int stack_slots,
3158N/A const int total_in_args,
3158N/A const int arg_save_area,
3158N/A for ( int i = 0; i < total_in_args; i++) {
3158N/A for ( int i = 0; i < total_in_args; i++) {
3158N/A default: ShouldNotReachHere();
3158N/A int offset_in_older_frame = in_regs[i].first()->reg2stack() + SharedRuntime::out_preserve_stack_slots();
3158N/A int stack_slots,
3158N/A int total_c_args,
3158N/A int total_in_args,
3158N/A int arg_save_area,
3158N/A if (StressCriticalJNINatives) {
3158N/Astatic void unpack_array_argument(MacroAssembler* masm, VMRegPair reg, BasicType in_elem_type, VMRegPair body_arg, VMRegPair length_arg) {
3158N/A __ lea(tmp_reg, Address(reg.first()->as_Register(), arrayOopDesc::base_offset_in_bytes(in_elem_type)));
3932N/A if (VerifyOops) {
3932N/A has_receiver = true;
3932N/A __ movptr(member_reg, Address(rsp, r->reg2stack() * VMRegImpl::stack_slot_size + wordSize));
3932N/A if (has_receiver) {
3932N/A __ movptr(receiver_reg, Address(rsp, r->reg2stack() * VMRegImpl::stack_slot_size + wordSize));
3158N/A// lock_critical/unlock_critical semantics are followed. Some other
2252N/A int compile_id,
3932N/A int stack_slots = SharedRuntime::out_preserve_stack_slots(); // no out slots at all, actually
3158N/A is_critical_native = false;
3158N/A if (!is_critical_native) {
3158N/A for (int i = 0; i < total_in_args; i++) {
3158N/A if (!is_critical_native) {
3158N/A for (int i = 0; i < total_in_args ; i++ ) {
3158N/A for (int i = 0; i < total_in_args ; i++ ) {
3158N/A default: ShouldNotReachHere();
3158N/A if (is_critical_native) {
3158N/A for ( int i = 0; i < total_in_args; i++) {
3158N/A default: ShouldNotReachHere();
3158N/A default: ShouldNotReachHere();
3158N/A if (double_slots != 0) {
0N/A if (UseBiasedLocking) {
0N/A if (UseStackBanging) {
3158N/A if (is_critical_native) {
0N/A // map->set_callee_saved(VMRegImpl::stack2reg( stack_slots - 2), stack_slots * 2, 0, rbp->as_VMReg());
3158N/A if (is_critical_native) {
3158N/A unpack_array_argument(masm, in_regs[i], in_elem_bt[i], out_regs[c_arg + 1], out_regs[c_arg]);
0N/A __ movoop(oop_handle_reg, JNIHandles::make_local(Klass::cast(method->method_holder())->java_mirror()));
0N/A if (UseBiasedLocking) {
0N/A __ biased_locking_enter(lock_reg, obj_reg, swap_reg, oop_handle_reg, false, lock_done, &slow_path_lock);
0N/A if (UseBiasedLocking) {
3158N/A if (!is_critical_native) {
0N/A default : ShouldNotReachHere();
0N/A if (AlwaysRestoreFPU) {
3158N/A if (!is_critical_native) {
3158N/A if (is_critical_native) {
0N/A __ cmpl(Address(thread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_yellow_disabled);
0N/A if (UseBiasedLocking) {
3158N/A if (!is_critical_native) {
3158N/A __ cmpptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD);
0N/A __ verify_FPU(ret_type == T_FLOAT || ret_type == T_DOUBLE ? 1 : 0, "native_wrapper normal exit");
0N/A __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_unlocking_C)));
304N/A __ cmpptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD);
3158N/A if (!is_critical_native) {
3158N/A if (is_critical_native) {
116N/A#ifdef HAVE_DTRACE_H
116N/A for (i = 0; i < total_strings ; i++) {
116N/A if (UseStackBanging) {
116N/A if (string_reg++ != 0) {
926N/A map = RegisterSaver::save_live_registers(masm, additional_words, &frame_size_in_words, false);
926N/A (void) RegisterSaver::save_live_registers(masm, additional_words, &frame_size_in_words, false);
926N/A (void) RegisterSaver::save_live_registers(masm, additional_words, &frame_size_in_words, false);
0N/A // 3: caller of deopting frame (could be compiled/interpreted).
304N/A __ addptr(rsp, Address(rdi,Deoptimization::UnrollBlock::size_of_deoptimized_frame_offset_in_bytes()));
0N/A if (UseStackBanging) {
304N/A __ movl2ptr(rbx, Address(rdi, Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes()));
304N/A __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable
0N/A __ fstp_d(Address(rsp, RegisterSaver::fpResultOffset()*wordSize)); // Pop float stack and store in local
0N/A if( UseSSE>=1 ) __ movflt(xmm0, Address(rsp, (RegisterSaver::xmm0Offset() + additional_words + 1)*wordSize));
0N/A else __ fld_d(Address(rsp, (RegisterSaver::fpResultOffset() + additional_words + 1)*wordSize));
0N/A if( UseSSE>=2 ) __ movdbl(xmm0, Address(rsp, (RegisterSaver::xmm0Offset() + additional_words + 1)*wordSize));
0N/A else __ fld_d(Address(rsp, (RegisterSaver::fpResultOffset() + additional_words + 1)*wordSize));
0N/A _deopt_blob = DeoptimizationBlob::create( &buffer, oop_maps, 0, exception_offset, reexecute_offset, frame_size_in_words);
0N/A // 3: caller of deopting frame (could be compiled/interpreted).
304N/A __ movl2ptr(rcx, Address(rdi,Deoptimization::UnrollBlock::size_of_deoptimized_frame_offset_in_bytes()));
0N/A if (UseStackBanging) {
304N/A __ movl(rbx, Address(rdi, Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes()));
304N/A __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable
4012N/A if (!cause_return)
4012N/A map = RegisterSaver::save_live_registers(masm, additional_words, &frame_size_in_words, false, save_vectors);
4012N/A if (!cause_return) {