/* Support function to determine the return address of the function 'count' frames back up the stack. */ rtx lm32_return_addr_rtx (int count, rtx frame) { rtx r; if (count == 0) { if (!df_regs_ever_live_p (RA_REGNUM)) r = gen_rtx_REG (Pmode, RA_REGNUM); else { r = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, frame, GEN_INT (-2 * UNITS_PER_WORD))); set_mem_alias_set (r, get_frame_alias_set ()); } } else if (flag_omit_frame_pointer) r = NULL_RTX; else { r = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, frame, GEN_INT (-2 * UNITS_PER_WORD))); set_mem_alias_set (r, get_frame_alias_set ()); } return r; }
/* Support function to determine the return address of the function 'count' frames back up the stack. */ rtx lm32_return_addr_rtx (int count, rtx frame) { rtx r; if (count == 0) { /* *mjs* This test originally used leaf_function_p (), we now use the regs_ever_live test which I *think* is more accurate. */ if (!df_regs_ever_live_p(RA_REGNUM)) { r = gen_rtx_REG (Pmode, RA_REGNUM); } else { r = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, frame, GEN_INT(- 2 * UNITS_PER_WORD))); set_mem_alias_set (r, get_frame_alias_set ()); } } else if (flag_omit_frame_pointer) r = NULL_RTX; else { r = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, frame, GEN_INT(- 2 * UNITS_PER_WORD))); set_mem_alias_set (r, get_frame_alias_set ()); } return r; }
void emit_push_insn () { set_mem_alias_set (); }
void merge_memattrs (rtx x, rtx y) { int i; int j; enum rtx_code code; const char *fmt; if (x == y) return; if (x == 0 || y == 0) return; code = GET_CODE (x); if (code != GET_CODE (y)) return; if (GET_MODE (x) != GET_MODE (y)) return; if (code == MEM && MEM_ATTRS (x) != MEM_ATTRS (y)) { if (! MEM_ATTRS (x)) MEM_ATTRS (y) = 0; else if (! MEM_ATTRS (y)) MEM_ATTRS (x) = 0; else { rtx mem_size; if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y)) { set_mem_alias_set (x, 0); set_mem_alias_set (y, 0); } if (! mem_expr_equal_p (MEM_EXPR (x), MEM_EXPR (y))) { set_mem_expr (x, 0); set_mem_expr (y, 0); set_mem_offset (x, 0); set_mem_offset (y, 0); } else if (MEM_OFFSET (x) != MEM_OFFSET (y)) { set_mem_offset (x, 0); set_mem_offset (y, 0); } if (!MEM_SIZE (x)) mem_size = NULL_RTX; else if (!MEM_SIZE (y)) mem_size = NULL_RTX; else mem_size = GEN_INT (MAX (INTVAL (MEM_SIZE (x)), INTVAL (MEM_SIZE (y)))); set_mem_size (x, mem_size); set_mem_size (y, mem_size); set_mem_align (x, MIN (MEM_ALIGN (x), MEM_ALIGN (y))); set_mem_align (y, MEM_ALIGN (x)); } } fmt = GET_RTX_FORMAT (code); for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) { switch (fmt[i]) { case 'E': /* Two vectors must have the same length. */ if (XVECLEN (x, i) != XVECLEN (y, i)) return; for (j = 0; j < XVECLEN (x, i); j++) merge_memattrs (XVECEXP (x, i, j), XVECEXP (y, i, j)); break; case 'e': merge_memattrs (XEXP (x, i), XEXP (y, i)); } } return; }