summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/genconfig.c18
-rw-r--r--gcc/simplify-rtx.c2
3 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index af05c98c98e..1aec9adcc95 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2014-07-02 Segher Boessenkool <segher@kernel.crashing.org>
+
+ * genconfig.c (have_rotate_flag, have_rotatert_flag): New variables.
+ (walk_insn_part) <ROTATE, ROTATERT>: New cases.
+ (main): Conditionally write HAVE_rotate resp. HAVE_rotatert.
+ * simplify-rtx.c (simplify_binary_operation_1) <ROTATE, ROTATERT>:
+ Only do the transformation if both HAVE_rotate and HAVE_rotatert.
+
2014-07-02 Christian Bruel <christian.bruel@st.com>
PR target/29349
diff --git a/gcc/genconfig.c b/gcc/genconfig.c
index cafa8d3040a..d1996c3af5d 100644
--- a/gcc/genconfig.c
+++ b/gcc/genconfig.c
@@ -36,6 +36,8 @@ static int have_cc0_flag;
static int have_cmove_flag;
static int have_cond_exec_flag;
static int have_lo_sum_flag;
+static int have_rotate_flag;
+static int have_rotatert_flag;
static int have_peephole_flag;
static int have_peephole2_flag;
@@ -117,6 +119,16 @@ walk_insn_part (rtx part, int recog_p, int non_pc_set_src)
have_lo_sum_flag = 1;
return;
+ case ROTATE:
+ if (recog_p)
+ have_rotate_flag = 1;
+ return;
+
+ case ROTATERT:
+ if (recog_p)
+ have_rotatert_flag = 1;
+ return;
+
case SET:
walk_insn_part (SET_DEST (part), 0, recog_p);
walk_insn_part (SET_SRC (part), recog_p,
@@ -346,6 +358,12 @@ main (int argc, char **argv)
if (have_lo_sum_flag)
printf ("#define HAVE_lo_sum 1\n");
+ if (have_rotate_flag)
+ printf ("#define HAVE_rotate 1\n");
+
+ if (have_rotatert_flag)
+ printf ("#define HAVE_rotatert 1\n");
+
if (have_peephole_flag)
printf ("#define HAVE_peephole 1\n");
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 181b56fb8c0..07b93538969 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -3076,6 +3076,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
prefer left rotation, if op1 is from bitsize / 2 + 1 to
bitsize - 1, use other direction of rotate with 1 .. bitsize / 2 - 1
amount instead. */
+#if defined(HAVE_rotate) && defined(HAVE_rotatert)
if (CONST_INT_P (trueop1)
&& IN_RANGE (INTVAL (trueop1),
GET_MODE_BITSIZE (mode) / 2 + (code == ROTATE),
@@ -3083,6 +3084,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
return simplify_gen_binary (code == ROTATE ? ROTATERT : ROTATE,
mode, op0, GEN_INT (GET_MODE_BITSIZE (mode)
- INTVAL (trueop1)));
+#endif
/* FALLTHRU */
case ASHIFTRT:
if (trueop1 == CONST0_RTX (mode))