util: When building 'ARM64EC', don't use x64 intrinsics which need to be emulated

ARM64EC is a new build target for Windows ARM64 devices for x64 support.
These binaries can be loaded in x64 processes, but don't need to be emulated. For
code that's heavily used, avoiding the emulation can be a huge perf win.

Acked-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8619>
This commit is contained in:
Ben Niu 2021-01-21 09:56:17 -08:00 committed by Marge Bot
parent 86b4f6ad43
commit 36a4aeb91f

View file

@ -29,7 +29,7 @@
#include <limits.h>
#include <stdint.h>
#if defined(__SSE__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(_M_X64)
#if defined(__SSE__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || (defined(_M_X64) && !defined(_M_ARM64EC))
#include <xmmintrin.h>
#include <emmintrin.h>
#endif
@ -95,7 +95,7 @@ _mesa_roundeven(double x)
static inline long
_mesa_lroundevenf(float x)
{
#if defined(__SSE__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(_M_X64)
#if defined(__SSE__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || (defined(_M_X64) && !defined(_M_ARM64EC))
#if LONG_MAX == INT64_MAX
return _mm_cvtss_si64(_mm_load_ss(&x));
#elif LONG_MAX == INT32_MAX
@ -108,7 +108,6 @@ _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.
@ -116,7 +115,7 @@ _mesa_lroundevenf(float x)
static inline long
_mesa_lroundeven(double x)
{
#if defined(__SSE2__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(_M_X64)
#if defined(__SSE2__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || (defined(_M_X64) && !defined(_M_ARM64EC))
#if LONG_MAX == INT64_MAX
return _mm_cvtsd_si64(_mm_load_sd(&x));
#elif LONG_MAX == INT32_MAX