diff options
author | DJ Delorie <dj@redhat.com> | 2008-12-02 06:35:06 -0500 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 2008-12-02 11:35:06 +0000 |
commit | b72bbbcb08f999e3216f1a9bf3f82d7e72eb7123 (patch) | |
tree | aa52c3c0716f7cab3e28477618abe3b96e592892 /gcc | |
parent | 95e5f0ce004baee612104311868171e748dfc43c (diff) | |
download | gcc-b72bbbcb08f999e3216f1a9bf3f82d7e72eb7123.zip gcc-b72bbbcb08f999e3216f1a9bf3f82d7e72eb7123.tar.gz gcc-b72bbbcb08f999e3216f1a9bf3f82d7e72eb7123.tar.bz2 |
stormy16.h (INCOMING_FRAME_SP_OFFSET): Negate.
* config/stormy16/stormy16.h (INCOMING_FRAME_SP_OFFSET): Negate.
(DWARF_CIE_DATA_ALIGNMENT): Define.
* config/stormy16/stormy16.c (xstormy16_compute_stack_layout):
Invert add/sub for INCOMING_FRAME_SP_OFFSET.
(xstormy16_expand_prologue): Likewise.
(xstormy16_expand_builtin_va_start): Likewise.
(xstormy16_gimplify_va_arg_expr): Likewise.
From-SVN: r142350
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/stormy16/stormy16.c | 72 | ||||
-rw-r--r-- | gcc/config/stormy16/stormy16.h | 5 | ||||
-rw-r--r-- | gcc/config/stormy16/stormy16.md | 16 |
4 files changed, 45 insertions, 59 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 928a0aa..56cfc1b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2008-12-02 DJ Delorie <dj@redhat.com> + + * config/stormy16/stormy16.h (INCOMING_FRAME_SP_OFFSET): Negate. + (DWARF_CIE_DATA_ALIGNMENT): Define. + + * config/stormy16/stormy16.c (xstormy16_compute_stack_layout): + Invert add/sub for INCOMING_FRAME_SP_OFFSET. + (xstormy16_expand_prologue): Likewise. + (xstormy16_expand_builtin_va_start): Likewise. + (xstormy16_gimplify_va_arg_expr): Likewise. + 2008-12-02 Jakub Jelinek <jakub@redhat.com> PR middle-end/38343 diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c index 713ae40..24c10ea 100644 --- a/gcc/config/stormy16/stormy16.c +++ b/gcc/config/stormy16/stormy16.c @@ -214,7 +214,7 @@ xstormy16_emit_cbranch (enum rtx_code code, rtx loc) gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx, loc_ref, pc_rtx)); - cy_clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, 16)); + cy_clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, CARRY_REGNUM)); if (mode == HImode) vec = gen_rtvec (2, branch, cy_clobber); @@ -895,7 +895,7 @@ xstormy16_expand_move (enum machine_mode mode, rtx dest, rtx src) rtx dest_reg = XEXP (pmv, 0); rtx dest_mod = XEXP (pmv, 1); rtx set = gen_rtx_SET (Pmode, dest_reg, dest_mod); - rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, 16)); + rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, CARRY_REGNUM)); dest = gen_rtx_MEM (mode, dest_reg); emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber))); @@ -906,7 +906,7 @@ xstormy16_expand_move (enum machine_mode mode, rtx dest, rtx src) rtx src_reg = XEXP (pmv, 0); rtx src_mod = XEXP (pmv, 1); rtx set = gen_rtx_SET (Pmode, src_reg, src_mod); - rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, 16)); + rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, CARRY_REGNUM)); src = gen_rtx_MEM (mode, src_reg); emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber))); @@ -1002,17 +1002,17 @@ xstormy16_compute_stack_layout (void) if (crtl->args.size <= 2048 && crtl->args.size != -1) { - if (layout.frame_size + INCOMING_FRAME_SP_OFFSET + if (layout.frame_size - INCOMING_FRAME_SP_OFFSET + crtl->args.size <= 2048) - layout.fp_minus_ap = layout.frame_size + INCOMING_FRAME_SP_OFFSET; + layout.fp_minus_ap = layout.frame_size - INCOMING_FRAME_SP_OFFSET; else layout.fp_minus_ap = 2048 - crtl->args.size; } else layout.fp_minus_ap = (layout.stdarg_save_size + layout.register_save_size - + INCOMING_FRAME_SP_OFFSET); - layout.sp_minus_fp = (layout.frame_size + INCOMING_FRAME_SP_OFFSET + - INCOMING_FRAME_SP_OFFSET); + layout.sp_minus_fp = (layout.frame_size - INCOMING_FRAME_SP_OFFSET - layout.fp_minus_ap); layout.first_local_minus_ap = layout.sp_minus_fp - layout.locals_size; return layout; @@ -1030,11 +1030,11 @@ xstormy16_initial_elimination_offset (int from, int to) if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM) result = layout.sp_minus_fp - layout.locals_size; else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM) - result = -layout.locals_size; + result = - layout.locals_size; else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM) - result = -layout.fp_minus_ap; + result = - layout.fp_minus_ap; else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM) - result = -(layout.sp_minus_fp + layout.fp_minus_ap); + result = - (layout.sp_minus_fp + layout.fp_minus_ap); else gcc_unreachable (); @@ -1047,7 +1047,7 @@ emit_addhi3_postreload (rtx dest, rtx src0, rtx src1) rtx set, clobber, insn; set = gen_rtx_SET (VOIDmode, dest, gen_rtx_PLUS (HImode, src0, src1)); - clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, 16)); + clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, CARRY_REGNUM)); insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber))); return insn; } @@ -1134,7 +1134,10 @@ xstormy16_expand_prologue (void) /* It's just possible that the SP here might be what we need for the new FP... */ if (frame_pointer_needed && layout.sp_minus_fp == layout.locals_size) - emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx); + { + insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx); + RTX_FRAME_RELATED_P (insn) = 1; + } /* Allocate space for local variables. */ if (layout.locals_size) @@ -1148,11 +1151,15 @@ xstormy16_expand_prologue (void) if (frame_pointer_needed && layout.sp_minus_fp != layout.locals_size) { insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx); + RTX_FRAME_RELATED_P (insn) = 1; if (layout.sp_minus_fp) - emit_addhi3_postreload (hard_frame_pointer_rtx, - hard_frame_pointer_rtx, - GEN_INT (-layout.sp_minus_fp)); + { + insn = emit_addhi3_postreload (hard_frame_pointer_rtx, + hard_frame_pointer_rtx, + GEN_INT (- layout.sp_minus_fp)); + RTX_FRAME_RELATED_P (insn) = 1; + } } } @@ -1191,36 +1198,19 @@ xstormy16_expand_epilogue (void) if (frame_pointer_needed && layout.sp_minus_fp == layout.locals_size) emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx); else - { - insn = emit_addhi3_postreload (stack_pointer_rtx, stack_pointer_rtx, - GEN_INT (- layout.locals_size)); - RTX_FRAME_RELATED_P (insn) = 1; - } + emit_addhi3_postreload (stack_pointer_rtx, stack_pointer_rtx, + GEN_INT (- layout.locals_size)); } /* Restore any call-saved registers. */ for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno--) if (REG_NEEDS_SAVE (regno, ifun)) - { - rtx dwarf; - - insn = emit_move_insn (gen_rtx_REG (HImode, regno), mem_pop_rtx); - RTX_FRAME_RELATED_P (insn) = 1; - dwarf = gen_rtx_SET (Pmode, stack_pointer_rtx, - plus_constant (stack_pointer_rtx, - -GET_MODE_SIZE (Pmode))); - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, - dwarf, - REG_NOTES (insn)); - } + emit_move_insn (gen_rtx_REG (HImode, regno), mem_pop_rtx); /* Pop the stack for the stdarg save area. */ if (layout.stdarg_save_size) - { - insn = emit_addhi3_postreload (stack_pointer_rtx, stack_pointer_rtx, - GEN_INT (- layout.stdarg_save_size)); - RTX_FRAME_RELATED_P (insn) = 1; - } + emit_addhi3_postreload (stack_pointer_rtx, stack_pointer_rtx, + GEN_INT (- layout.stdarg_save_size)); /* Return. */ if (ifun) @@ -1342,7 +1332,7 @@ xstormy16_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) NULL_TREE); t = make_tree (TREE_TYPE (base), virtual_incoming_args_rtx); - u = build_int_cst (NULL_TREE, INCOMING_FRAME_SP_OFFSET); + u = build_int_cst (NULL_TREE, - INCOMING_FRAME_SP_OFFSET); u = fold_convert (TREE_TYPE (count), u); t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (base), t, u); t = build2 (MODIFY_EXPR, TREE_TYPE (base), base, t); @@ -1430,7 +1420,7 @@ xstormy16_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, } t = size_int (NUM_ARGUMENT_REGISTERS * UNITS_PER_WORD - - INCOMING_FRAME_SP_OFFSET); + + INCOMING_FRAME_SP_OFFSET); t = fold_convert (TREE_TYPE (count), t); t = build2 (MINUS_EXPR, TREE_TYPE (count), count_tmp, t); t = build2 (PLUS_EXPR, TREE_TYPE (count), t, @@ -2007,10 +1997,10 @@ xstormy16_expand_arith (enum machine_mode mode, enum rtx_code code, rtx branch, sub, clobber, sub_1; sub_1 = gen_rtx_MINUS (HImode, w_src0, - gen_rtx_ZERO_EXTEND (HImode, gen_rtx_REG (BImode, 16))); + gen_rtx_ZERO_EXTEND (HImode, gen_rtx_REG (BImode, CARRY_REGNUM))); sub = gen_rtx_SET (VOIDmode, w_dest, gen_rtx_MINUS (HImode, sub_1, w_src1)); - clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, 16)); + clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, CARRY_REGNUM)); branch = gen_rtx_SET (VOIDmode, pc_rtx, gen_rtx_IF_THEN_ELSE (VOIDmode, gen_rtx_EQ (HImode, diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h index 973726e..2a73381 100644 --- a/gcc/config/stormy16/stormy16.h +++ b/gcc/config/stormy16/stormy16.h @@ -352,7 +352,7 @@ enum reg_class #define INCOMING_RETURN_ADDR_RTX \ gen_rtx_MEM (SImode, gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-4))) -#define INCOMING_FRAME_SP_OFFSET (xstormy16_interrupt_function_p () ? 6 : 4) +#define INCOMING_FRAME_SP_OFFSET (xstormy16_interrupt_function_p () ? -6 : -4) /* Register That Address the Stack Frame. */ @@ -730,7 +730,8 @@ do { \ /* Assembler Commands for Exception Regions. */ -#define DWARF2_UNWIND_INFO 0 +#define DWARF2_UNWIND_INFO 0 +#define DWARF_CIE_DATA_ALIGNMENT 1 /* Don't use __builtin_setjmp for unwinding, since it's tricky to get at the high 16 bits of an address. */ diff --git a/gcc/config/stormy16/stormy16.md b/gcc/config/stormy16/stormy16.md index c16a8c3..b42245b 100644 --- a/gcc/config/stormy16/stormy16.md +++ b/gcc/config/stormy16/stormy16.md @@ -332,22 +332,6 @@ add %0,%2" [(set_attr "length" "2,2,0,2,2,2,2,4")]) -;; ; Reload can generate addition operations. The SECONDARY_RELOAD_CLASS -;; ; macro causes it to allocate the carry register; this pattern -;; ; shows it how to place the register in RTL to make the addition work. -;; (define_expand "reload_inhi" -;; [(parallel [(set (match_operand:HI 0 "register_operand" "=r") -;; (match_operand:HI 1 "xstormy16_carry_plus_operand" "")) -;; (clobber (reg:BI CARRY_REG))])] -;; "" -;; "if (! rtx_equal_p (operands[0], XEXP (operands[1], 0))) -;; { -;; emit_insn (gen_rtx_SET (VOIDmode, operands[0], XEXP (operands[1], 0))); -;; operands[1] = gen_rtx_PLUS (GET_MODE (operands[1]), operands[0], -;; XEXP (operands[1], 1)); -;; } -;; ") - (define_insn "addchi4" [(set (match_operand:HI 0 "register_operand" "=T,r,r") (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0") |