> Hi!
>
> This is something I've noticed while working on the rotate recognizer
> patch I've just posted. We emit say
> roll %eax
> instead of
> roll $1, %eax
> because the former is shorter, but emit
> roll $31, %eax
> instead of the equivalent, but shorter
> rorl %eax
> The following patch let us optimize even those. Bootstrapped/regtested
> on x86_64-linux and i686-linux, ok for trunk?
>
> 2013-05-09 Jakub Jelinek <[email protected]>
>
> * config/i386/i386.md (rotateinv): New code attr.
> (*<rotate_insn><mode>3_1, *<rotate_insn>si3_1_zext,
> *<rotate_insn>qi3_1_slp): Emit rorl %eax instead of
> roll $31, %eax, etc.
Going this route you will also need to update
[(set_attr "type" "rotate1")
(set (attr "length_immediate")
(if_then_else
(and (match_operand 1 "const1_operand")
(ior (match_test "TARGET_SHIFT1")
(match_test "optimize_function_for_size_p (cfun)")))
(const_string "0")
(const_string "*")))
(set_attr "mode" "QI")])
computing the immediate size. Why we can't canonicalize this in
folding/simplify_rtx/combiner? I do not see much benefit allowing both
forms of instructions in our insn streams...
Honza