This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

x86 patch: SSE-based FP<=>int conversions, round 1


GCC Darwin/x86 defaults to -mfpmath=sse. GCC does a fine job with all the SSE conversion opcodes, but when SSE doesn't supply the operation we need (e.g. x86_32 DF -> unsigned_SI), GCC falls back to the x87. That works, but it's slow, as the value must be stored into memory before it can be loaded into the x87.

The attached patch adds several of these conversions using SSE. It's not complete; for example, unsigned_SI -> SF is missing. It's not truly optimal either, as there are a few common cases where it really should fall back to the x87; for example, a conversion done for a return statement. But the generated code is generally faster, often significantly.

A very similar patch is currently part of Apples GCC.

:ADDPATCH target/x86:


Attachment: gcc.fsf.cvt.diffs.txt
Description: Text document


2006-12-01 Stuart Hastings <stuart@apple.com>


* gcc/testsuite/gcc.target/i386/20061023-1.c: New.
* gcc/config/i386/i386.md (fixuns_trunc<mode>si2, fixuns_truncdfhi2,
fixuns_truncsfhi2, floatunssidf2, floatunsdidf3) New.
(floatdidf2): Calll ix86_expand_convert_sign_DI2DF_sse.
* gcc/config/i386/sse.md (movdi_to_sse): New.
* gcc/config/i386/i386-protos.h (ix86_expand_convert_uns_DF2SI_sse,
ix86_expand_convert_uns_SF2SI_sse, ix86_expand_convert_uns_DI2DF_sse,
ix86_expand_convert_uns_SI2DF_sse, ix86_expand_convert_sign_DI2DF_sse): New.
* gcc/config/i386/i386.c (ix86_expand_vector_move2, gen_2_4_rtvec,
ix86_expand_convert_uns_DF2SI_sse, ix86_expand_convert_uns_SF2SI_sse,
store_xmm_as_DF, ix86_expand_convert_uns_DI2DF_sse,
ix86_expand_convert_uns_SI2DF_sse, ix86_expand_convert_sign_DI2DF_sse): New.


On Darwin/x86_32: bootstrapped, C/C++/ObjC/Obj-C++, DejaGnu (with default -mfpmath=387), DejaGnu -mfpmath=sse; no regressions.
On Linux/x86_64: bootstrapped, C/C++/ObjC, DejaGnu; no regressions.


O.K. for trunk?

stuart hastings
Apple Computer

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]