aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2001-02-18 14:34:57 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2001-02-18 09:34:57 -0500
commit751aa7cc88d7267cd95cf1513558a9424e46c694 (patch)
treeeb602218d9bf6424e3c5e83b0e4ea3f56fc77911 /gcc
parentad37f6ea74b89de420a1b00ff8437fb1cd11e104 (diff)
downloadgcc-751aa7cc88d7267cd95cf1513558a9424e46c694.zip
gcc-751aa7cc88d7267cd95cf1513558a9424e46c694.tar.gz
gcc-751aa7cc88d7267cd95cf1513558a9424e46c694.tar.bz2
rtl.h (add_clobbers): Remove duplicate declaration.
* rtl.h (add_clobbers): Remove duplicate declaration. * recog.h (added_clobbers_hard_reg_p): New declaration. * genemit.c (struct clobber_pat): New field has_hard_reg. (gen_insn): Record if added clobbers clobber hard reg. (gen_split): Avoid unused warning if number of operands is 0. (output_added_clobbers_hard_reg_p): New function. (main): Call it. From-SVN: r39832
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/genemit.c69
-rw-r--r--gcc/recog.h5
-rw-r--r--gcc/rtl.h3
4 files changed, 71 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c9ea2ef..9a4b2bf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+Sun Feb 18 09:30:09 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * rtl.h (add_clobbers): Remove duplicate declaration.
+ * recog.h (added_clobbers_hard_reg_p): New declaration.
+ * genemit.c (struct clobber_pat): New field has_hard_reg.
+ (gen_insn): Record if added clobbers clobber hard reg.
+ (gen_split): Avoid unused warning if number of operands is 0.
+ (output_added_clobbers_hard_reg_p): New function.
+ (main): Call it.
+
2001-02-18 Alan Modra <alan@linuxcare.com.au>
* pa.c (hppa_expand_prologue): Simplify code storing return
diff --git a/gcc/genemit.c b/gcc/genemit.c
index 2b3c5da..fafa04f 100644
--- a/gcc/genemit.c
+++ b/gcc/genemit.c
@@ -1,5 +1,5 @@
/* Generate code from machine description to emit insns as rtl.
- Copyright (C) 1987, 1988, 1991, 1994, 1995, 1997, 1998, 1999, 2000
+ Copyright (C) 1987, 1988, 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -44,6 +44,7 @@ struct clobber_pat
rtx pattern;
int first_clobber;
struct clobber_pat *next;
+ int has_hard_reg;
} *clobber_list;
/* Records one insn that uses the clobber list. */
@@ -62,6 +63,7 @@ static void gen_insn PARAMS ((rtx));
static void gen_expand PARAMS ((rtx));
static void gen_split PARAMS ((rtx));
static void output_add_clobbers PARAMS ((void));
+static void output_added_clobbers_hard_reg_p PARAMS ((void));
static void gen_rtx_scratch PARAMS ((rtx, enum rtx_code));
static void output_peephole2_scratches PARAMS ((rtx));
@@ -297,11 +299,18 @@ gen_insn (insn)
if (XVEC (insn, 1))
{
+ int has_hard_reg = 0;
+
for (i = XVECLEN (insn, 1) - 1; i > 0; i--)
- if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER
- || (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != REG
- && GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH))
- break;
+ {
+ if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER)
+ break;
+
+ if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) == REG)
+ has_hard_reg = 1;
+ else if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH)
+ break;
+ }
if (i != XVECLEN (insn, 1) - 1)
{
@@ -349,6 +358,7 @@ gen_insn (insn)
p->pattern = insn;
p->first_clobber = i + 1;
p->next = clobber_list;
+ p->has_hard_reg = has_hard_reg;
clobber_list = p;
}
@@ -549,6 +559,7 @@ gen_split (split)
register int i;
int operands;
const char *name = "split";
+ const char *unused;
if (GET_CODE (split) == DEFINE_PEEPHOLE2)
name = "peephole2";
@@ -564,22 +575,23 @@ gen_split (split)
max_operand_vec (split, 2);
operands = MAX (max_opno, MAX (max_dup_opno, max_scratch_opno)) + 1;
+ unused = (operands == 0 ? " ATTRIBUTE_UNUSED" : "");
/* Output the prototype, function name and argument declarations. */
if (GET_CODE (split) == DEFINE_PEEPHOLE2)
{
printf ("extern rtx gen_%s_%d PARAMS ((rtx, rtx *));\n",
name, insn_code_number);
- printf ("rtx\ngen_%s_%d (curr_insn, operands)\n\
- rtx curr_insn ATTRIBUTE_UNUSED;\n\
- rtx *operands;\n",
+ printf ("rtx\ngen_%s_%d (curr_insn, operands)\n",
name, insn_code_number);
+ printf (" rtx curr_insn ATTRIBUTE_UNUSED;\n");
+ printf (" rtx *operands%s;\n", unused);
}
else
{
printf ("extern rtx gen_split_%d PARAMS ((rtx *));\n", insn_code_number);
- printf ("rtx\ngen_%s_%d (operands)\n rtx *operands;\n", name,
- insn_code_number);
+ printf ("rtx\ngen_%s_%d (operands)\n", name, insn_code_number);
+ printf (" rtx *operands%s;\n", unused);
}
printf ("{\n");
@@ -689,6 +701,39 @@ output_add_clobbers ()
printf ("}\n");
}
+/* Write a function, `added_clobbers_hard_reg_p' this is given an insn_code
+ number that needs clobbers and returns 1 if they include a clobber of a
+ hard reg and 0 if they just clobber SCRATCH. */
+
+static void
+output_added_clobbers_hard_reg_p ()
+{
+ struct clobber_pat *clobber;
+ struct clobber_ent *ent;
+ int clobber_p;
+
+ printf ("\n\nint\nadded_clobbers_hard_reg_p (insn_code_number)\n");
+ printf (" int insn_code_number;\n");
+ printf ("{\n");
+ printf (" switch (insn_code_number)\n");
+ printf (" {\n");
+
+ for (clobber_p = 0; clobber_p <= 1; clobber_p++)
+ {
+ for (clobber = clobber_list; clobber; clobber = clobber->next)
+ if (clobber->has_hard_reg == clobber_p)
+ for (ent = clobber->insns; ent; ent = ent->next)
+ printf (" case %d:\n", ent->code_number);
+
+ printf (" return %d;\n\n", clobber_p);
+ }
+
+ printf (" default:\n");
+ printf (" abort ();\n");
+ printf (" }\n");
+ printf ("}\n");
+}
+
/* Generate code to invoke find_free_register () as needed for the
scratch registers used by the peephole2 pattern in SPLIT. */
@@ -812,8 +857,10 @@ from the machine description file `md'. */\n\n");
++insn_index_number;
}
- /* Write out the routine to add CLOBBERs to a pattern. */
+ /* Write out the routines to add CLOBBERs to a pattern and say whether they
+ clobber a hard reg. */
output_add_clobbers ();
+ output_added_clobbers_hard_reg_p ();
fflush (stdout);
return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
diff --git a/gcc/recog.h b/gcc/recog.h
index f591da6..b59d664 100644
--- a/gcc/recog.h
+++ b/gcc/recog.h
@@ -1,6 +1,6 @@
/* Declarations for interface to insn recognizer and insn-output.c.
- Copyright (C) 1987, 1996, 1997, 1998,
- 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1987, 1996, 1997, 1998, 1999, 2000, 2001
+ Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -119,6 +119,7 @@ extern int mode_dependent_address_p PARAMS ((rtx));
extern int recog PARAMS ((rtx, rtx, int *));
extern void add_clobbers PARAMS ((rtx, int));
+extern int added_clobbers_hard_reg_p PARAMS ((int));
extern void insn_extract PARAMS ((rtx));
extern void extract_insn PARAMS ((rtx));
extern void extract_constrain_insn_cached PARAMS ((rtx));
diff --git a/gcc/rtl.h b/gcc/rtl.h
index ecbde55..99c20ce 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1783,9 +1783,6 @@ void restore_line_number_status PARAMS ((int old_value));
extern void renumber_insns PARAMS ((FILE *));
extern void remove_unnecessary_notes PARAMS ((void));
-/* In insn-emit.c */
-extern void add_clobbers PARAMS ((rtx, int));
-
/* In combine.c */
extern int combine_instructions PARAMS ((rtx, unsigned int));
extern unsigned int extended_count PARAMS ((rtx, enum machine_mode, int));