While working on some test cases I noticed that the 'fsmuld'
instruction on sparc was not being matched by the combiner for
things like:
double fsmuld (float a, float b)
{
return a * b;
}
Combine does try to match:
(set x (float_extend:DF (mul:SF y z)))
instead of what backends (and in particular at least Sparc and Alpha)
seem to use canonically for this pattern which is:
(set x (mul:DF (float_extend:DF y) (float_extend:DF y)))
Something similar happens for:
double fnsmuld (float a, float b)
{
return -(a * b);
}
which combine should match to the *fnsmuld sparc.md pattern,
but similar to above combine tries:
(set x (float_extend:DF (mul:SF (neg:SF y) z)))
instead of:
(set x (mul:DF (neg:DF (float_extend:DF y) (float_extend:DF z))))
Which is right? "Canonicalization of Instructions" in the internals
documentation doesn't give any guidance :-)