OSDN Git Service

* jump.c (jump_optimize, follow_jumps, mark_jump_label): Disable some
[pf3gnuchains/gcc-fork.git] / gcc / genopinit.c
index 13ebc0a..3087e38 100644 (file)
@@ -1,5 +1,5 @@
 /* Generate code to initialize optabs from machine description.
-   Copyright (C) 1993 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -15,7 +15,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 
 #include <stdio.h>
@@ -63,49 +64,53 @@ void fancy_abort ();
    used for comparisons.  In that case, %c and %C are the lower-case and
    upper-case forms of the comparison, respectively.  */
 
+/* The reason we use \% is to avoid sequences of the form %-capletter-%
+   which SCCS treats as magic.  This gets warnings which you should ignore.  */
+
 char *optabs[] =
-{ "extendtab[(int) %B][(int) %A][0] = CODE_FOR_%(extend%a%b2%)",
-  "extendtab[(int) %B][(int) %A][1] = CODE_FOR_%(zero_extend%a%b2%)",
-  "fixtab[(int) %A][(int) %B][0] = CODE_FOR_%(fix%F%a%I%b2%)",
-  "fixtab[(int) %A][(int) %B][1] = CODE_FOR_%(fixuns%F%a%b2%)",
-  "fixtrunctab[(int) %A][(int) %B][0] = CODE_FOR_%(fix_trunc%F%a%I%b2%)",
-  "fixtrunctab[(int) %A][(int) %B][1] = CODE_FOR_%(fixuns_trunc%F%a%I%b2%)",
-  "floattab[(int) %B][(int) %A][0] = CODE_FOR_%(float%I%a%F%b2%)",
-  "floattab[(int) %B][(int) %A][1] = CODE_FOR_%(floatuns%I%a%F%b%)",
+{ "extendtab[(int) %B][(int) %A][0] = CODE_FOR_%(extend%a\%b2%)",
+  "extendtab[(int) %B][(int) %A][1] = CODE_FOR_%(zero_extend%a\%b2%)",
+  "fixtab[(int) %A][(int) %B][0] = CODE_FOR_%(fix%F\%a%I\%b2%)",
+  "fixtab[(int) %A][(int) %B][1] = CODE_FOR_%(fixuns%F\%a%b2%)",
+  "fixtrunctab[(int) %A][(int) %B][0] = CODE_FOR_%(fix_trunc%F\%a%I\%b2%)",
+  "fixtrunctab[(int) %A][(int) %B][1] = CODE_FOR_%(fixuns_trunc%F\%a%I\%b2%)",
+  "floattab[(int) %B][(int) %A][0] = CODE_FOR_%(float%I\%a%F\%b2%)",
+  "floattab[(int) %B][(int) %A][1] = CODE_FOR_%(floatuns%I\%a%F\%b2%)",
   "add_optab->handlers[(int) %A].insn_code = CODE_FOR_%(add%a3%)",
   "sub_optab->handlers[(int) %A].insn_code = CODE_FOR_%(sub%a3%)",
   "smul_optab->handlers[(int) %A].insn_code = CODE_FOR_%(mul%a3%)",
+  "umul_highpart_optab->handlers[(int) %A].insn_code = CODE_FOR_%(umul%a3_highpart%)",
+  "smul_highpart_optab->handlers[(int) %A].insn_code = CODE_FOR_%(smul%a3_highpart%)",
   "smul_widen_optab->handlers[(int) %B].insn_code = CODE_FOR_%(mul%a%b3%)%N",
   "umul_widen_optab->handlers[(int) %B].insn_code = CODE_FOR_%(umul%a%b3%)%N",
-  "sdiv_optab->handlers[(int) %A].insn_code = CODE_FOR_%(div%I%a3%)",
-  "udiv_optab->handlers[(int) %A].insn_code = CODE_FOR_%(udiv%I%a3%)",
+  "sdiv_optab->handlers[(int) %A].insn_code = CODE_FOR_%(div%I\%a3%)",
+  "udiv_optab->handlers[(int) %A].insn_code = CODE_FOR_%(udiv%I\%a3%)",
   "sdivmod_optab->handlers[(int) %A].insn_code = CODE_FOR_%(divmod%a4%)",
   "udivmod_optab->handlers[(int) %A].insn_code = CODE_FOR_%(udivmod%a4%)",
   "smod_optab->handlers[(int) %A].insn_code = CODE_FOR_%(mod%a3%)",
   "umod_optab->handlers[(int) %A].insn_code = CODE_FOR_%(umod%a3%)",
-  "flodiv_optab->handlers[(int) %A].insn_code = CODE_FOR_%(div%F%a3%)",
-  "ftrunc_optab->handlers[(int) %A].insn_code = CODE_FOR_%(ftrunc%F%a2%)",
+  "flodiv_optab->handlers[(int) %A].insn_code = CODE_FOR_%(div%F\%a3%)",
+  "ftrunc_optab->handlers[(int) %A].insn_code = CODE_FOR_%(ftrunc%F\%a2%)",
   "and_optab->handlers[(int) %A].insn_code = CODE_FOR_%(and%a3%)",
   "ior_optab->handlers[(int) %A].insn_code = CODE_FOR_%(ior%a3%)",
   "xor_optab->handlers[(int) %A].insn_code = CODE_FOR_%(xor%a3%)",
   "ashl_optab->handlers[(int) %A].insn_code = CODE_FOR_%(ashl%a3%)",
   "ashr_optab->handlers[(int) %A].insn_code = CODE_FOR_%(ashr%a3%)",
-  "lshl_optab->handlers[(int) %A].insn_code = CODE_FOR_%(lshl%a3%)",
   "lshr_optab->handlers[(int) %A].insn_code = CODE_FOR_%(lshr%a3%)",
   "rotl_optab->handlers[(int) %A].insn_code = CODE_FOR_%(rotl%a3%)",
   "rotr_optab->handlers[(int) %A].insn_code = CODE_FOR_%(rotr%a3%)",
-  "smin_optab->handlers[(int) %A].insn_code = CODE_FOR_%(smin%I%a3%)",
-  "smin_optab->handlers[(int) %A].insn_code = CODE_FOR_%(min%F%a3%)",
-  "smax_optab->handlers[(int) %A].insn_code = CODE_FOR_%(smax%I%a3%)",
-  "smax_optab->handlers[(int) %A].insn_code = CODE_FOR_%(max%F%a3%)",
-  "umin_optab->handlers[(int) %A].insn_code = CODE_FOR_%(umin%I%a3%)",
-  "umax_optab->handlers[(int) %A].insn_code = CODE_FOR_%(umax%I%a3%)",
+  "smin_optab->handlers[(int) %A].insn_code = CODE_FOR_%(smin%I\%a3%)",
+  "smin_optab->handlers[(int) %A].insn_code = CODE_FOR_%(min%F\%a3%)",
+  "smax_optab->handlers[(int) %A].insn_code = CODE_FOR_%(smax%I\%a3%)",
+  "smax_optab->handlers[(int) %A].insn_code = CODE_FOR_%(max%F\%a3%)",
+  "umin_optab->handlers[(int) %A].insn_code = CODE_FOR_%(umin%I\%a3%)",
+  "umax_optab->handlers[(int) %A].insn_code = CODE_FOR_%(umax%I\%a3%)",
   "neg_optab->handlers[(int) %A].insn_code = CODE_FOR_%(neg%a2%)",
   "abs_optab->handlers[(int) %A].insn_code = CODE_FOR_%(abs%a2%)",
   "sqrt_optab->handlers[(int) %A].insn_code = CODE_FOR_%(sqrt%a2%)",
   "sin_optab->handlers[(int) %A].insn_code = CODE_FOR_%(sin%a2%)",
   "cos_optab->handlers[(int) %A].insn_code = CODE_FOR_%(cos%a2%)",
-  "strlen_optab->handlers[(int) %A].insn_code = CODE_FOR_%(strlen%a2%)",
+  "strlen_optab->handlers[(int) %A].insn_code = CODE_FOR_%(strlen%a%)",
   "one_cmpl_optab->handlers[(int) %A].insn_code = CODE_FOR_%(one_cmpl%a2%)",
   "ffs_optab->handlers[(int) %A].insn_code = CODE_FOR_%(ffs%a2%)",
   "mov_optab->handlers[(int) %A].insn_code = CODE_FOR_%(mov%a%)",
@@ -114,9 +119,14 @@ char *optabs[] =
   "tst_optab->handlers[(int) %A].insn_code = CODE_FOR_%(tst%a%)",
   "bcc_gen_fctn[(int) %C] = gen_%(b%c%)",
   "setcc_gen_code[(int) %C] = CODE_FOR_%(s%c%)",
+  "movcc_gen_code[(int) %A] = CODE_FOR_%(mov%acc%)",
   "reload_in_optab[(int) %A] = CODE_FOR_%(reload_in%a%)",
   "reload_out_optab[(int) %A] = CODE_FOR_%(reload_out%a%)",
-  "movstr_optab[(int) %A] = CODE_FOR_%(movstr%a%)" };
+  "movstr_optab[(int) %A] = CODE_FOR_%(movstr%a%)",
+  "clrstr_optab[(int) %A] = CODE_FOR_%(clrstr%a%)" };
+
+/* Allow linking with print-rtl.c.  */
+char **insn_name_ptr;
 
 static void
 gen_insn (insn)
