On Sun, Jul 12, 2015 at 04:18:31PM -0400, David Edelsohn wrote:
> On Sun, Jul 12, 2015 at 1:08 PM, Segher Boessenkool
> <[email protected]> wrote:
> > This rewrites all the rotate-and-mask and insert patterns.
>
> This is great! I'm glad that you completed this feature.
Compared to mainline the results do look good, and some of bugs I
found in the old patterns have disappeared. I particularly like the
fact that the "S" and "T" operand constraints are no longer needed.
There are one or two regressions related to a TODO that Segher added.
The following produces poorer code than mainline.
extern void lfoo (long);
void mask2_cond1 (long x)
{
if ((x & 0x00fff000000fffffL) > 0)
lfoo (0);
}
void mask2_cond2 (long x)
{
if ((x & 0x00fff000000fffffL) > 0)
lfoo (x & 0x00fff000000fffffL);
}
Also, rs6000.md patterns uses SImode for the rotate/shift count.
Segher has added some new insns that use DImode when 64-bit. I think
that inconsistency ought to be fixed.
(I haven't completely analysed this) but won't
(define_insn_and_split "*and<mode>3_imm_dot_shifted"
[snip]
(lshiftrt:GPR (match_operand:GPR 1 "gpc_reg_operand" "%r,r")
(match_operand:GPR 4 "const_int_operand" "n,n"))
^^^this
fail to match combined patterns generated from other rs6000.md
patterns like
(define_insn "lshr<mode>3"
[(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
(lshiftrt:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
(match_operand:SI 2 "reg_or_cint_operand" "rn")))]
^^this?
--
Alan Modra
Australia Development Lab, IBM