[PATCH, i386]: Rewrite x87 sqrt patterns, take 2
Uros Bizjak
ubizjak@gmail.com
Wed Nov 22 20:23:00 GMT 2006
Geert Bosch wrote:
> Just to add my two cents, I completely agree that __builtin_sqrt
> returning
> a more precise result than sqrt is acceptable and even expected.
> The same thing happens when inlining functions or using other
> optimizations:
> values that were previously truncated by storing them to memory may now
> be kept in registers.
>
> Same reasoning goes for other builtins, like fmod.
> If people really don't want builtins to be used, they can always
> the appropriate GCC option for that, like -fno-builtin-sqrt or
> maybe even -fno-builtin.
Thanks everybody for their comments. If more precise result of a builtin
is acceptable, then fmod x87 builtin should be changed.
Attached patch introduces new insn patterns that implements no-op
truncation via UNSPEC. UNSPEC implementation is necessary in order to
prevent any optimization to simplify real reg->mem->reg x87 truncation
into a no-op, and to distinguish it from -ffast-math no-op truncation
(it is expected that -ffast-math optimizes to as many no-op truncations
as possible in x87 case).
The asm code, generated for the fsqrt testcase in my previous post is
now the same as without patch. In addition, fmod patterns were changed
to use no-op truncation, to be consistent with sqrt expanders.
Patch was bootstrapped on x86_64-linux-gnu, regression test is in
progress. OK for mainline if it passes?
2006-11-22 Uros Bizjak <ubizjak@gmail.com>
config/i386/i386.md (UNSPEC_TRUNC_NOOP): New unspec definition.
(truncxfsf2_i387_noop_unspec, truncxfsf2_i387_noop_unspec):
New insn patterns.
(sqrtsf2): For !TARGET_SSE_MATH extend SFmode
operand 1 to XFmode, emit sqrtxf2 insn and truncate result back
to SFmode using noop truncation.
(sqrtdf2): Similar for DFmode operands.
(*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.
Uros.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: i386-sqrt-2.diff
Type: text/x-patch
Size: 7815 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20061122/3b19f156/attachment.bin>
More information about the Gcc-patches
mailing list