summaryrefslogtreecommitdiff
path: root/gcc/doc/md.texi
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2010-06-10 20:24:17 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2010-06-10 20:24:17 +0000
commit8f4fe86cd10bfe5e02237768c40b258b0e668abf (patch)
tree7c7c84950cd4b41af7efd6b64db9e7e3cfb1f188 /gcc/doc/md.texi
parent24609606bd4dec8c2cf5f8eaa82c44f67f4f5f6e (diff)
downloadgcc-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.texi44
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