powerpc: Handle DImode rotatert implemented with rlwinm (PR69946)
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 26 Feb 2016 18:49:18 +0000 (19:49 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 26 Feb 2016 18:49:18 +0000 (19:49 +0100)
commitd1f2bea53f8990253f655cfa22815046efb2ed87
treea2ab31b8e1412e6c8eac442b1a4af5a6c6090a3e
parent4a4f9d2bf86ef5f48d45ad39802d34dc349f6509
powerpc: Handle DImode rotatert implemented with rlwinm (PR69946)

Some DImode rotate-right-and-mask can be implemented best with a rlwinm
instruction: those that could be a lshiftrt instead of a rotatert, while
the mask is not right-aligned.  Why the rotate in the testcase is not
optimised to a plain shift is another question, but we need to handle
it here anyway.  We compute the shift amount for a 64-bit rotate.  This
is 32 too high in this case; if we print using %h that is masked out (and
this doesn't silently let through invalid instructions, everything is
checked by rs6000_is_valid_shift_mask which is much more thorough).

PR target/69946
* config/rs6000/rs6000.c (rs6000_insn_for_shift_mask): Print rlwinm
shift amount using %h.  Add comment.

gcc/testsuite/
* gcc.target/powerpc/pr69946.c: New file.

From-SVN: r233755
gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr69946.c [new file with mode: 0644]