< prev index next >

src/cpu/ppc/vm/sharedRuntime_ppc.cpp

Print this page
rev 8107 : 8077838: Recent developments for ppc.

*** 1,8 **** /* ! * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2012, 2014 SAP AG. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,8 ---- /* ! * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2012, 2015 SAP AG. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 26,35 **** --- 26,36 ---- #include "precompiled.hpp" #include "asm/macroAssembler.inline.hpp" #include "code/debugInfoRec.hpp" #include "code/icBuffer.hpp" #include "code/vtableStubs.hpp" + #include "frame_ppc.hpp" #include "interpreter/interpreter.hpp" #include "interpreter/interp_masm.hpp" #include "oops/compiledICHolder.hpp" #include "prims/jvmtiRedefineClassesTrace.hpp" #include "runtime/sharedRuntime.hpp"
*** 192,203 **** RegisterSaver_LiveIntReg( R25 ), RegisterSaver_LiveIntReg( R26 ), RegisterSaver_LiveIntReg( R27 ), RegisterSaver_LiveIntReg( R28 ), RegisterSaver_LiveIntReg( R29 ), ! RegisterSaver_LiveIntReg( R31 ), ! RegisterSaver_LiveIntReg( R30 ), // r30 must be the last register }; OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, int* out_frame_size_in_bytes, bool generate_oop_map, --- 193,204 ---- RegisterSaver_LiveIntReg( R25 ), RegisterSaver_LiveIntReg( R26 ), RegisterSaver_LiveIntReg( R27 ), RegisterSaver_LiveIntReg( R28 ), RegisterSaver_LiveIntReg( R29 ), ! RegisterSaver_LiveIntReg( R30 ), ! RegisterSaver_LiveIntReg( R31 ), // must be the last register (see save/restore functions below) }; OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, int* out_frame_size_in_bytes, bool generate_oop_map,
*** 227,281 **** // OopMap frame size is in c2 stack slots (sizeof(jint)) not bytes or words. OopMap* map = generate_oop_map ? new OopMap(frame_size_in_slots, 0) : NULL; BLOCK_COMMENT("push_frame_reg_args_and_save_live_registers {"); ! // Save r30 in the last slot of the not yet pushed frame so that we // can use it as scratch reg. ! __ std(R30, -reg_size, R1_SP); assert(-reg_size == register_save_offset - frame_size_in_bytes + ((regstosave_num-1)*reg_size), "consistency check"); // save the flags // Do the save_LR_CR by hand and adjust the return pc if requested. ! __ mfcr(R30); ! __ std(R30, _abi(cr), R1_SP); switch (return_pc_location) { ! case return_pc_is_lr: __ mflr(R30); break; ! case return_pc_is_r4: __ mr(R30, R4); break; case return_pc_is_thread_saved_exception_pc: ! __ ld(R30, thread_(saved_exception_pc)); break; default: ShouldNotReachHere(); } ! if (return_pc_adjustment != 0) ! __ addi(R30, R30, return_pc_adjustment); ! __ std(R30, _abi(lr), R1_SP); // push a new frame ! __ push_frame(frame_size_in_bytes, R30); // save all registers (ints and floats) offset = register_save_offset; for (int i = 0; i < regstosave_num; i++) { int reg_num = RegisterSaver_LiveRegs[i].reg_num; int reg_type = RegisterSaver_LiveRegs[i].reg_type; switch (reg_type) { case RegisterSaver::int_reg: { ! if (reg_num != 30) { // We spilled R30 right at the beginning. __ std(as_Register(reg_num), offset, R1_SP); } break; } case RegisterSaver::float_reg: { __ stfd(as_FloatRegister(reg_num), offset, R1_SP); break; } case RegisterSaver::special_reg: { if (reg_num == SR_CTR_SpecialRegisterEnumValue) { ! __ mfctr(R30); ! __ std(R30, offset, R1_SP); } else { Unimplemented(); } break; } --- 228,283 ---- // OopMap frame size is in c2 stack slots (sizeof(jint)) not bytes or words. OopMap* map = generate_oop_map ? new OopMap(frame_size_in_slots, 0) : NULL; BLOCK_COMMENT("push_frame_reg_args_and_save_live_registers {"); ! // Save r31 in the last slot of the not yet pushed frame so that we // can use it as scratch reg. ! __ std(R31, -reg_size, R1_SP); assert(-reg_size == register_save_offset - frame_size_in_bytes + ((regstosave_num-1)*reg_size), "consistency check"); // save the flags // Do the save_LR_CR by hand and adjust the return pc if requested. ! __ mfcr(R31); ! __ std(R31, _abi(cr), R1_SP); switch (return_pc_location) { ! case return_pc_is_lr: __ mflr(R31); break; ! case return_pc_is_r4: __ mr(R31, R4); break; case return_pc_is_thread_saved_exception_pc: ! __ ld(R31, thread_(saved_exception_pc)); break; default: ShouldNotReachHere(); } ! if (return_pc_adjustment != 0) { ! __ addi(R31, R31, return_pc_adjustment); ! } ! __ std(R31, _abi(lr), R1_SP); // push a new frame ! __ push_frame(frame_size_in_bytes, R31); // save all registers (ints and floats) offset = register_save_offset; for (int i = 0; i < regstosave_num; i++) { int reg_num = RegisterSaver_LiveRegs[i].reg_num; int reg_type = RegisterSaver_LiveRegs[i].reg_type; switch (reg_type) { case RegisterSaver::int_reg: { ! if (reg_num != 31) { // We spilled R31 right at the beginning. __ std(as_Register(reg_num), offset, R1_SP); } break; } case RegisterSaver::float_reg: { __ stfd(as_FloatRegister(reg_num), offset, R1_SP); break; } case RegisterSaver::special_reg: { if (reg_num == SR_CTR_SpecialRegisterEnumValue) { ! __ mfctr(R31); ! __ std(R31, offset, R1_SP); } else { Unimplemented(); } break; }
*** 319,341 **** int reg_num = RegisterSaver_LiveRegs[i].reg_num; int reg_type = RegisterSaver_LiveRegs[i].reg_type; switch (reg_type) { case RegisterSaver::int_reg: { ! if (reg_num != 30) // R30 restored at the end, it's the tmp reg! __ ld(as_Register(reg_num), offset, R1_SP); break; } case RegisterSaver::float_reg: { __ lfd(as_FloatRegister(reg_num), offset, R1_SP); break; } case RegisterSaver::special_reg: { if (reg_num == SR_CTR_SpecialRegisterEnumValue) { if (restore_ctr) { // Nothing to do here if ctr already contains the next address. ! __ ld(R30, offset, R1_SP); ! __ mtctr(R30); } } else { Unimplemented(); } break; --- 321,343 ---- int reg_num = RegisterSaver_LiveRegs[i].reg_num; int reg_type = RegisterSaver_LiveRegs[i].reg_type; switch (reg_type) { case RegisterSaver::int_reg: { ! if (reg_num != 31) // R31 restored at the end, it's the tmp reg! __ ld(as_Register(reg_num), offset, R1_SP); break; } case RegisterSaver::float_reg: { __ lfd(as_FloatRegister(reg_num), offset, R1_SP); break; } case RegisterSaver::special_reg: { if (reg_num == SR_CTR_SpecialRegisterEnumValue) { if (restore_ctr) { // Nothing to do here if ctr already contains the next address. ! __ ld(R31, offset, R1_SP); ! __ mtctr(R31); } } else { Unimplemented(); } break;
*** 348,361 **** // pop the frame __ pop_frame(); // restore the flags ! __ restore_LR_CR(R30); // restore scratch register's value ! __ ld(R30, -reg_size, R1_SP); BLOCK_COMMENT("} restore_live_registers_and_pop_frame"); } void RegisterSaver::push_frame_and_save_argument_registers(MacroAssembler* masm, Register r_temp, --- 350,363 ---- // pop the frame __ pop_frame(); // restore the flags ! __ restore_LR_CR(R31); // restore scratch register's value ! __ ld(R31, -reg_size, R1_SP); BLOCK_COMMENT("} restore_live_registers_and_pop_frame"); } void RegisterSaver::push_frame_and_save_argument_registers(MacroAssembler* masm, Register r_temp,
*** 2019,2028 **** --- 2021,2032 ---- __ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame. __ mr(r_callers_sp, R1_SP); // Remember frame pointer. __ push_frame(frame_size_in_bytes, r_temp_1); // Push the c2n adapter's frame. frame_done_pc = (intptr_t)__ pc(); + __ verify_thread(); + // Native nmethod wrappers never take possesion of the oop arguments. // So the caller will gc the arguments. // The only thing we need an oopMap for is if the call is static. // // An OopMap for lock (and class if static), and one for the VM call itself.
*** 2592,2602 **** int Deoptimization::last_frame_adjust(int callee_parameters, int callee_locals) { return round_to((callee_locals - callee_parameters) * Interpreter::stackElementWords, frame::alignment_in_bytes); } uint SharedRuntime::out_preserve_stack_slots() { ! #ifdef COMPILER2 return frame::jit_out_preserve_size / VMRegImpl::stack_slot_size; #else return 0; #endif } --- 2596,2606 ---- int Deoptimization::last_frame_adjust(int callee_parameters, int callee_locals) { return round_to((callee_locals - callee_parameters) * Interpreter::stackElementWords, frame::alignment_in_bytes); } uint SharedRuntime::out_preserve_stack_slots() { ! #if defined(COMPILER1) || defined(COMPILER2) return frame::jit_out_preserve_size / VMRegImpl::stack_slot_size; #else return 0; #endif }
*** 2866,2880 **** __ li(R0, 0); __ std(R0, in_bytes(JavaThread::exception_pc_offset()), R16_thread); __ std(R0, in_bytes(JavaThread::exception_oop_offset()), R16_thread); __ BIND(skip_restore_excp); - // reload narrro_oop_base - if (UseCompressedOops && Universe::narrow_oop_base() != 0) { - __ load_const_optimized(R30, Universe::narrow_oop_base()); - } - __ pop_frame(); // stack: (deoptee, optional i2c, caller of deoptee, ...). // pop the deoptee's frame --- 2870,2879 ----
< prev index next >