Sent from my iPhone

On Apr 3, 2010, at 11:21 PM, "svfuerst at gmail dot com" <gcc-bugzi...@gcc.gnu.org > wrote:

gcc 4.4 compiles the following:

_Complex long double foo(long double p1, long double p2)
{
       return p1 + (__extension__ 1.0iF) * p2;
}

gcc-4.4 -O3 tgcc.c -c -o tgcc.o

into

  0x0000000000000000 <+0>:     fldt   0x8(%rsp)
  0x0000000000000004 <+4>:     fldt   0x18(%rsp)
  0x0000000000000008 <+8>:     fxch   %st(1)
  0x000000000000000a <+10>:    retq

This is ok, except for the useless fxch instruction. However, gcc 4.5 compiles
the same code into:
gcc-4.5 -O3 tgcc.c -c -o tgcc.o

  0x0000000000000000 <+0>:     fldt   0x18(%rsp)
  0x0000000000000004 <+4>:     fld    %st(0)
  0x0000000000000006 <+6>:     fmuls  0x0(%rip)        # 0xc <foo+12>
  0x000000000000000c <+12>:    fldt   0x8(%rsp)
  0x0000000000000010 <+16>:    faddp  %st,%st(1)
  0x0000000000000012 <+18>:    retq

which is quite a bit worse.

Except it is needed for handling -0.0 correctly.



--
          Summary: Missed optimization with complex long double
          Product: gcc
          Version: unknown
           Status: UNCONFIRMED
         Severity: normal
         Priority: P3
        Component: c
       AssignedTo: unassigned at gcc dot gnu dot org
       ReportedBy: svfuerst at gmail dot com
GCC build triplet: x86_64-linux
 GCC host triplet: x86_64-linux
GCC target triplet: x86_64-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43639

Reply via email to