This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

extending fpmuls


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 :-)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]