for (p = XSTR (defn, 0) + 1; *p; p++)
if (!ISALNUM (*p) && *p != '_')
goto bad_name;
-
+
if (validate_exp (XEXP (defn, 1), XSTR (defn, 0), lineno))
return;
The only wart is that there's no way to insist on a { } string in
an RTL template, so we have to handle "" strings. */
-
+
static void
write_predicate_subfunction (struct pred_data *p)
{
NO_MODE_TEST (exp) = (NO_MODE_TEST (XEXP (exp, 0))
&& NO_MODE_TEST (XEXP (exp, 1)));
break;
-
+
case IOR:
mark_mode_tests (XEXP (exp, 0));
mark_mode_tests (XEXP (exp, 1));
{
int test0 = NO_MODE_TEST (XEXP (subexp, 0));
int test1 = NO_MODE_TEST (XEXP (subexp, 1));
-
+
gcc_assert (test0 || test1);
-
+
if (test0 && test1)
goto break_loop;
pos = test0 ? &XEXP (subexp, 0) : &XEXP (subexp, 1);
}
break;
-
+
case IF_THEN_ELSE:
{
int test0 = NO_MODE_TEST (XEXP (subexp, 0));
int test1 = NO_MODE_TEST (XEXP (subexp, 1));
int test2 = NO_MODE_TEST (XEXP (subexp, 2));
-
+
gcc_assert ((test0 && test1) || test2);
-
+
if (test0 && test1 && test2)
goto break_loop;
if (test0 && test1)
pos = &XEXP (subexp, 2);
}
break;
-
+
default:
goto break_loop;
}
putchar (TOUPPER (*code));
code++;
}
-
+
if (*codes == ',')
fputs (" || ", stdout);
}
write_predicate_expr (XEXP (exp, 1));
putchar (')');
break;
-
+
case IOR:
putchar ('(');
write_predicate_expr (XEXP (exp, 0));
return;
}
-
+
namelen = strlen (name);
slot = &constraints_by_letter_table[(unsigned int)name[0]];
for (iter = slot; *iter; iter = &(*iter)->next_this_letter)
else
message_with_line (lineno, "constraint names beginning with '%c' "
"(%s) are reserved for %s constraints",
- name[0], name,
+ name[0], name,
GET_RTX_NAME (appropriate_code));
have_error = 1;
}
}
-
+
c = XOBNEW (rtl_obstack, struct constraint_data);
c->name = name;
c->c_name = need_mangled_name ? mangle (name) : name;
" return 1;\n"
"}\n");
}
-
+
/* Write out the function which computes the register class corresponding
to a register constraint. */
static void
puts (" const REAL_VALUE_TYPE *rval = 0;");
if (needs_ival)
- puts (" if (GET_CODE (op) == CONST_INT)\n"
+ puts (" if (CONST_INT_P (op))\n"
" ival = INTVAL (op);");
if (needs_hval)
puts (" if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)"
puts ("extern enum reg_class regclass_for_constraint "
"(enum constraint_num);\n"
"#define REG_CLASS_FROM_CONSTRAINT(c_,s_) \\\n"
- " regclass_for_constraint (lookup_constraint (s_))\n");
+ " regclass_for_constraint (lookup_constraint (s_))\n"
+ "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n"
+ " regclass_for_constraint (x_)\n");
else
- puts ("#define REG_CLASS_FROM_CONSTRAINT(c_,s_) NO_REGS");
+ puts ("#define REG_CLASS_FROM_CONSTRAINT(c_,s_) NO_REGS\n"
+ "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n"
+ " NO_REGS\n");
if (have_const_int_constraints)
puts ("extern bool insn_const_int_ok_for_constraint "
"(HOST_WIDE_INT, enum constraint_num);\n"
puts ("#endif /* tm-preds.h */");
}
-/* Write insn-preds.c.
+/* Write insn-preds.c.
N.B. the list of headers to include was copied from genrecog; it
may not be ideal.
#include \"function.h\"\n\
#include \"insn-config.h\"\n\
#include \"recog.h\"\n\
-#include \"real.h\"\n\
#include \"output.h\"\n\
#include \"flags.h\"\n\
#include \"hard-reg-set.h\"\n\
if (have_register_constraints)
write_regclass_for_constraint ();
write_constraint_satisfied_p ();
-
+
if (have_const_int_constraints)
write_insn_const_int_ok_for_constraint ();