diff options
-rw-r--r-- | gcc/genattrtab.c | 39 | ||||
-rw-r--r-- | gcc/genemit.c | 44 | ||||
-rw-r--r-- | gcc/genrecog.c | 52 |
3 files changed, 93 insertions, 42 deletions
diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c index dc96d815ab2..a673fe93675 100644 --- a/gcc/genattrtab.c +++ b/gcc/genattrtab.c @@ -170,6 +170,8 @@ struct attr_desc struct attr_value *default_val; /* Default value for this attribute. */ }; +#define NULL_ATTR (struct attr_desc *) NULL + /* Structure for each DEFINE_DELAY. */ struct delay_desc @@ -546,7 +548,7 @@ attr_rtx (va_alist) } else if (code == CONST_INT) { - int arg0 = va_arg (p, int); + HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT); if (arg0 == 0) return false_rtx; if (arg0 == 1) @@ -570,6 +572,10 @@ attr_rtx (va_alist) XINT (rt_val, i) = va_arg (p, int); break; + case 'w': /* A wide integer? */ + XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT); + break; + case 's': /* A string? */ XSTR (rt_val, i) = va_arg (p, char *); break; @@ -772,9 +778,22 @@ attr_copy_rtx (orig) } break; - default: + case 'n': + case 'i': XINT (copy, i) = XINT (orig, i); break; + + case 'w': + XWINT (copy, i) = XWINT (orig, i); + break; + + case 's': + case 'S': + XSTR (copy, i) = XSTR (orig, i); + break; + + default: + abort (); } } return copy; @@ -880,7 +899,7 @@ check_attr_test (exp, is_const) case CONST_INT: /* Either TRUE or FALSE. */ - if (XINT (exp, 0)) + if (XWINT (exp, 0)) return true_rtx; else return false_rtx; @@ -1644,10 +1663,10 @@ expand_units () and busy cost. Then make an attribute for use in the conflict function. */ op->condexp = check_attr_test (op->condexp, 0); - op->busyexp = check_attr_value (op->busyexp, 0); + op->busyexp = check_attr_value (op->busyexp, NULL_ATTR); str = attr_printf (strlen (unit->name) + 11, "*%s_case_%d", unit->name, op->num); - make_internal_attr (str, make_canonical (0, op->busyexp)); + make_internal_attr (str, make_canonical (NULL_ATTR, op->busyexp)); /* Make our adjustment to the two COND's being computed. If we are the last operation class, place our values into the default of @@ -3499,7 +3518,11 @@ write_test_expr (exp, in_comparison) /* Constant integer. */ case CONST_INT: - printf ("%d", XINT (exp, 0)); +#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT + printf ("%d", XWINT (exp, 0)); +#else + printf ("%ld", XWINT (exp, 0)); +#endif break; /* A random C expression. */ @@ -4481,9 +4504,9 @@ main (argc, argv) /* Set up true and false rtx's */ true_rtx = rtx_alloc (CONST_INT); - XINT (true_rtx, 0) = 1; + XWINT (true_rtx, 0) = 1; false_rtx = rtx_alloc (CONST_INT); - XINT (false_rtx, 0) = 0; + XWINT (false_rtx, 0) = 0; RTX_UNCHANGING_P (true_rtx) = RTX_UNCHANGING_P (false_rtx) = 1; RTX_INTEGRATED_P (true_rtx) = RTX_INTEGRATED_P (false_rtx) = 1; diff --git a/gcc/genemit.c b/gcc/genemit.c index 05f60f3921d..8f86925fa98 100644 --- a/gcc/genemit.c +++ b/gcc/genemit.c @@ -146,7 +146,7 @@ gen_exp (x) if (x == 0) { - printf ("0"); + printf ("NULL_RTX"); return; } @@ -202,25 +202,27 @@ gen_exp (x) case CONST_INT: if (INTVAL (x) == 0) - { - printf ("const0_rtx"); - return; - } - if (INTVAL (x) == 1) - { - printf ("const1_rtx"); - return; - } - if (INTVAL (x) == -1) - { - printf ("constm1_rtx"); - return; - } - if (INTVAL (x) == STORE_FLAG_VALUE) - { - printf ("const_true_rtx"); - return; - } + printf ("const0_rtx"); + else if (INTVAL (x) == 1) + printf ("const1_rtx"); + else if (INTVAL (x) == -1) + printf ("constm1_rtx"); + else if (INTVAL (x) == STORE_FLAG_VALUE) + printf ("const_true_rtx"); + else + printf ( +#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT + "GEN_INT (%d)", +#else + "GEN_INT (%ld)", +#endif + INTVAL (x)); + return; + + case CONST_DOUBLE: + /* These shouldn't be written in MD files. Instead, the appropriate + routines in varasm.c should be called. */ + abort (); } printf ("gen_rtx ("); @@ -237,7 +239,7 @@ gen_exp (x) if (fmt[i] == 'e' || fmt[i] == 'u') gen_exp (XEXP (x, i)); else if (fmt[i] == 'i') - printf ("%u", (unsigned) XINT (x, i)); + printf ("%u", XINT (x, i)); else if (fmt[i] == 's') printf ("\"%s\"", XSTR (x, i)); else if (fmt[i] == 'E') diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 72f02f5bb4d..c749359f79d 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -83,6 +83,8 @@ struct decision int elt_zero_int; /* Required value for XINT (rtl, 0) */ int test_elt_one_int; /* Nonzero if should test XINT (rtl, 1) */ int elt_one_int; /* Required value for XINT (rtl, 1) */ + int test_elt_zero_wide; /* Nonzero if should test XWINT (rtl, 0) */ + HOST_WIDE_INT elt_zero_wide; /* Required value for XWINT (rtl, 0) */ char *tests; /* If nonzero predicate to call */ int pred; /* `preds' index of predicate or -1 */ char *c_test; /* Additional test to perform */ @@ -303,8 +305,10 @@ add_to_sequence (pattern, last, position) new->veclen = 0; new->test_elt_zero_int = 0; new->test_elt_one_int = 0; + new->test_elt_zero_wide = 0; new->elt_zero_int = 0; new->elt_one_int = 0; + new->elt_zero_wide = 0; new->tests = 0; new->pred = -1; new->c_test = 0; @@ -500,6 +504,11 @@ add_to_sequence (pattern, last, position) this->test_elt_one_int = 1; this->elt_one_int = XINT (pattern, i); } + else if (fmt[i] == 'w' && i == 0) + { + this->test_elt_zero_wide = 1; + this->elt_zero_wide = XWINT (pattern, i); + } else if (fmt[i] == 'E') { register int j; @@ -549,6 +558,8 @@ not_both_true (d1, d2, toplevel) && d1->elt_zero_int != d2->elt_zero_int) || (d1->test_elt_one_int && d2->test_elt_one_int && d1->elt_one_int != d2->elt_one_int) + || (d1->test_elt_zero_wide && d2->test_elt_zero_wide + && d1->elt_zero_wide != d2->elt_zero_wide) || (d1->veclen && d2->veclen && d1->veclen != d2->veclen)) return 1; @@ -742,6 +753,7 @@ merge_trees (oldh, addh) would cause an infinite recursion. */ if (old->tests == 0 && old->test_elt_zero_int == 0 && old->test_elt_one_int == 0 && old->veclen == 0 + && old->test_elt_zero_wide == 0 && old->dupno == -1 && old->mode == VOIDmode && old->code == UNKNOWN && (old->c_test != 0 || add->c_test != 0)) @@ -751,16 +763,18 @@ merge_trees (oldh, addh) || (old->pred >= 0 && old->pred == add->pred) || (old->tests && add->tests && !strcmp (old->tests, add->tests))) - && old->test_elt_zero_int == add->test_elt_zero_int - && old->elt_zero_int == add->elt_zero_int - && old->test_elt_one_int == add->test_elt_one_int - && old->elt_one_int == add->elt_one_int - && old->veclen == add->veclen - && old->dupno == add->dupno - && old->opno == add->opno - && old->code == add->code - && old->enforce_mode == add->enforce_mode - && old->mode == add->mode) + && old->test_elt_zero_int == add->test_elt_zero_int + && old->elt_zero_int == add->elt_zero_int + && old->test_elt_one_int == add->test_elt_one_int + && old->elt_one_int == add->elt_one_int + && old->test_elt_zero_wide == add->test_elt_zero_wide + && old->elt_zero_wide == add->elt_zero_wide + && old->veclen == add->veclen + && old->dupno == add->dupno + && old->opno == add->opno + && old->code == add->code + && old->enforce_mode == add->enforce_mode + && old->mode == add->mode) { /* If the additional test is not the same, split both nodes into nodes that just contain all things tested before the @@ -793,6 +807,7 @@ merge_trees (oldh, addh) split->veclen = 0; split->test_elt_zero_int = 0; split->test_elt_one_int = 0; + split->test_elt_zero_wide = 0; split->tests = 0; split->pred = -1; } @@ -817,6 +832,7 @@ merge_trees (oldh, addh) split->veclen = 0; split->test_elt_zero_int = 0; split->test_elt_one_int = 0; + split->test_elt_zero_wide = 0; split->tests = 0; split->pred = -1; } @@ -873,7 +889,8 @@ merge_trees (oldh, addh) if (best_position == 0) abort (); - if (old == 0 && position_merit (0, add_mode, add->code) < best_merit) + if (old == 0 + && position_merit (NULL_PTR, add_mode, add->code) < best_merit) { add->prev = 0; add->next = oldh.first; @@ -964,7 +981,7 @@ write_subroutine (tree, type) printf ("x%d;\n", max_depth); printf (" %s tem;\n", type == SPLIT ? "rtx" : "int"); - write_tree (tree, "", 0, 1, type); + write_tree (tree, "", NULL_PTR, 1, type); printf (" ret0: return %d;\n}\n\n", type == SPLIT ? 0 : -1); } @@ -1278,7 +1295,8 @@ write_tree_1 (tree, prevpos, afterward, type) if ((mode != switch_mode && ! p->ignore_mode) || (p->code != switch_code && p->code != UNKNOWN && ! p->ignore_code) - || p->test_elt_zero_int || p->test_elt_one_int || p->veclen + || p->test_elt_zero_int || p->test_elt_one_int + || p->test_elt_zero_wide || p->veclen || p->dupno >= 0 || p->tests || p->num_clobbers_to_add) { printf ("%sif (", indents[indent]); @@ -1297,6 +1315,14 @@ write_tree_1 (tree, prevpos, afterward, type) printf ("XINT (x%d, 0) == %d && ", depth, p->elt_zero_int); if (p->test_elt_one_int) printf ("XINT (x%d, 1) == %d && ", depth, p->elt_one_int); + if (p->test_elt_zero_wide) + printf ( +#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT + "XWINT (x%d, 0) == %d && ", +#else + "XWINT (x%d, 0) == %ld && ", +#endif + depth, p->elt_zero_wide); if (p->veclen) printf ("XVECLEN (x%d, 0) == %d && ", depth, p->veclen); if (p->dupno >= 0) |