On Feb 21, 2010, at 09:58, Joseph S. Myers wrote: > On Sun, 21 Feb 2010, Richard Guenther wrote: >>> The biggest change we need to make for x86 is to enable SSE2, >>> so we can get proper rounding behavior for float and double, >>> as well as significant performance increases. >> >> I think Joseph fixed the rounding behavior for 4.5. Also without an adjusted > > Well, I provided the option for rounding that is predictable and in > accordance with C99 when using the default -mfpmath=387. But that option > does carry the performance cost of storing to / loading from memory at > various points, as required to get the rounding on 387 (and there are > still cases where excess precision means double rounding).
This clearly is worse in all areas than using SSE2: there STILL is double rounding, and performance goes down the drain. On any recent machine there is the SSE2 hardware to do the operations correctly without going through memory and without double rounding. >> ABI you'd introduce x87 <-> SSE register moves which are not helpful >> for performance. > > As I understand it, whether -mfpmath=387 (with excess precision) or > -mfpmath=sse is the default is also considered part of the platform API > (like whether char is signed or unsigned by default, for example), in > addition to the ABI issues that can slow things down when SSE is used. No, this is not a new ABI. The ABI stays exactly the same. The I of ABI stands for Interface. That is, the ABI has nothing to say about how a function will compute any results. That is the area of language standards. The only way we'd violate the ABI is the reliance on SSE2 instructions being available and SSE2 registers being saved by the OS. However, since any other compiler uses SSE2 instructions by default, I don't see why GCC should be any different. If anything, since the GCC target audience is more focused on Free and open source software, we could be more aggressive in taking advantage of newer hardware. What about an autoconf test for availability of 486 atomic instructions, and SSE2 instructions in order, and choosing the default target based on the host? Not too crazy, is it? > If people really want a new 32-bit x86 ABI I'd suggest making it an ILP32 > ABI for processors running in 64-bit mode, so 64-bit registers are > available without the additional memory cost of 64-bit pointers for code > not needing them - you could also assume a minimum of -march=x86-64, which > implies SSE2. But if there were significant demand for such an ABI I > think we'd have seen it by now, and you probably run into the various > syscall interface problems that MIPS n32 has had. Let's keep that can of worms closed, has nothing to do with changing our -march defaults. -Geert PS. If anyone has SPEC-like figures for performance difference between -msse2 -mfpmath=sse,x87 and default, I'd be interested in seeing those results.