[Mesa-dev] [PATCH 3/3] util: Optimize _mesa_roundeven with SSE 4.1.

Matt Turner mattst88 at gmail.com
Thu Mar 12 14:08:11 PDT 2015


On Thu, Mar 12, 2015 at 1:11 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Thu, Mar 12, 2015 at 3:11 PM, Matt Turner <mattst88 at gmail.com> wrote:
>> The SSE 4.1 ROUND instructions let us implement roundeven directly.
>> Otherwise we assume that the rounding mode has not been modified (as we
>> do in the rest of Mesa) and use rint().
>>
>> glibc uses the ROUND instruction in rint() after a cpuid check. This
>> patch just lets us inline it directly when we're already building for
>> SSE 4.1.
>> ---
>>  src/util/rounding.h | 16 ++++++++++++++++
>>  1 file changed, 16 insertions(+)
>>
>> diff --git a/src/util/rounding.h b/src/util/rounding.h
>> index d128524..e82fb59 100644
>> --- a/src/util/rounding.h
>> +++ b/src/util/rounding.h
>> @@ -23,6 +23,10 @@
>>
>>  #include <math.h>
>>
>> +#ifdef __SSE4_1__
>> +#include <smmintrin.h>
>> +#endif
>> +
>>  /* The C standard library has functions round()/rint()/nearbyint() that round
>>   * their arguments according to the rounding mode set in the floating-point
>>   * control register. While there are trunc()/ceil()/floor() functions that do
>> @@ -38,10 +42,16 @@ static inline float
>>  _mesa_roundevenf(float x)
>>  {
>>     float ret;
>> +#ifdef __SSE4_1__
>> +   __m128 m = _mm_load_ss(&x);
>> +   m = _mm_round_ss(m, m, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
>> +   _mm_store_ss(&ret, m);
>
> As we discussed, this will work differently than glibc depending on
> the rounding mode set. Either use the same rounding mode that glibc
> would use, or add an assert that the rounding mode is set the way you
> expect (and if it doesn't work on msvc, then... wtvr. That's what
> ifdef's are for.)

Sure. I'll change _MM_FROUND_TO_NEAREST_INT to _MM_FROUND_CUR_DIRECTION.


More information about the mesa-dev mailing list