@@ -175,9 +185,7 @@ gen_insn (insn)
 
                    /* We have to be concerned about matching "gt" and
                       missing "gtu", e.g., so verify we have reached the
-                      end of thing we are to match.  We do not have this
-                      problem with modes since no mode is a prefix of
-                      another.  */
+                      end of thing we are to match.  */
                    if (*p == 0 && *q == 0 && rtx_class[op] == '<')
                      break;
                  }
@@ -189,7 +197,11 @@ gen_insn (insn)
                break;
              case 'a':
              case 'b':
-               for (i = 0; i < (int) MAX_MACHINE_MODE; i++)
+               /* This loop will stop at the first prefix match, so
+                   look through the modes in reverse order, in case
+                   EXTRA_CC_MODES was used and CC is a prefix of the
+                   CC modes (as it should be).  */
+               for (i = ((int) MAX_MACHINE_MODE) - 1; i >= 0; i--)
                  {
                    for (p = mode_name[i], q = np; *p; p++, q++)
                      if (tolower (*p) != *q)
@@ -201,7 +213,7 @@ gen_insn (insn)
                      break;
                  }
 
-               if (i == (int) MAX_MACHINE_MODE)
+               if (i < 0)
                  matches = 0;
                else if (*pp == 'a')
                  m1 = i, np += strlen (mode_name[i]);
@@ -218,7 +230,7 @@ gen_insn (insn)
 
       if (matches && pp[0] == '%' && pp[1] == ')'
          && *np == 0
-         && (! force_consec || (int) mode_wider_mode[m1] == m2))
+         && (! force_consec || (int) GET_MODE_WIDER_MODE(m1) == m2))
        break;
     }