mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-26 20:50:58 +08:00
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
This commit is contained in:
parent
ad37f6ea74
commit
751aa7cc88
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user