]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gensupport.c (init_rtx_reader_args_cb): Start counting code generating patterns from...
authorSteven Bosscher <steven@gcc.gnu.org>
Mon, 9 Jul 2012 08:45:12 +0000 (08:45 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Mon, 9 Jul 2012 08:45:12 +0000 (08:45 +0000)
* 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 &nothing.
(idata_end): Initialize to &nothing.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

gcc/ChangeLog
gcc/gencodes.c
gcc/genoutput.c
gcc/genpeep.c
gcc/gensupport.c
gcc/optabs.h

index 6ff48665ed562cdfb212643ed5e5aa533dadcf54..96d4cf2d5d90a4cea1446419be66ba9a0642cc6c 100644 (file)
@@ -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 &nothing.
+       (idata_end): Initialize to &nothing.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>
 
        * config/sh/sh.md (*return_i): Move trap_exit attribute check to ...
index 168be701bacc8b6b2e04e9659ee6bbe6ea29e66e..e95eb98cb88b0c47dc0acd7c0b98f627c013c527 100644 (file)
@@ -2,7 +2,7 @@
    - some macros CODE_FOR_... giving the insn_code_number value
    for each of the defined standard insn names.
    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.
 
@@ -68,7 +68,8 @@ main (int argc, char **argv)
 #ifndef GCC_INSN_CODES_H\n\
 #define GCC_INSN_CODES_H\n\
 \n\
-enum insn_code {");
+enum insn_code {\n\
+  CODE_FOR_nothing = 0,\n");
 
   /* Read the machine description.  */
 
@@ -85,7 +86,7 @@ enum insn_code {");
        gen_insn (desc, insn_code_number);
     }
 
-  puts ("  CODE_FOR_nothing\n\
+  puts ("  LAST_INSN_CODE\n\
 };\n\
 \n\
 #endif /* GCC_INSN_CODES_H */");
index bae2381c9aa2d642eb35b49f8cc67c31375d4468..4e4e1edc6acd565a12fff0efac700de54622bdef 100644 (file)
@@ -1,6 +1,7 @@
 /* Generate code from to output assembler insns as recognized from rtl.
    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.
 
@@ -171,9 +172,16 @@ struct data
   struct operand_data operand[MAX_MAX_OPERANDS];
 };
 
+/* 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 = &nothing;
+
+/* 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 = &nothing.next;
 
-static struct data *idata, **idata_end = &idata;
 \f
 static void output_prologue (void);
 static void output_operand_data (void);
@@ -987,6 +995,14 @@ gen_split (rtx split, int lineno)
   place_operands (d);
 }
 
+static void
+init_insn_for_nothing (void)
+{
+  memset (&nothing, 0, sizeof (nothing));
+  nothing.name = "*placeholder_for_nothing";
+  nothing.filename = "<internal>";
+}
+
 extern int main (int, char **);
 
 int
@@ -996,11 +1012,12 @@ main (int argc, char **argv)
 
   progname = "genoutput";
 
+  init_insn_for_nothing ();
+
   if (!init_rtx_reader_args (argc, argv))
     return (FATAL_EXIT_CODE);
 
   output_prologue ();
-  next_code_number = 0;
   next_index_number = 0;
 
   /* Read the machine description.  */
index a6f1033eada52d2897ad7f9b59ecbaa438da8a6b..dfbf037407a016ca6bbcb9dc50c51f674d3b2a57 100644 (file)
@@ -1,6 +1,6 @@
 /* Generate code from machine description to perform peephole optimizations.
    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.
 
@@ -47,18 +47,13 @@ static int max_opno;
 
 static int n_operands;
 
-/* Peephole optimizations get insn codes just like insn patterns.
-   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 gen_peephole (rtx, int);
 static void match_rtx (rtx, struct link *, int);
 static void print_path (struct link *);
 static void print_code (RTX_CODE);
 \f
 static void
-gen_peephole (rtx peep)
+gen_peephole (rtx peep, int insn_code_number)
 {
   int ninsns = XVECLEN (peep, 0);
   int i;
@@ -392,24 +387,15 @@ from the machine description file `md'.  */\n\n");
 
   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)
        break;
 
-       if (GET_CODE (desc) == DEFINE_PEEPHOLE)
-       {
-         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++;
-       }
+      if (GET_CODE (desc) == DEFINE_PEEPHOLE)
+       gen_peephole (desc, insn_code_number);
     }
 
   printf ("  return 0;\n}\n\n");
index e56291e3a383297084dd0116090557e56fc903f9..44443e2dce3d6200395fe78138125443c4c88670 100644 (file)
@@ -1,6 +1,6 @@
 /* Support routines for the various generation passes.
    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.
 
@@ -38,6 +38,10 @@ int insn_elision = 1;
 static struct 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 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);
   init_predicate_table ();
   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);
 
@@ -1419,7 +1425,11 @@ init_rtx_reader_args (int argc, char **argv)
   return init_rtx_reader_args_cb (argc, argv, 0);
 }
 \f
-/* 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
 read_md_rtx (int *lineno, int *seqnr)
index 70a7395cc0525d0dd301c52d2aed56c9765f0f3d..d87aff81c9381e8467ce40fdf4346f1dc4593f2e 100644 (file)
@@ -1,6 +1,6 @@
 /* Definitions for code generation pass of GNU compiler.
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+   2010, 2012  Free Software Foundation, Inc.
 
 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.
 
+   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
    can be used to perform the operation.
 
@@ -36,10 +40,7 @@ along with GCC; see the file COPYING3.  If not see
 
 struct optab_handlers
 {
-  /* I - CODE_FOR_nothing, where I is either the insn code of the
-     associated insn generator or CODE_FOR_nothing if there is no such
-     insn on the target machine.  */
-  int insn_code;
+  enum insn_code insn_code;
 };
 
 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
 optab_handler (optab op, enum machine_mode mode)
 {
-  return (enum insn_code) (op->handlers[(int) mode].insn_code
-                          + (int) CODE_FOR_nothing);
+  return op->handlers[(int) mode].insn_code;
 }
 
 /* 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);
 
   if (op->widening)
-    return (enum insn_code) (op->widening->handlers[(int) to_mode][(int) from_mode].insn_code
-                            + (int) CODE_FOR_nothing);
+    return op->widening->handlers[(int) to_mode][(int) from_mode].insn_code;
 
   return CODE_FOR_nothing;
 }
@@ -1037,7 +1036,7 @@ widening_optab_handler (optab op, enum machine_mode to_mode,
 static inline void
 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
@@ -1055,8 +1054,7 @@ set_widening_optab_handler (optab op, enum machine_mode to_mode,
        op->widening = (struct widening_optab_handlers *)
              xcalloc (1, sizeof (struct widening_optab_handlers));
 
-      op->widening->handlers[(int) to_mode][(int) from_mode].insn_code
-         = (int) code - (int) CODE_FOR_nothing;
+      op->widening->handlers[(int) to_mode][(int) from_mode].insn_code = code;
     }
 }
 
@@ -1068,9 +1066,7 @@ static inline enum insn_code
 convert_optab_handler (convert_optab op, enum machine_mode to_mode,
                       enum machine_mode from_mode)
 {
-  return ((enum insn_code)
-         (op->handlers[(int) to_mode][(int) from_mode].insn_code
-          + (int) CODE_FOR_nothing));
+  return op->handlers[(int) to_mode][(int) from_mode].insn_code;
 }
 
 /* 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,
                           enum machine_mode from_mode, enum insn_code code)
 {
-  op->handlers[(int) to_mode][(int) from_mode].insn_code
-    = (int) code - (int) CODE_FOR_nothing;
+  op->handlers[(int) to_mode][(int) from_mode].insn_code = code;
 }
 
 /* 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
 direct_optab_handler (direct_optab op, enum machine_mode mode)
 {
-  return (enum insn_code) (op->handlers[(int) mode].insn_code
-                          + (int) CODE_FOR_nothing);
+  return op->handlers[(int) mode].insn_code;
 }
 
 /* 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,
                          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.  */