Examples - GNU Compiler Collection (GCC) Internals
Description: GNU Compiler Collection (GCC) Internals

Previous: Substitutions, Up: Mode Iterators

##### 16.22.1.3 Mode Iterator Examples

Here is an example from the MIPS port. It defines the following modes and attributes (among others):

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

and uses the following template to define both `subsi3` and `subdi3`:

         (define_insn "sub<mode>3"
           [(set (match_operand:GPR 0 "register_operand" "=d")
                 (minus:GPR (match_operand:GPR 1 "register_operand" "d")
                            (match_operand:GPR 2 "register_operand" "d")))]
           ""
           "<d>subu\t%0,%1,%2"
           [(set_attr "type" "arith")
            (set_attr "mode" "<MODE>")])

This is exactly equivalent to:

         (define_insn "subsi3"
           [(set (match_operand:SI 0 "register_operand" "=d")
                 (minus:SI (match_operand:SI 1 "register_operand" "d")
                           (match_operand:SI 2 "register_operand" "d")))]
           ""
           "subu\t%0,%1,%2"
           [(set_attr "type" "arith")
            (set_attr "mode" "SI")])

         (define_insn "subdi3"
           [(set (match_operand:DI 0 "register_operand" "=d")
                 (minus:DI (match_operand:DI 1 "register_operand" "d")
                           (match_operand:DI 2 "register_operand" "d")))]
           ""
           "dsubu\t%0,%1,%2"
           [(set_attr "type" "arith")
            (set_attr "mode" "DI")])