mirror of git://gcc.gnu.org/git/gcc.git
gensupport.c (init_rtx_reader_args_cb): Start counting code generating patterns from 1 to free up 0 for CODE_FOR_nothing.
* gensupport.c (init_rtx_reader_args_cb): Start counting code generating patterns from 1 to free up 0 for CODE_FOR_nothing. * gencodes.c (main): Give CODE_FOR_nothing the value 0. Add the LAST_INSN_CODE marker at the end. * genoutput.c (nothing): New static struct data. (idata): Initialize to ¬hing. (idata_end): Initialize to ¬hing.next. (init_insn_for_nothing): New function to create dummy 'nothing' insn. (main): Use it. * genpeep.c (insn_code_number): Remove global variable. (gen_peephole): Take it as an argument instead. (main): Take insn_code_number from read_md_rtx. * optabs.h: Revert r161809: (optab_handlers): Change type of insn_code back to insn_code. (optab_handler, widening_optab_handler, set_optab_handler, set_widening_optab_handler, convert_optab_handler, set_convert_optab_handler, direct_optab_handler, set_direct_optab_handler): Remove int casts. Revert to treating the insn_code field as "insn_code". From-SVN: r189366
This commit is contained in:
parent
701649fa89
commit
e714561a2f
|
|
@ -1,3 +1,25 @@
|
||||||
|
2012-07-09 Steven Bosscher <steven@gcc.gnu.org>
|
||||||
|
|
||||||
|
* gensupport.c (init_rtx_reader_args_cb): Start counting code
|
||||||
|
generating patterns from 1 to free up 0 for CODE_FOR_nothing.
|
||||||
|
* gencodes.c (main): Give CODE_FOR_nothing the value 0. Add
|
||||||
|
the LAST_INSN_CODE marker at the end.
|
||||||
|
* genoutput.c (nothing): New static struct data.
|
||||||
|
(idata): Initialize to ¬hing.
|
||||||
|
(idata_end): Initialize to ¬hing.next.
|
||||||
|
(init_insn_for_nothing): New function to create dummy 'nothing' insn.
|
||||||
|
(main): Use it.
|
||||||
|
* genpeep.c (insn_code_number): Remove global variable.
|
||||||
|
(gen_peephole): Take it as an argument instead.
|
||||||
|
(main): Take insn_code_number from read_md_rtx.
|
||||||
|
* optabs.h: Revert r161809:
|
||||||
|
(optab_handlers): Change type of insn_code back to insn_code.
|
||||||
|
(optab_handler, widening_optab_handler, set_optab_handler,
|
||||||
|
set_widening_optab_handler, convert_optab_handler,
|
||||||
|
set_convert_optab_handler, direct_optab_handler,
|
||||||
|
set_direct_optab_handler): Remove int casts.
|
||||||
|
Revert to treating the insn_code field as "insn_code".
|
||||||
|
|
||||||
2012-07-08 Oleg Endo <olegendo@gcc.gnu.org>
|
2012-07-08 Oleg Endo <olegendo@gcc.gnu.org>
|
||||||
|
|
||||||
* config/sh/sh.md (*return_i): Move trap_exit attribute check to ...
|
* config/sh/sh.md (*return_i): Move trap_exit attribute check to ...
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
- some macros CODE_FOR_... giving the insn_code_number value
|
- some macros CODE_FOR_... giving the insn_code_number value
|
||||||
for each of the defined standard insn names.
|
for each of the defined standard insn names.
|
||||||
Copyright (C) 1987, 1991, 1995, 1998, 1999, 2000, 2001, 2003,
|
Copyright (C) 1987, 1991, 1995, 1998, 1999, 2000, 2001, 2003,
|
||||||
2004, 2007, 2010 Free Software Foundation, Inc.
|
2004, 2007, 2010, 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
|
@ -68,7 +68,8 @@ main (int argc, char **argv)
|
||||||
#ifndef GCC_INSN_CODES_H\n\
|
#ifndef GCC_INSN_CODES_H\n\
|
||||||
#define GCC_INSN_CODES_H\n\
|
#define GCC_INSN_CODES_H\n\
|
||||||
\n\
|
\n\
|
||||||
enum insn_code {");
|
enum insn_code {\n\
|
||||||
|
CODE_FOR_nothing = 0,\n");
|
||||||
|
|
||||||
/* Read the machine description. */
|
/* Read the machine description. */
|
||||||
|
|
||||||
|
|
@ -85,7 +86,7 @@ enum insn_code {");
|
||||||
gen_insn (desc, insn_code_number);
|
gen_insn (desc, insn_code_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
puts (" CODE_FOR_nothing\n\
|
puts (" LAST_INSN_CODE\n\
|
||||||
};\n\
|
};\n\
|
||||||
\n\
|
\n\
|
||||||
#endif /* GCC_INSN_CODES_H */");
|
#endif /* GCC_INSN_CODES_H */");
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
/* Generate code from to output assembler insns as recognized from rtl.
|
/* Generate code from to output assembler insns as recognized from rtl.
|
||||||
Copyright (C) 1987, 1988, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2002,
|
Copyright (C) 1987, 1988, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2002,
|
||||||
2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
|
2003, 2004, 2005, 2007, 2008, 2009, 2010, 2012
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
|
@ -171,9 +172,16 @@ struct data
|
||||||
struct operand_data operand[MAX_MAX_OPERANDS];
|
struct operand_data operand[MAX_MAX_OPERANDS];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This variable points to the first link in the insn chain. */
|
/* A dummy insn, for CODE_FOR_nothing. */
|
||||||
|
static struct data nothing;
|
||||||
|
|
||||||
|
/* This variable points to the first link in the insn chain. */
|
||||||
|
static struct data *idata = ¬hing;
|
||||||
|
|
||||||
|
/* This variable points to the end of the insn chain. This is where
|
||||||
|
everything relevant from the machien description is appended to. */
|
||||||
|
static struct data **idata_end = ¬hing.next;
|
||||||
|
|
||||||
static struct data *idata, **idata_end = &idata;
|
|
||||||
|
|
||||||
static void output_prologue (void);
|
static void output_prologue (void);
|
||||||
static void output_operand_data (void);
|
static void output_operand_data (void);
|
||||||
|
|
@ -987,6 +995,14 @@ gen_split (rtx split, int lineno)
|
||||||
place_operands (d);
|
place_operands (d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_insn_for_nothing (void)
|
||||||
|
{
|
||||||
|
memset (¬hing, 0, sizeof (nothing));
|
||||||
|
nothing.name = "*placeholder_for_nothing";
|
||||||
|
nothing.filename = "<internal>";
|
||||||
|
}
|
||||||
|
|
||||||
extern int main (int, char **);
|
extern int main (int, char **);
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
@ -996,11 +1012,12 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
progname = "genoutput";
|
progname = "genoutput";
|
||||||
|
|
||||||
|
init_insn_for_nothing ();
|
||||||
|
|
||||||
if (!init_rtx_reader_args (argc, argv))
|
if (!init_rtx_reader_args (argc, argv))
|
||||||
return (FATAL_EXIT_CODE);
|
return (FATAL_EXIT_CODE);
|
||||||
|
|
||||||
output_prologue ();
|
output_prologue ();
|
||||||
next_code_number = 0;
|
|
||||||
next_index_number = 0;
|
next_index_number = 0;
|
||||||
|
|
||||||
/* Read the machine description. */
|
/* Read the machine description. */
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/* Generate code from machine description to perform peephole optimizations.
|
/* Generate code from machine description to perform peephole optimizations.
|
||||||
Copyright (C) 1987, 1989, 1992, 1997, 1998, 1999, 2000, 2003, 2004,
|
Copyright (C) 1987, 1989, 1992, 1997, 1998, 1999, 2000, 2003, 2004,
|
||||||
2007, 2010 Free Software Foundation, Inc.
|
2007, 2010, 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
|
@ -47,18 +47,13 @@ static int max_opno;
|
||||||
|
|
||||||
static int n_operands;
|
static int n_operands;
|
||||||
|
|
||||||
/* Peephole optimizations get insn codes just like insn patterns.
|
static void gen_peephole (rtx, int);
|
||||||
Count them so we know the code of the define_peephole we are handling. */
|
|
||||||
|
|
||||||
static int insn_code_number = 0;
|
|
||||||
|
|
||||||
static void gen_peephole (rtx);
|
|
||||||
static void match_rtx (rtx, struct link *, int);
|
static void match_rtx (rtx, struct link *, int);
|
||||||
static void print_path (struct link *);
|
static void print_path (struct link *);
|
||||||
static void print_code (RTX_CODE);
|
static void print_code (RTX_CODE);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gen_peephole (rtx peep)
|
gen_peephole (rtx peep, int insn_code_number)
|
||||||
{
|
{
|
||||||
int ninsns = XVECLEN (peep, 0);
|
int ninsns = XVECLEN (peep, 0);
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -392,24 +387,15 @@ from the machine description file `md'. */\n\n");
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
int line_no, rtx_number = 0;
|
int line_no;
|
||||||
|
int insn_code_number;
|
||||||
|
|
||||||
desc = read_md_rtx (&line_no, &rtx_number);
|
desc = read_md_rtx (&line_no, &insn_code_number);
|
||||||
if (desc == NULL)
|
if (desc == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (GET_CODE (desc) == DEFINE_PEEPHOLE)
|
if (GET_CODE (desc) == DEFINE_PEEPHOLE)
|
||||||
{
|
gen_peephole (desc, insn_code_number);
|
||||||
gen_peephole (desc);
|
|
||||||
insn_code_number++;
|
|
||||||
}
|
|
||||||
if (GET_CODE (desc) == DEFINE_INSN
|
|
||||||
|| GET_CODE (desc) == DEFINE_EXPAND
|
|
||||||
|| GET_CODE (desc) == DEFINE_SPLIT
|
|
||||||
|| GET_CODE (desc) == DEFINE_PEEPHOLE2)
|
|
||||||
{
|
|
||||||
insn_code_number++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printf (" return 0;\n}\n\n");
|
printf (" return 0;\n}\n\n");
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/* Support routines for the various generation passes.
|
/* Support routines for the various generation passes.
|
||||||
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
||||||
2010, Free Software Foundation, Inc.
|
2010, 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
|
@ -38,6 +38,10 @@ int insn_elision = 1;
|
||||||
static struct obstack obstack;
|
static struct obstack obstack;
|
||||||
struct obstack *rtl_obstack = &obstack;
|
struct obstack *rtl_obstack = &obstack;
|
||||||
|
|
||||||
|
/* Counter for patterns that generate code: define_insn, define_expand,
|
||||||
|
define_split, define_peephole, and define_peephole2. See read_md_rtx().
|
||||||
|
Any define_insn_and_splits are already in separate queues so that the
|
||||||
|
insn and the splitter get a unique number also. */
|
||||||
static int sequence_num;
|
static int sequence_num;
|
||||||
|
|
||||||
static int predicable_default;
|
static int predicable_default;
|
||||||
|
|
@ -1397,7 +1401,9 @@ init_rtx_reader_args_cb (int argc, char **argv,
|
||||||
condition_table = htab_create (500, hash_c_test, cmp_c_test, NULL);
|
condition_table = htab_create (500, hash_c_test, cmp_c_test, NULL);
|
||||||
init_predicate_table ();
|
init_predicate_table ();
|
||||||
obstack_init (rtl_obstack);
|
obstack_init (rtl_obstack);
|
||||||
sequence_num = 0;
|
|
||||||
|
/* Start at 1, to make 0 available for CODE_FOR_nothing. */
|
||||||
|
sequence_num = 1;
|
||||||
|
|
||||||
read_md_files (argc, argv, parse_opt, rtx_handle_directive);
|
read_md_files (argc, argv, parse_opt, rtx_handle_directive);
|
||||||
|
|
||||||
|
|
@ -1419,7 +1425,11 @@ init_rtx_reader_args (int argc, char **argv)
|
||||||
return init_rtx_reader_args_cb (argc, argv, 0);
|
return init_rtx_reader_args_cb (argc, argv, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The entry point for reading a single rtx from an md file. */
|
/* The entry point for reading a single rtx from an md file. Return
|
||||||
|
the rtx, or NULL if the md file has been fully processed.
|
||||||
|
Return the line where the rtx was found in LINENO.
|
||||||
|
Return the number of code generating rtx'en read since the start
|
||||||
|
of the md file in SEQNR. */
|
||||||
|
|
||||||
rtx
|
rtx
|
||||||
read_md_rtx (int *lineno, int *seqnr)
|
read_md_rtx (int *lineno, int *seqnr)
|
||||||
|
|
|
||||||
36
gcc/optabs.h
36
gcc/optabs.h
|
|
@ -1,6 +1,6 @@
|
||||||
/* Definitions for code generation pass of GNU compiler.
|
/* Definitions for code generation pass of GNU compiler.
|
||||||
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
||||||
Free Software Foundation, Inc.
|
2010, 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
|
@ -29,6 +29,10 @@ along with GCC; see the file COPYING3. If not see
|
||||||
|
|
||||||
For example, add_optab applies to addition.
|
For example, add_optab applies to addition.
|
||||||
|
|
||||||
|
The insn_code slot is the enum insn_code that says how to
|
||||||
|
generate an insn for this operation on a particular machine mode.
|
||||||
|
It is CODE_FOR_nothing if there is no such insn on the target machine.
|
||||||
|
|
||||||
The `lib_call' slot is the name of the library function that
|
The `lib_call' slot is the name of the library function that
|
||||||
can be used to perform the operation.
|
can be used to perform the operation.
|
||||||
|
|
||||||
|
|
@ -36,10 +40,7 @@ along with GCC; see the file COPYING3. If not see
|
||||||
|
|
||||||
struct optab_handlers
|
struct optab_handlers
|
||||||
{
|
{
|
||||||
/* I - CODE_FOR_nothing, where I is either the insn code of the
|
enum insn_code insn_code;
|
||||||
associated insn generator or CODE_FOR_nothing if there is no such
|
|
||||||
insn on the target machine. */
|
|
||||||
int insn_code;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct widening_optab_handlers
|
struct widening_optab_handlers
|
||||||
|
|
@ -1011,8 +1012,7 @@ extern rtx expand_vec_perm (enum machine_mode, rtx, rtx, rtx, rtx);
|
||||||
static inline enum insn_code
|
static inline enum insn_code
|
||||||
optab_handler (optab op, enum machine_mode mode)
|
optab_handler (optab op, enum machine_mode mode)
|
||||||
{
|
{
|
||||||
return (enum insn_code) (op->handlers[(int) mode].insn_code
|
return op->handlers[(int) mode].insn_code;
|
||||||
+ (int) CODE_FOR_nothing);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like optab_handler, but for widening_operations that have a TO_MODE and
|
/* Like optab_handler, but for widening_operations that have a TO_MODE and
|
||||||
|
|
@ -1026,8 +1026,7 @@ widening_optab_handler (optab op, enum machine_mode to_mode,
|
||||||
return optab_handler (op, to_mode);
|
return optab_handler (op, to_mode);
|
||||||
|
|
||||||
if (op->widening)
|
if (op->widening)
|
||||||
return (enum insn_code) (op->widening->handlers[(int) to_mode][(int) from_mode].insn_code
|
return op->widening->handlers[(int) to_mode][(int) from_mode].insn_code;
|
||||||
+ (int) CODE_FOR_nothing);
|
|
||||||
|
|
||||||
return CODE_FOR_nothing;
|
return CODE_FOR_nothing;
|
||||||
}
|
}
|
||||||
|
|
@ -1037,7 +1036,7 @@ widening_optab_handler (optab op, enum machine_mode to_mode,
|
||||||
static inline void
|
static inline void
|
||||||
set_optab_handler (optab op, enum machine_mode mode, enum insn_code code)
|
set_optab_handler (optab op, enum machine_mode mode, enum insn_code code)
|
||||||
{
|
{
|
||||||
op->handlers[(int) mode].insn_code = (int) code - (int) CODE_FOR_nothing;
|
op->handlers[(int) mode].insn_code = code;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like set_optab_handler, but for widening operations that have a TO_MODE
|
/* Like set_optab_handler, but for widening operations that have a TO_MODE
|
||||||
|
|
@ -1055,8 +1054,7 @@ set_widening_optab_handler (optab op, enum machine_mode to_mode,
|
||||||
op->widening = (struct widening_optab_handlers *)
|
op->widening = (struct widening_optab_handlers *)
|
||||||
xcalloc (1, sizeof (struct widening_optab_handlers));
|
xcalloc (1, sizeof (struct widening_optab_handlers));
|
||||||
|
|
||||||
op->widening->handlers[(int) to_mode][(int) from_mode].insn_code
|
op->widening->handlers[(int) to_mode][(int) from_mode].insn_code = code;
|
||||||
= (int) code - (int) CODE_FOR_nothing;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1068,9 +1066,7 @@ static inline enum insn_code
|
||||||
convert_optab_handler (convert_optab op, enum machine_mode to_mode,
|
convert_optab_handler (convert_optab op, enum machine_mode to_mode,
|
||||||
enum machine_mode from_mode)
|
enum machine_mode from_mode)
|
||||||
{
|
{
|
||||||
return ((enum insn_code)
|
return op->handlers[(int) to_mode][(int) from_mode].insn_code;
|
||||||
(op->handlers[(int) to_mode][(int) from_mode].insn_code
|
|
||||||
+ (int) CODE_FOR_nothing));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Record that insn CODE should be used to perform conversion OP
|
/* Record that insn CODE should be used to perform conversion OP
|
||||||
|
|
@ -1080,8 +1076,7 @@ static inline void
|
||||||
set_convert_optab_handler (convert_optab op, enum machine_mode to_mode,
|
set_convert_optab_handler (convert_optab op, enum machine_mode to_mode,
|
||||||
enum machine_mode from_mode, enum insn_code code)
|
enum machine_mode from_mode, enum insn_code code)
|
||||||
{
|
{
|
||||||
op->handlers[(int) to_mode][(int) from_mode].insn_code
|
op->handlers[(int) to_mode][(int) from_mode].insn_code = code;
|
||||||
= (int) code - (int) CODE_FOR_nothing;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the insn used to implement mode MODE of OP, or CODE_FOR_nothing
|
/* Return the insn used to implement mode MODE of OP, or CODE_FOR_nothing
|
||||||
|
|
@ -1090,8 +1085,7 @@ set_convert_optab_handler (convert_optab op, enum machine_mode to_mode,
|
||||||
static inline enum insn_code
|
static inline enum insn_code
|
||||||
direct_optab_handler (direct_optab op, enum machine_mode mode)
|
direct_optab_handler (direct_optab op, enum machine_mode mode)
|
||||||
{
|
{
|
||||||
return (enum insn_code) (op->handlers[(int) mode].insn_code
|
return op->handlers[(int) mode].insn_code;
|
||||||
+ (int) CODE_FOR_nothing);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Record that insn CODE should be used to implement mode MODE of OP. */
|
/* Record that insn CODE should be used to implement mode MODE of OP. */
|
||||||
|
|
@ -1100,7 +1094,7 @@ static inline void
|
||||||
set_direct_optab_handler (direct_optab op, enum machine_mode mode,
|
set_direct_optab_handler (direct_optab op, enum machine_mode mode,
|
||||||
enum insn_code code)
|
enum insn_code code)
|
||||||
{
|
{
|
||||||
op->handlers[(int) mode].insn_code = (int) code - (int) CODE_FOR_nothing;
|
op->handlers[(int) mode].insn_code = code;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true if UNOPTAB is for a trapping-on-overflow operation. */
|
/* Return true if UNOPTAB is for a trapping-on-overflow operation. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue