On Thu, Feb 25, 2016 at 10:52:29AM -0500, David Edelsohn wrote: > Please add a short comment explaining why rs6000_insn_for_shift_mask > doesn't need to match the logic in rs6000_is_valid_shift_mask > converting rotates to simple shifts.
I added this comment: --- trunk/gcc/config/rs6000/rs6000.c 2016/02/26 18:17:02 233754 +++ trunk/gcc/config/rs6000/rs6000.c 2016/02/26 18:49:18 233755 @@ -17438,9 +17438,12 @@ rs6000_insn_for_shift_mask (machine_mode operands[2] = GEN_INT (32 - INTVAL (operands[2])); operands[3] = GEN_INT (31 - nb); operands[4] = GEN_INT (31 - ne); + /* This insn can also be a 64-bit rotate with mask that really makes + it just a shift right (with mask); the %h below are to adjust for + that situation (shift count is >= 32 in that case). */ if (dot) - return "rlw%I2nm. %0,%1,%2,%3,%4"; - return "rlw%I2nm %0,%1,%2,%3,%4"; + return "rlw%I2nm. %0,%1,%h2,%3,%4"; + return "rlw%I2nm %0,%1,%h2,%3,%4"; } gcc_unreachable (); Segher