summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/genoutput.c14
-rw-r--r--gcc/genrecog.c29
2 files changed, 31 insertions, 12 deletions
diff --git a/gcc/genoutput.c b/gcc/genoutput.c
index 5be190d9a34..a3c7979d01b 100644
--- a/gcc/genoutput.c
+++ b/gcc/genoutput.c
@@ -1,5 +1,5 @@
/* Generate code from to output assembler insns as recognized from rtl.
- Copyright (C) 1987-1991 Free Software Foundation, Inc.
+ Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -424,12 +424,12 @@ scan_operands (part, this_address_p, this_strict_low)
max_opno = opno;
if (max_opno >= MAX_MAX_OPERANDS)
{
- error ("Too many operands (%d) in instruction pattern %d.\n",
+ error ("Too many operands (%d) in definition %d.\n",
max_opno + 1, next_index_number);
return;
}
if (seen[opno])
- error ("Insn pattern %d specified operand number %d more than once.\n",
+ error ("Definition %d specified operand number %d more than once.\n",
next_index_number, opno);
seen[opno] = 1;
modes[opno] = GET_MODE (part);
@@ -450,12 +450,12 @@ scan_operands (part, this_address_p, this_strict_low)
max_opno = opno;
if (max_opno >= MAX_MAX_OPERANDS)
{
- error ("Too many operands (%d) in instruction pattern %d.\n",
+ error ("Too many operands (%d) in definition %d.\n",
max_opno + 1, next_index_number);
return;
}
if (seen[opno])
- error ("Insn pattern %d specified operand number %d more than once.\n",
+ error ("Definition %d specified operand number %d more than once.\n",
next_index_number, opno);
seen[opno] = 1;
modes[opno] = GET_MODE (part);
@@ -477,12 +477,12 @@ scan_operands (part, this_address_p, this_strict_low)
max_opno = opno;
if (max_opno >= MAX_MAX_OPERANDS)
{
- error ("Too many operands (%d) in instruction pattern %d.\n",
+ error ("Too many operands (%d) in definition %d.\n",
max_opno + 1, next_index_number);
return;
}
if (seen[opno])
- error ("Insn pattern %d specified operand number %d more than once.\n",
+ error ("Definition %d specified operand number %d more than once.\n",
next_index_number, opno);
seen[opno] = 1;
modes[opno] = GET_MODE (part);
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index a3f9184ca72..a8b0372558a 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -1,5 +1,5 @@
/* Generate code from machine description to recognize rtl as insns.
- Copyright (C) 1987-1991 Free Software Foundation, Inc.
+ Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -81,7 +81,7 @@ struct decision
int test_elt_zero_int; /* Nonzero if should test XINT (rtl, 0) */
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, 2) */
+ int elt_one_int; /* Required value for XINT (rtl, 1) */
char *tests; /* If nonzero predicate to call */
int pred; /* `preds' index of predicate or -1 */
char *c_test; /* Additional test to perform */
@@ -824,11 +824,30 @@ merge_trees (oldh, addh)
}
}
- old->success = merge_trees (old->success, add->success);
if (old->insn_code_number >= 0 && add->insn_code_number >= 0)
- fatal ("Two actions at one point in tree");
+ {
+ /* If one node is for a normal insn and the second is
+ for the base insn with clobbers stripped off, the
+ second node should be ignored. */
+
+ if (old->num_clobbers_to_add == 0
+ && add->num_clobbers_to_add > 0)
+ /* Nothing to do here. */
+ ;
+ else if (old->num_clobbers_to_add > 0
+ && add->num_clobbers_to_add == 0)
+ {
+ /* In this case, replace OLD with ADD. */
+ old->insn_code_number = add->insn_code_number;
+ old->num_clobbers_to_add = 0;
+ }
+ else
+ fatal ("Two actions at one point in tree");
+ }
+
if (old->insn_code_number == -1)
old->insn_code_number = add->insn_code_number;
+ old->success = merge_trees (old->success, add->success);
add = 0;
break;
}
@@ -1609,7 +1628,7 @@ fatal (s, a1, a2)
fprintf (stderr, "genrecog: ");
fprintf (stderr, s, a1, a2);
fprintf (stderr, "\n");
- fprintf (stderr, "after %d instruction definitions\n", next_index);
+ fprintf (stderr, "after %d definitions\n", next_index);
exit (FATAL_EXIT_CODE);
}