Next: , Up: Mode Iterators


16.22.1.1 Defining Mode Iterators

The syntax for defining a mode iterator is:

     (define_mode_iterator name [(mode1 "cond1") ... (moden "condn")])

This allows subsequent .md file constructs to use the mode suffix :name. Every construct that does so will be expanded n times, once with every use of :name replaced by :mode1, once with every use replaced by :mode2, and so on. In the expansion for a particular modei, every C condition will also require that condi be true.

For example:

     (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])

defines a new mode suffix :P. Every construct that uses :P will be expanded twice, once with every :P replaced by :SI and once with every :P replaced by :DI. The :SI version will only apply if Pmode == SImode and the :DI version will only apply if Pmode == DImode.

As with other .md conditions, an empty string is treated as “always true”. (mode "") can also be abbreviated to mode. For example:

     (define_mode_iterator GPR [SI (DI "TARGET_64BIT")])

means that the :DI expansion only applies if TARGET_64BIT but that the :SI expansion has no such constraint.

Iterators are applied in the order they are defined. This can be significant if two iterators are used in a construct that requires substitutions. See Substitutions.