On Tue, Jan 12, 2016 at 1:43 PM, Jakub Jelinek <ja...@redhat.com> wrote: > On Tue, Jan 12, 2016 at 01:32:05PM +0100, Uros Bizjak wrote: >> Using this patch, SSE math won't be emitted for a simple testcase >> using " -O2 -msse -m32 -std=c99 -mfpmath=sse" compile flags: >> >> float test (float a, float b) >> { >> return a + b; >> } >> >> since we start with: >> >> test (float a, float b) >> { >> long double _2; >> long double _4; >> long double _5; >> float _6; >> >> <bb 2>: >> _2 = (long double) a_1(D); >> _4 = (long double) b_3(D); >> _5 = _2 + _4; >> _6 = (float) _5; >> return _6; >> } >> >> This is counter-intuitive, so I'd say we leave things as they are. The >> situation where only floats are evaluated as floats and doubles are >> evaluated as long doubles is not covered in the FLT_EVAL_METHOD spec. > > Well, for the -fexcess-precision=standard case (== -std=c99) FLT_EVAL_METHOD > 2 doesn't hurt, that forces in the FE long double computation. While if it > is 0 with -msse -mfpmath=sse, it means that the FE leaves computations as is > and they are computed in float precision for floats and in long double > precision for doubles. For -fexcess-precision=fast it is different, because > the FE doesn't do anything, so in the end it is mixed in that case. > So, for -msse -mfpmath=sse, I think either we need FLT_EVAL_METHOD 2 or -1 > or 2 for -fexcess-precision=standard and -1 for -fexcess-precision=fast.
I think that following definition describes -msse -mfpmath=sse situation in the most elegant way. We can just declare that the precision is not known in this case: #define TARGET_FLT_EVAL_METHOD \ (TARGET_MIX_SSE_I387 ? -1 \ : (TARGET_80387 && !TARGET_SSE_MATH) ? 2 : TARGET_SSE2 ? 0 : -1) Using this patch, the compiler will still generate SSE instructions for the above test. Joseph, what is your opinion on this approach? Uros.