[PATCH, i386]: Optimize x87 constants some more

Uros Bizjak ubizjak@gmail.com
Wed Nov 29 09:09:00 GMT 2006


Hello!

Having the patch [1] that fixes float extension of FP constants in the
SVN, we can fix the problems with XFmode constants [2] in a better
way.

Attached patch disables XFmode move patterns for x87 constants (for
!optimize_size), as the splitter, introduced in [1] generates correct
x87 instruction even for float_extended constants. This patch also
enables size optimizations for DFmode and SFmode constants, where it
avoids operators with memory operands, when operand can be loaded by a
special instruction. Patch also tightens constraints for
float_extended XFmode operators (in order to prevent float_extend:XF
(XFreg) ).

Some simple testcases show the benefit of this patch:

a) return fmod (x, 1.0);   (the testcase from [2]):

gcc -O2 -ffast-math -fomit-frame-pointer:

        fldl    4(%esp)
        fld1                       <<- x87 constant load
        fxch    %st(1)
.L2:
        fprem
        fnstsw  %ax
        sahf
        jp      .L2
        fstp    %st(1)
        ret

b) return sqrt(x) + 1.0;

gcc -O2 -ffast-math -fomit-frame-pointer:

        fldl    4(%esp)
        fsqrt
        fadds   .LC0    <<- memory operand (faster, but 6 bytes)
        ret

gcc -Os -ffast-math -fomit-frame-pointer:

        fldl    4(%esp)
        fsqrt
        fld1                                 <<- 2 bytes
        faddp   %st, %st(1)      <<- 2 bytes, but together a bit
slower than code above
        ret

c) return exp(x);

gcc -O2 -ffast-math -fomit-frame-pointer:

        fldl2e                      <<- x87 constant load
        fmull   4(%esp)
        fld     %st(0)
        frndint
        fsubr   %st, %st(1)
        fxch    %st(1)
        f2xm1
        fadds   .LC1          <<- actually x + 1.0, inherent float
extend from SFmode
        fscale
        fstp    %st(1)
        ret

d) return -1.0 / tan(x);

gcc -Os -ffast-math -fomit-frame-pointer:

        fldl    4(%esp)
        fptan                        <<- peephole2 removed fld1
        fchs
        fdivp   %st, %st(1)
        ret

2006-11-29  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.md (movsf_1): Enable pattern for standard
	80387 constants before reload when optimizing for size.
	(*movdf_nointeger, *movdf_integer): Ditto.
	(*movxf_nointeger, *movxf_integer): Disable patterns for standard
	80387 constants before reload wheb not optimizing for size.

	(*fop_xf_4_i387, *fop_xf_5_i387, *fop_xf_6_i387): Avoid float
	extension of XFmode input operands.

Patch was bootstrapped on i686-pc-linux-gnu, regression tested for c,
c++ and fortran. OK for mainline?

Uros.

[1] http://gcc.gnu.org/ml/gcc-patches/2006-11/msg01762.html
[2] http://gcc.gnu.org/ml/gcc-patches/2006-11/msg00133.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: i386-fpconst.diff
Type: application/octet-stream
Size: 3448 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20061129/bf3bd163/attachment.obj>


More information about the Gcc-patches mailing list