util: Use SSE intrinsics in _mesa_lroundeven{f,}.
authorMatt Turner <mattst88@gmail.com>
Mon, 29 Jun 2015 16:38:34 +0000 (09:38 -0700)
committerMatt Turner <mattst88@gmail.com>
Tue, 4 Aug 2015 17:33:13 +0000 (10:33 -0700)
gcc actually generates this for us now that we use -fno-math-errno
(which is weird, since lrintf()/lrint() don't set errno) but clang still
does not. Presumably helps MSVC as well.

Reduced .text size by 8.5k with gcc before -fno-math-errno.

   text     data      bss      dec      hex  filename
4935850   195136    26192  5157178   4eb13a  i965_dri.so before
4927225   195128    26192  5148545   4e8f81  i965_dri.so after

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/util/rounding.h

index 088cf86dd08a1636437b71f932d7ecc66743c642..b0c9918fd6e69500682b97b98dba97189988a2b5 100644 (file)
 #define _ROUNDING_H
 
 #include <math.h>
+#include <limits.h>
+
+#ifdef __x86_64__
+#include <xmmintrin.h>
+#include <emmintrin.h>
+#endif
 
 #ifdef __SSE4_1__
 #include <smmintrin.h>
@@ -87,7 +93,15 @@ _mesa_roundeven(double x)
 static inline long
 _mesa_lroundevenf(float x)
 {
+#ifdef __x86_64__
+#if LONG_BIT == 64
+   return _mm_cvtss_si64(_mm_load_ss(&x));
+#elif LONG_BIT == 32
+   return _mm_cvtss_si32(_mm_load_ss(&x));
+#endif
+#else
    return lrintf(x);
+#endif
 }
 
 /**
@@ -97,7 +111,15 @@ _mesa_lroundevenf(float x)
 static inline long
 _mesa_lroundeven(double x)
 {
+#ifdef __x86_64__
+#if LONG_BIT == 64
+   return _mm_cvtsd_si64(_mm_load_sd(&x));
+#elif LONG_BIT == 32
+   return _mm_cvtsd_si32(_mm_load_sd(&x));
+#endif
+#else
    return lrint(x);
+#endif
 }
 
 #endif