are no versions that pair @code{smax} with @code{umin} or @code{umax}
with @code{smin}.
+It is also possible to use other types of attributes as codes,
+in a similar way. For example, an int iterator could be used to
+iterate over @code{unspec} numbers, with an int attribute specifying
+an associated rtx code. @xref{Int Iterators}.
+
Here's an example of code iterators in action, taken from the MIPS port:
@smallexample
consistent format. Return a representative code. */
static rtx_code
-check_code_attribute (mapping *attr)
+check_attribute_codes (mapping *attr)
{
rtx_code bellwether = UNKNOWN;
for (map_value *v = attr->values; v != 0; v = v->next)
{
rtx_code code = maybe_find_code (v->string);
if (code == UNKNOWN)
- fatal_with_file_and_line ("code attribute `%s' contains "
+ fatal_with_file_and_line ("attribute `%s' contains "
"unrecognized rtx code `%s'",
attr->name, v->string);
if (bellwether == UNKNOWN)
bellwether = code;
else if (strcmp (GET_RTX_FORMAT (bellwether),
GET_RTX_FORMAT (code)) != 0)
- fatal_with_file_and_line ("code attribute `%s' combines "
+ fatal_with_file_and_line ("attribute `%s' combines "
"`%s' and `%s', which have different "
"rtx formats", attr->name,
GET_RTX_NAME (bellwether),
fatal_with_file_and_line ("unrecognized REG_NOTE name: `%s'", string);
}
-/* Allocate an rtx for code NAME. If NAME is a code iterator or code
+/* Allocate an rtx for code NAME. If NAME is a code iterator or an
attribute, record its use for later and use one of its possible
values as an interim rtx code. */
attr = deferred_name;
/* Find the attribute itself. */
- mapping *m = (mapping *) htab_find (codes.attrs, &attr);
+ mapping *m = nullptr;
+ for (auto attrs : { codes.attrs, ints.attrs, modes.attrs })
+ if (auto *newm = (mapping *) htab_find (attrs, &attr))
+ {
+ if (m)
+ fatal_with_file_and_line ("ambiguous attribute `%s`", attr);
+ m = newm;
+ }
if (!m)
- fatal_with_file_and_line ("unknown code attribute `%s'", attr);
+ fatal_with_file_and_line ("unknown attribute `%s'", attr);
/* Pick the first possible code for now, and record the attribute
use for later. */
- rtx x = rtx_alloc (check_code_attribute (m));
+ rtx x = rtx_alloc (check_attribute_codes (m));
record_attribute_use (&codes, get_current_location (),
x, 0, deferred_name);
return x;