aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoern Rennecke <joern.rennecke@embecosm.com>2013-04-08 15:42:10 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2013-04-08 16:42:10 +0100
commit105766f3920ecdf28d19e1a322b1a58ba2bebf85 (patch)
tree2114d1b3d8346955394529c27818c0943ca99378 /gcc
parent1006463067f23fcc6b189ed157ce7d60b71efede (diff)
downloadgcc-105766f3920ecdf28d19e1a322b1a58ba2bebf85.zip
gcc-105766f3920ecdf28d19e1a322b1a58ba2bebf85.tar.gz
gcc-105766f3920ecdf28d19e1a322b1a58ba2bebf85.tar.bz2
epiphany.md (GPR_1): New constant.
* config/epiphany/epiphany.md (GPR_1): New constant. (define_expand "mov<mode>cc): 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/epiphany/epiphany.c41
-rw-r--r--gcc/config/epiphany/epiphany.md3
3 files changed, 48 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ee7d9c..ce6e267 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2013-04-08 Joern Rennecke <joern.rennecke@embecosm.com>
+
+ * config/epiphany/epiphany.md (GPR_1): New constant.
+ (define_expand "mov<mode>cc): 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 <jakub@redhat.com>
PR c++/34949
diff --git a/gcc/config/epiphany/epiphany.c b/gcc/config/epiphany/epiphany.c
index 9fec199..1a0bfc3 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)
/* mov<mode>cc 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 8037277..d3ea98a 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>mode, code, cmp_in_mode, cmp_op0, cmp_op1);
+ if (!operands[1])
+ FAIL;
}
})