On Thu, Aug 25, 2005 at 12:37:32PM -0700, Ian Lance Taylor wrote:
> Fariborz Jahanian <[EMAIL PROTECTED]> writes:
>
> > Forgot to attach the patch:
> >
> > Index: i386.c
> > ===================================================================
> > RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.c,v
> > retrieving revision 1.795.4.33
> > diff -c -p -r1.795.4.33 i386.c
> > *** i386.c 15 Aug 2005 23:36:10 -0000 1.795.4.33
> > --- i386.c 25 Aug 2005 17:08:33 -0000
> > *************** ix86_rtx_costs (rtx x, int code, int out
> > *** 15730,15740 ****
> > else
> > switch (standard_80387_constant_p (x))
> > {
> > ! case 1: /* 0.0 */
> > ! *total = 1;
> > ! break;
> > ! default: /* Other constants */
> > ! *total = 2;
> > break;
> > case 0:
> > case -1:
> > --- 15730,15737 ----
> > else
> > switch (standard_80387_constant_p (x))
> > {
> > ! default: /* All constants */
> > ! *total = 0;
> > break;
> > case 0:
> > case -1:
>
> For what it's worth, as I told Fariborz, I suspect that returning 0 is
> correct for SFmode, but I'm somewhat doubtful for DFmode. And his
> test case is odd since the resulting code has more instructions and is
> larger. I know little about x86 instruction timings, but it seems
> surprising that the new sequence is faster. Maybe the problem is in
> using %xmm0 instead of one of the 80387 registers--or, since this is
> after all merely a constant--one of the general registers.
>
> And in any case this type of thing should be controlled by an entry in
> the i386 processor_costs structure.
I think the problem may be somewhere else. I got the same xmm0 code
sequence on Linux/ia32 with -msse3 -mfpmath=sse. However, I got
xorl %eax, %eax
movq %rax, 16(%rdi)
movq %rax, 8(%rdi)
movq %rax, (%rdi)
on Linux/x86-64.
H.J.