GNU Compiler Collection (GCC) Internals: Example

Next: RTL Template, Previous: Patterns, Up: Machine Desc [Contents][Index]

### 16.3 Example of `define_insn`

Here is an actual example of an instruction pattern, for the 68000/68020.

    (define_insn "tstsi"
      [(set (cc0)
            (match_operand:SI 0 "general_operand" "rm"))]
      ""
      "*
    {
      if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
        return \"tstl %0\";
      return \"cmpl #0,%0\";
    }")

This can also be written using braced strings:

    (define_insn "tstsi"
      [(set (cc0)
            (match_operand:SI 0 "general_operand" "rm"))]
      ""
    {
      if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
        return "tstl %0";
      return "cmpl #0,%0";
    })

This is an instruction that sets the condition codes based on the value of a general operand. It has no condition, so any insn whose RTL description has the form shown may be handled according to this pattern. The name ‘`tstsi`’ means “test a `SImode` value” and tells the RTL generation pass that, when it is necessary to test such a value, an insn to do so can be constructed using this pattern.

The output control string is a piece of C code which chooses which output template to return based on the kind of operand and the specific type of CPU for which code is being generated.

‘`"rm"`’ is an operand constraint. Its meaning is explained below.