I've found it useful to use a construct such as the following: (define_attr "units64" "unknown,d,d_addr,l,m,s,dl,ds,dls,ls" (const_string "unknown"))
(define_attr "units64p" "unknown,d,d_addr,l,m,s,dl,ds,dls,ls" (attr "units64")) to define one attribute in terms of another by default, allowing individual insn patterns to override the definition of "units64p" where necessary. This patch adds support for this in genattrtab. Bernd
* genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined in terms of another. Index: genattrtab.c =================================================================== --- genattrtab.c.orig +++ genattrtab.c @@ -1916,6 +1916,37 @@ evaluate_eq_attr (rtx exp, struct attr_d rtx newexp; int i; + while (GET_CODE (value) == ATTR) + { + struct attr_value *av = NULL; + + attr = find_attr (&XSTR (value, 0), 0); + + if (insn_code_values) + { + struct attr_value_list *iv; + for (iv = insn_code_values[insn_code]; iv; iv = iv->next) + if (iv->attr == attr) + { + av = iv->av; + break; + } + } + else + { + struct insn_ent *ie; + for (av = attr->first_value; av; av = av->next) + for (ie = av->first_insn; ie; ie = ie->next) + if (ie->def->insn_code == insn_code) + goto got_av; + } + if (av) + { + got_av: + value = av->value; + } + } + switch (GET_CODE (value)) { case CONST_STRING: