aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2004-01-31 23:08:52 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2004-01-31 23:08:52 +0000
commitccdc170325f15c929a3b44688c1f223047e3e4e5 (patch)
tree6dc3c19beea98cdd05aee44da8c777fac56cb779
parentaeba8f806ef08df3bdf554ad9403108d874f5ff1 (diff)
downloadgcc-ccdc170325f15c929a3b44688c1f223047e3e4e5.zip
gcc-ccdc170325f15c929a3b44688c1f223047e3e4e5.tar.gz
gcc-ccdc170325f15c929a3b44688c1f223047e3e4e5.tar.bz2
genrecog.c (decision_type): Add DT_const_int.
* genrecog.c (decision_type): Add DT_const_int. (write_cond) [DT_const_int]: Print a comparison against small constant. (write_node): Simplify comparisons against small constants before printing tests. From-SVN: r77055
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/genrecog.c23
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 201cd8b..710a184 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2004-01-31 Kazu Hirata <kazu@cs.umass.edu>
+ * genrecog.c (decision_type): Add DT_const_int.
+ (write_cond) [DT_const_int]: Print a comparison against small
+ constant.
+ (write_node): Simplify comparisons against small constants
+ before printing tests.
+
+2004-01-31 Kazu Hirata <kazu@cs.umass.edu>
+
* config/m32r/m32r.c (m32r_load_pic_register): Use GEN_INT
instead of gen_rtx_CONST_INT.
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index dc756fe..8673de3 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -90,6 +90,7 @@ struct decision_test
{
DT_mode, DT_code, DT_veclen,
DT_elt_zero_int, DT_elt_one_int, DT_elt_zero_wide, DT_elt_zero_wide_safe,
+ DT_const_int,
DT_veclen_ge, DT_dup, DT_pred, DT_c_test,
DT_accept_op, DT_accept_insn
} type;
@@ -1981,6 +1982,11 @@ write_cond (struct decision_test *p, int depth,
print_host_wide_int (p->u.intval);
break;
+ case DT_const_int:
+ printf ("x%d == const_int_rtx[MAX_SAVED_CONST_INT + (%d)]",
+ depth, (int) p->u.intval);
+ break;
+
case DT_veclen_ge:
printf ("XVECLEN (x%d, 0) >= %d", depth, p->u.veclen);
break;
@@ -2143,6 +2149,23 @@ write_node (struct decision *p, int depth,
struct decision_test *test, *last_test;
int uncond;
+ /* Scan the tests and simplify comparisons against small
+ constants. */
+ for (test = p->tests; test; test = test->next)
+ {
+ if (test->type == DT_code
+ && test->u.code == CONST_INT
+ && test->next
+ && test->next->type == DT_elt_zero_wide_safe
+ && -MAX_SAVED_CONST_INT <= test->next->u.intval
+ && test->next->u.intval <= MAX_SAVED_CONST_INT)
+ {
+ test->type = DT_const_int;
+ test->u.intval = test->next->u.intval;
+ test->next = test->next->next;
+ }
+ }
+
last_test = test = p->tests;
uncond = is_unconditional (test, subroutine_type);
if (uncond == 0)