X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Frounding.h;h=e329d438244579ab1596b48ba7d5bd713cc8662b;hb=848e7b947d0d505d54d27780b052e5532c721678;hp=afb38fbdb56b31188b50529a8f8006e12188329c;hpb=3f797ef0c038afecb8702cc90a452903694975a2;p=mesa.git diff --git a/src/util/rounding.h b/src/util/rounding.h index afb38fbdb56..e329d438244 100644 --- a/src/util/rounding.h +++ b/src/util/rounding.h @@ -29,7 +29,7 @@ #include #include -#ifdef __x86_64__ +#if defined(__SSE__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(_M_X64) #include #include #endif @@ -95,7 +95,7 @@ _mesa_roundeven(double x) static inline long _mesa_lroundevenf(float x) { -#ifdef __x86_64__ +#if defined(__SSE__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(_M_X64) #if LONG_MAX == INT64_MAX return _mm_cvtss_si64(_mm_load_ss(&x)); #elif LONG_MAX == INT32_MAX @@ -108,6 +108,7 @@ _mesa_lroundevenf(float x) #endif } + /** * \brief Rounds \c x to the nearest integer, with ties to the even integer, * and returns the value as a long int. @@ -115,7 +116,7 @@ _mesa_lroundevenf(float x) static inline long _mesa_lroundeven(double x) { -#ifdef __x86_64__ +#if defined(__SSE2__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(_M_X64) #if LONG_MAX == INT64_MAX return _mm_cvtsd_si64(_mm_load_sd(&x)); #elif LONG_MAX == INT32_MAX @@ -128,4 +129,20 @@ _mesa_lroundeven(double x) #endif } +/** + * \brief Rounds \c x to the nearest integer, with ties to the even integer, + * and returns the value as an int64_t. + */ +static inline int64_t +_mesa_i64roundevenf(float x) +{ +#if LONG_MAX == INT64_MAX + return _mesa_lroundevenf(x); +#elif LONG_MAX == INT32_MAX + return llrintf(x); +#else +#error "Unsupported long size" +#endif +} + #endif