[PATCH, i386]: Rewrite x87 sqrt patterns, take 2a (macroized)

Roger Sayle roger@eyesopen.com
Sat Nov 25 03:47:00 GMT 2006

Hi Uros,

On Fri, 24 Nov 2006, Uros Bizjak wrote:
> 2006-11-24  Uros Bizjak  <ubizjak@gmail.com>
> 	config/i386/i386.md (UNSPEC_TRUNC_NOOP): New unspec definition.
> 	(X87MODEF): New mode macro.
> 	(ssemodefsuffix): New mode attribute.
> 	(truncxf<mode>2_i387_noop_unspec): New insn pattern.
> 	(sqrt_extend<mode>xf2_i387): New insn pattern.
> 	(sqrt<mode>2): For non-SSE sqrt, emit sqrt_extend<mode>xf2_i387
> 	insn and truncate result back to original mode using
> 	UNSPEC_TRUNC_NOOP truncation.
> 	(*sqrt<mode>2_sse): Implement using SSEMODEF mode macro and
> 	ssemodefsuffix mode attribute.
> 	(*sqrtsf2_mixed, *sqrtsf2_i387, *sqrtdf2_mixed, *sqrtdf2_i387)
> 	(*sqrtextendsfdf2_i387, *sqrtextendsfxf2_i387)
> 	(*sqrtextenddfxf2_i387): Remove insn patterns.
> 	(fmodsf3, fmoddf3, remaindersf3, remainderdf3): Use noop
> 	truncation patterns.
> 	reg-stack.c (get_true_reg): Handle UNSPEC_TRUNC_NOOP.

This patch looks like a step in the right direction.  Ok for mainline.

However my brain isn't working at the moment, so I'm unsure whether and
how the UNSPEC_TRUNC_NOOP gets optimized away with -ffast-math.  For
example, i386.c's output_387_reg_move doesn't appear to do anything
clever when operands[0] == operands[1].  However even without
understanding exactly what's going on, I agree with the philosophy
of making the XFmode operations more explicit and using macros to
simplify the backends patterns, and I trust you enough that your
implementation is sound.  I can figure out how things work once its
in the tree.

Thanks again.



More information about the Gcc-patches mailing list