##### 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.