Commit 751aa7cc by Richard Kenner Committed by Richard Kenner

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
parent ad37f6ea
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
......
/* 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);
......
/* 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));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment