< prev index next >

src/cpu/s390/vm/macroAssembler_s390.cpp

Print this page

        

*** 2020,2041 **** z_sgr(Z_SP, offset); z_stg(fp, _z_abi(callers_sp), Z_SP); } ! // Resize_frame with SP(new) = [addr]. ! void MacroAssembler::resize_frame_absolute(Register addr, Register fp, bool load_fp) { ! assert_different_registers(addr, fp, Z_SP); ! if (load_fp) { z_lg(fp, _z_abi(callers_sp), Z_SP); } ! ! if (addr != Z_R0) { ! // Minimize stalls by not using Z_SP immediately after update. ! z_stg(fp, _z_abi(callers_sp), addr); ! z_lgr(Z_SP, addr); } else { ! z_lgr(Z_SP, addr); z_stg(fp, _z_abi(callers_sp), Z_SP); } } // Resize_frame with SP(new) = SP(old) + offset. void MacroAssembler::resize_frame(RegisterOrConstant offset, Register fp, bool load_fp) { --- 2020,2077 ---- z_sgr(Z_SP, offset); z_stg(fp, _z_abi(callers_sp), Z_SP); } ! // Resize_frame with SP(new) = [newSP] + offset. ! // This emitter is useful if we already have calculated a pointer ! // into the to-be-allocated stack space, e.g. with special alignment properties, ! // but need some additional space, e.g. for spilling. ! // newSP is the pre-calculated pointer. It must not be modified. ! // fp holds, or is filled with, the frame pointer. ! // offset is the additional increment which is added to addr to form the new SP. ! // Note: specify a negative value to reserve more space! ! // load_fp == true only indicates that fp is not pre-filled with the frame pointer. ! // It does not guarantee that fp contains the frame pointer at the end. ! void MacroAssembler::resize_frame_abs_with_offset(Register newSP, Register fp, int offset, bool load_fp) { ! assert_different_registers(newSP, fp, Z_SP); ! ! if (load_fp) { ! z_lg(fp, _z_abi(callers_sp), Z_SP); ! } ! ! if (newSP == Z_R0) { ! add2reg(Z_SP, offset, newSP); ! z_stg(fp, _z_abi(callers_sp), Z_SP); ! } else { ! z_stg(fp, _z_abi(callers_sp)+offset, newSP); ! add2reg(Z_SP, offset, newSP); ! } ! } ! ! // Resize_frame with SP(new) = [newSP]. ! // load_fp == true only indicates that fp is not pre-filled with the frame pointer. ! // It does not guarantee that fp contains the frame pointer at the end. ! void MacroAssembler::resize_frame_absolute(Register newSP, Register fp, bool load_fp) { ! assert_different_registers(newSP, fp, Z_SP); ! ! if (load_fp) { ! if (newSP == Z_R0) { ! z_lg(fp, _z_abi(callers_sp), Z_SP); // need to use load/store. } else { ! DEBUG_ONLY(z_lghi(fp, -1);) // safety net ! z_mvc(_z_abi(callers_sp), sizeof(void*)-1, newSP, _z_abi(callers_sp), Z_SP); ! } ! } ! ! z_lgr(Z_SP, newSP); ! if (newSP == Z_R0) { z_stg(fp, _z_abi(callers_sp), Z_SP); + } else { + if (!load_fp) { + z_stg(fp, _z_abi(callers_sp), newSP); + } } } // Resize_frame with SP(new) = SP(old) + offset. void MacroAssembler::resize_frame(RegisterOrConstant offset, Register fp, bool load_fp) {
< prev index next >