> 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 <ja...@redhat.com> > > * 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