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>
#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>
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
}
/**
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