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