* machmode.def (Pmode): Redefine if GENERATOR_FILE.
* genrecog.c (maybe_both_true_mode): New.
(maybe_both_true_2): Use it.
(write_switch): Don't put Pmode in a switch.
* rtl.c (mode arrays): Don't explicitly size them.
From-SVN: r44029
+2001-07-15 Richard Henderson <rth@redhat.com>
+
+ * machmode.def (Pmode): Redefine if GENERATOR_FILE.
+ * genrecog.c (maybe_both_true_mode): New.
+ (maybe_both_true_2): Use it.
+ (write_switch): Don't put Pmode in a switch.
+ * rtl.c (mode arrays): Don't explicitly size them.
+
Sun Jul 15 14:07:36 CEST 2001 Jan Hubicka <jh@suse.cz>
* toplev.c (rest_of_compilation): Fix register_life_up_to_date
static struct decision *add_to_sequence
PARAMS ((rtx, struct decision_head *, const char *, enum routine_type, int));
+static int maybe_both_true_mode
+ PARAMS ((enum machine_mode, enum machine_mode));
static int maybe_both_true_2
PARAMS ((struct decision_test *, struct decision_test *));
static int maybe_both_true_1
return sub;
}
\f
+/* A subroutine of maybe_both_true; compares two modes.
+ Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
+
+static int
+maybe_both_true_mode (m1, m2)
+ enum machine_mode m1, m2;
+{
+ enum mode_class other_mode_class;
+
+ /* Pmode is not a distinct mode. We do know that it is
+ either MODE_INT or MODE_PARTIAL_INT though. */
+ if (m1 == Pmode)
+ other_mode_class = GET_MODE_CLASS (m2);
+ else if (m2 == Pmode)
+ other_mode_class = GET_MODE_CLASS (m1);
+ else
+ return m1 == m2;
+
+ return (other_mode_class == MODE_INT
+ || other_mode_class == MODE_PARTIAL_INT
+ ? -1 : 0);
+}
+
/* A subroutine of maybe_both_true; examines only one test.
Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
switch (d1->type)
{
case DT_mode:
- return d1->u.mode == d2->u.mode;
+ return maybe_both_true_mode (d1->u.mode, d2->u.mode);
case DT_code:
return d1->u.code == d2->u.code;
{
if (d2->type == DT_mode)
{
- if (d1->u.pred.mode != d2->u.mode
+ if (maybe_both_true_mode (d1->u.pred.mode, d2->u.mode) == 0
/* The mode of an address_operand predicate is the
mode of the memory, not the operand. It can only
be used for testing the predicate, so we must
|| type == DT_elt_one_int
|| type == DT_elt_zero_wide_safe)
{
+ /* Pmode may not be a compile-time constant. */
+ if (type == DT_mode && p->tests->u.mode == Pmode)
+ return p;
+
printf (" switch (");
switch (type)
{
if (nodes_identical_1 (p->tests, q->tests))
goto case_done;
+ /* Pmode may not be a compile-time constant. */
+ if (type == DT_mode && p->tests->u.mode == Pmode)
+ goto case_done;
+
if (p != start && p->need_label && needs_label == NULL)
needs_label = p;
#undef CC
/* The symbol Pmode stands for one of the above machine modes (usually SImode).
- The tm file specifies which one. It is not a distinct mode. */
+ The tm file specifies which one. It is not a distinct mode. Nevertheless,
+ while processing the md file, we wish to treat as a distinct mode so that
+ it is preserved intact through to the insn-foo.c files. This eliminates a
+ lot of redundancy in ports that support both 32-bit and 64-bit targets. */
+#ifdef GENERATOR_FILE
+#undef Pmode
+DEF_MACHMODE (Pmode, "P", MODE_RANDOM, 0, 0, 0, VOIDmode)
+#endif
/*
Local variables:
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) NAME,
-const char * const mode_name[(int) MAX_MACHINE_MODE + 1] = {
+const char * const mode_name[] = {
#include "machmode.def"
- /* Add an extra field to avoid a core dump if someone tries to convert
- MAX_MACHINE_MODE to a string. */
- ""
};
#undef DEF_MACHMODE
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) CLASS,
-const enum mode_class mode_class[(int) MAX_MACHINE_MODE] = {
+const enum mode_class mode_class[] = {
#include "machmode.def"
};
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) BITSIZE,
-const unsigned int mode_bitsize[(int) MAX_MACHINE_MODE] = {
+const unsigned int mode_bitsize[] = {
#include "machmode.def"
};
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) SIZE,
-const unsigned int mode_size[(int) MAX_MACHINE_MODE] = {
+const unsigned int mode_size[] = {
#include "machmode.def"
};
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) UNIT,
-const unsigned int mode_unit_size[(int) MAX_MACHINE_MODE] = {
+const unsigned int mode_unit_size[] = {
#include "machmode.def" /* machine modes are documented here */
};
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) \
(unsigned char) WIDER,
-const unsigned char mode_wider_mode[(int) MAX_MACHINE_MODE] = {
+const unsigned char mode_wider_mode[] = {
#include "machmode.def" /* machine modes are documented here */
};
/* Indexed by machine mode, gives mask of significant bits in mode. */
-const unsigned HOST_WIDE_INT mode_mask_array[(int) MAX_MACHINE_MODE] = {
+const unsigned HOST_WIDE_INT mode_mask_array[] = {
#include "machmode.def"
};