diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2010-06-10 20:24:17 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2010-06-10 20:24:17 +0000 |
commit | 8f4fe86cd10bfe5e02237768c40b258b0e668abf (patch) | |
tree | 7c7c84950cd4b41af7efd6b64db9e7e3cfb1f188 /gcc/doc/md.texi | |
parent | 24609606bd4dec8c2cf5f8eaa82c44f67f4f5f6e (diff) | |
download | gcc-8f4fe86cd10bfe5e02237768c40b258b0e668abf.tar.gz |
md.texi (define_enum_attr): Document.
gcc/
* doc/md.texi (define_enum_attr): Document.
* rtl.def (DEFINE_ENUM_ATTR): New rtx.
* read-md.h (lookup_enum_type): Declare.
* read-md.c (lookup_enum_type): New function.
* genattr.c (gen_attr, main): Handle DEFINE_ENUM_ATTR.
* genattrtab.c (attr_desc): Add an enum_name field.
(evaluate_eq_attr): Take the associated attribute as argument.
Get the enum prefix from the enum_name field, if defined.
Use ACONCAT rather than a fixed-length buffer. Update recursive calls.
(simplify_test_exp): Pass attr to evaluate_eq_attr.
(add_attr_value): New function, split out from...
(gen_attr): ...here. Handle DEFINE_ENUM_ATTR.
(write_test_expr): Pass attr to evaluate_eq_attr.
(write_attr_get): Use the enum_name as the enum tag, if defined.
(write_attr_valueq): Use the enum_name as a prefix, if defined.
(find_attr): Initialize enum_name.
(main): Handle DEFINE_ENUM_ATTR.
* gensupport.c (process_rtx): Likewise.
* config/mips/mips.h (mips_tune_attr): Delete.
* config/mips/mips.md (cpu): Use define_attr_enum.
From-SVN: r160581
Diffstat (limited to 'gcc/doc/md.texi')
-rw-r--r-- | gcc/doc/md.texi | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 990863acccc..d0aa8646ede 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -6700,9 +6700,46 @@ distances. @xref{Insn Lengths}. The @code{enabled} attribute can be defined to prevent certain alternatives of an insn definition from being used during code generation. @xref{Disable Insn Alternatives}. - @end table +@findex define_enum_attr +@anchor{define_enum_attr} +Another way of defining an attribute is to use: + +@smallexample +(define_enum_attr "@var{attr}" "@var{enum}" @var{default}) +@end smallexample + +This works in just the same way as @code{define_attr}, except that +the list of values is taken from a separate enumeration called +@var{enum} (@pxref{define_enum}). This form allows you to use +the same list of values for several attributes without having to +repeat the list each time. For example: + +@smallexample +(define_enum "processor" [ + model_a + model_b + @dots{} +]) +(define_enum_attr "arch" "processor" + (const (symbol_ref "target_arch"))) +(define_enum_attr "tune" "processor" + (const (symbol_ref "target_tune"))) +@end smallexample + +defines the same attributes as: + +@smallexample +(define_attr "arch" "model_a,model_b,@dots{}" + (const (symbol_ref "target_arch"))) +(define_attr "tune" "model_a,model_b,@dots{}" + (const (symbol_ref "target_tune"))) +@end smallexample + +but without duplicating the processor list. The second example defines two +separate C enums (@code{attr_arch} and @code{attr_tune}) whereas the first +defines a single C enum (@code{processor}). @end ifset @ifset INTERNALS @node Expressions @@ -7961,6 +7998,7 @@ it is convenient to define all synchronization-specific enumeration values in @file{sync.md} rather than in the main @file{.md} file. @findex define_enum +@anchor{define_enum} Another way of defining an enumeration is to use @code{define_enum}: @smallexample @@ -7983,7 +8021,11 @@ This directive implies: ]) @end smallexample +@findex define_enum_attr where @var{cvaluei} is the capitalized form of @var{valuei}. +However, unlike @code{define_c_enum}, the enumerations defined +by @code{define_enum} can be used in attribute specifications +(@pxref{define_enum_attr}). @end ifset @ifset INTERNALS @node Iterators |