From: Joern Rennecke Date: Mon, 8 Apr 2013 15:42:10 +0000 (+0000) Subject: epiphany.md (GPR_1): New constant. X-Git-Tag: releases/gcc-4.9.0~6616 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=105766f3920ecdf28d19e1a322b1a58ba2bebf85;p=thirdparty%2Fgcc.git epiphany.md (GPR_1): New constant. * config/epiphany/epiphany.md (GPR_1): New constant. (define_expand "movcc): FAIL if gen_compare_reg returned 0. * config/epiphany/epiphany.c (gen_compare_reg): For flag_finite_math_only, avoid swapping operands when r0 and/or r1 is already in place. Use GPR_0 / GPR_1 instead of 0/1 for r0/r1 register numbers. Don't require being called during rtl expansion; If y operlaps r0, return 0. (epiphany_compute_frame_size, epiphany_expand_prologue): Use GPR_1. (epiphany_expand_epilogue): Likewise. From-SVN: r197586 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ee7d9c2ef8f..ce6e2673f055 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2013-04-08 Joern Rennecke + + * config/epiphany/epiphany.md (GPR_1): New constant. + (define_expand "movcc): FAIL if gen_compare_reg returned 0. + * config/epiphany/epiphany.c (gen_compare_reg): + For flag_finite_math_only, avoid swapping operands when r0 and/or r1 + is already in place. + Use GPR_0 / GPR_1 instead of 0/1 for r0/r1 register numbers. + Don't require being called during rtl expansion; If y operlaps r0, + return 0. + (epiphany_compute_frame_size, epiphany_expand_prologue): Use GPR_1. + (epiphany_expand_epilogue): Likewise. + 2013-04-08 Jakub Jelinek PR c++/34949 diff --git a/gcc/config/epiphany/epiphany.c b/gcc/config/epiphany/epiphany.c index 9fec1991b246..1a0bfc30681c 100644 --- a/gcc/config/epiphany/epiphany.c +++ b/gcc/config/epiphany/epiphany.c @@ -537,24 +537,47 @@ gen_compare_reg (enum machine_mode cmode, enum rtx_code code, if (mode == CC_FP_GTEmode && (code == LE || code == LT || code == UNGT || code == UNGE)) { - rtx tmp = x; x = y; y = tmp; - code = swap_condition (code); + if (flag_finite_math_only + && ((REG_P (x) && REGNO (x) == GPR_0) + || (REG_P (y) && REGNO (y) == GPR_1))) + switch (code) + { + case LE: code = UNLE; break; + case LT: code = UNLT; break; + case UNGT: code = GT; break; + case UNGE: code = GE; break; + default: gcc_unreachable (); + } + else + { + rtx tmp = x; x = y; y = tmp; + code = swap_condition (code); + } } cc_reg = gen_rtx_REG (mode, CC_REGNUM); } if ((mode == CC_FP_EQmode || mode == CC_FP_GTEmode || mode == CC_FP_ORDmode || mode == CC_FP_UNEQmode) /* movcc might want to re-emit a comparison during ifcvt. */ - && (!REG_P (x) || REGNO (x) != 0 || !REG_P (y) || REGNO (y) != 1)) + && (!REG_P (x) || REGNO (x) != GPR_0 + || !REG_P (y) || REGNO (y) != GPR_1)) { rtx reg; +#if 0 + /* ??? We should really do the r0/r1 clobber only during rtl expansion, + but just like the flag clobber of movsicc, we have to allow + this for ifcvt to work, on the assumption that we'll only want + to do this if these registers have been used before by the + pre-ifcvt code. */ gcc_assert (currently_expanding_to_rtl); - reg = gen_rtx_REG (in_mode, 0); - gcc_assert (!reg_overlap_mentioned_p (reg, y)); +#endif + reg = gen_rtx_REG (in_mode, GPR_0); + if (reg_overlap_mentioned_p (reg, y)) + return 0; emit_move_insn (reg, x); x = reg; - reg = gen_rtx_REG (in_mode, 1); + reg = gen_rtx_REG (in_mode, GPR_1); emit_move_insn (reg, y); y = reg; } @@ -1020,7 +1043,7 @@ epiphany_compute_frame_size (int size /* # of var. bytes allocated. */) first_slot = regno; else if (last_slot < 0 && (first_slot ^ regno) != 1 - && (!interrupt_p || regno > GPR_0 + 1)) + && (!interrupt_p || regno > GPR_1)) last_slot = regno; } } @@ -1665,7 +1688,7 @@ epiphany_expand_prologue (void) gen_rtx_REG (DImode, GPR_0)); frame_move_insn (gen_rtx_REG (SImode, GPR_0), gen_rtx_REG (word_mode, STATUS_REGNUM)); - frame_move_insn (gen_rtx_REG (SImode, GPR_0+1), + frame_move_insn (gen_rtx_REG (SImode, GPR_1), gen_rtx_REG (word_mode, IRET_REGNUM)); mem = gen_frame_mem (BLKmode, stack_pointer_rtx); off = GEN_INT (-current_frame_info.first_slot_offset); @@ -1841,7 +1864,7 @@ epiphany_expand_epilogue (int sibcall_p) emit_move_insn (gen_rtx_REG (word_mode, STATUS_REGNUM), gen_rtx_REG (SImode, GPR_0)); emit_move_insn (gen_rtx_REG (word_mode, IRET_REGNUM), - gen_rtx_REG (SImode, GPR_0+1)); + gen_rtx_REG (SImode, GPR_1)); addr = plus_constant (Pmode, stack_pointer_rtx, - (HOST_WIDE_INT) 2 * UNITS_PER_WORD); emit_move_insn (gen_rtx_REG (DImode, GPR_0), diff --git a/gcc/config/epiphany/epiphany.md b/gcc/config/epiphany/epiphany.md index 80372771d31d..d3ea98a01fbe 100644 --- a/gcc/config/epiphany/epiphany.md +++ b/gcc/config/epiphany/epiphany.md @@ -22,6 +22,7 @@ (define_constants [(GPR_0 0) + (GPR_1 1) (GPR_FP 11) (GPR_IP 12) (GPR_SP 13) @@ -1820,6 +1821,8 @@ operations - if we get some. */ operands[1] = gen_compare_reg (mode, code, cmp_in_mode, cmp_op0, cmp_op1); + if (!operands[1]) + FAIL; } })