Hi Andrew,

+   (set_attr "length"  "5")] ;; Worst case sceanario.  FIXME: If we defined 
separate patterns
+)                            ;; rather than using iterators we could specify 
exact sizes.

You can set up the correct length even without using separate patterns.

The problem is that the lengths depend upon an *two* iterators and the MEM involved as well. For example:

  (define_insn "*comparesi3_<extend_types:code><small_int_modes:mode>"
    [(set (reg:CC CC_REG)
          (compare:CC (match_operand:SI
                         0 "register_operand" "=r")
                      (extend_types:SI (match_operand:small_int_modes
                         1 "rx_restricted_mem_operand" "Q"))))]
    ""
    "cmp\t%<extend_types:letter>1, %0"
    [(set_attr "timings" "33")
     (set_attr "length"  "5")] ;; Worst case sceanario.  FIXME:

This insn is 2 bytes long if operand[1] is just MEM (REG) (ie no offset) *and* the extend_types is zero-extend. It is 3 bytes long if operands[1] is MEM (REG) and the extend_types is sign-extend. It is also 3 bytes long if operands[1] is MEM (REG+INT) and the INT is < 256 (for QImode extensions) or less than (256 * 2) for HImode extensions and the extend type is zero-extend. It is 4 bytes long if ... [snip - you get the idea].

So really I think that I should be defining the ADJUST_INSN_LENGTH macro to handle these patterns. I'll look into that.

Cheers
  Nick

Reply via email to