From de6a431bee95a409f848f3f2276bf026c4e7272a Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Wed, 15 Jan 1992 16:29:48 -0500 Subject: [PATCH] *** empty log message *** From-SVN: r189 --- gcc/genoutput.c | 14 +++++++------- gcc/genrecog.c | 29 ++++++++++++++++++++++++----- 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); } -- 2.30.2