/* 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.
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>
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%)",
"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)
/* 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;
}
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)
break;
}
- if (i == (int) MAX_MACHINE_MODE)
+ if (i < 0)
matches = 0;
else if (*pp == 'a')
m1 = i, np += strlen (mode_name[i]);
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;
}