From 751aa7cc88d7267cd95cf1513558a9424e46c694 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Sun, 18 Feb 2001 14:34:57 +0000 Subject: 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 --- gcc/ChangeLog | 10 +++++++++ gcc/genemit.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++---------- gcc/recog.h | 5 +++-- gcc/rtl.h | 3 --- 4 files changed, 71 insertions(+), 16 deletions(-) (limited to 'gcc') 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 + + * 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 * 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)); -- cgit v1.1