< prev index next >

src/cpu/s390/vm/macroAssembler_s390.hpp

Print this page

        

*** 438,450 **** address get_PC(Register result); // Get current PC + offset. Offset given in bytes, must be even! address get_PC(Register result, int64_t offset); // Resize current frame either relatively wrt to current SP or absolute. void resize_frame_sub(Register offset, Register fp, bool load_fp=true); ! void resize_frame_absolute(Register addr, Register fp, bool load_fp=true); void resize_frame(RegisterOrConstant offset, Register fp, bool load_fp=true); // Push a frame of size bytes, if copy_sp is false, old_sp must already // contain a copy of Z_SP. void push_frame(Register bytes, Register old_sp, bool copy_sp = true, bool bytes_with_inverted_sign = false); --- 438,462 ---- address get_PC(Register result); // Get current PC + offset. Offset given in bytes, must be even! address get_PC(Register result, int64_t offset); + // Accessing, and in particular modifying, a stack location is only safe if + // the stack pointer (Z_SP) is set such that the accessed stack location is + // in the reserved range. + // + // From a performance point of view, it is desirable not to change the SP + // first and then immediately use it to access the freshly reserved space. + // That opens a small gap, though. If, just after storing some value (the + // frame pointer) into the to-be-reserved space, an interrupt is caught, + // the handler might use the space beyond Z_SP for it's own purpose. + // If that happens, the stored value might get altered. + // Resize current frame either relatively wrt to current SP or absolute. void resize_frame_sub(Register offset, Register fp, bool load_fp=true); ! void resize_frame_abs_with_offset(Register newSP, Register fp, int offset, bool load_fp); ! void resize_frame_absolute(Register newSP, Register fp, bool load_fp); void resize_frame(RegisterOrConstant offset, Register fp, bool load_fp=true); // Push a frame of size bytes, if copy_sp is false, old_sp must already // contain a copy of Z_SP. void push_frame(Register bytes, Register old_sp, bool copy_sp = true, bool bytes_with_inverted_sign = false);
*** 459,468 **** --- 471,482 ---- // Push a frame of size `bytes' with abi160 on top. unsigned int push_frame_abi160(unsigned int bytes); // Pop current C frame. void pop_frame(); + // Pop current C frame and restore return PC register (Z_R14). + void pop_frame_restore_retPC(int frame_size_in_bytes); // // Calls //
< prev index next >