From: Billy Laws <[email protected]>
ARM64EC defines x86_64 identification macros, but its actual intrinsics
are aarch64-based. Since this
differs from what x86_64 code expects, MSVC additionally provides
softintrin.h (and softintrin.lib),
which act as wrappers to offer x86_64 variants of the intrinsics.
Signed-off-by: Jacek Caban <[email protected]>
---
mingw-w64-headers/crt/intrin.h | 20 +++++++-------
.../include/psdk_inc/intrin-impl.h | 27 +++++++++----------
mingw-w64-headers/include/winnt.h | 12 ++++-----
3 files changed, 29 insertions(+), 30 deletions(-)
diff --git a/mingw-w64-headers/crt/intrin.h b/mingw-w64-headers/crt/intrin.h
index ebd604d88..041c20e54 100644
--- a/mingw-w64-headers/crt/intrin.h
+++ b/mingw-w64-headers/crt/intrin.h
@@ -55,7 +55,7 @@
#endif
#if defined(__GNUC__) && \
- (defined(__i386__) || defined(__x86_64__))
+ (defined(__i386__) || (defined(__x86_64__) && !defined(__arm64ec__)))
#ifndef _MM_MALLOC_H_INCLUDED
#include <stdlib.h>
#include <errno.h>
@@ -103,7 +103,7 @@ typedef union __m128i { char v[16]; } __m128i;
#endif
#endif
-#if (defined(_X86_) || defined(__x86_64))
+#if (defined(_X86_) || (defined(__x86_64) && !defined(__arm64ec__)))
#if defined(__MMX__) || defined(__MINGW_FORCE_SYS_INTRINS)
#if defined(__cplusplus)
@@ -177,7 +177,7 @@ extern "C" {
#define __MACHINEIA32 __MACHINEZ
#endif
-#if !(defined(_X86_) || defined(__x86_64) || defined(__ia64__))
+#if !(defined(_X86_) || defined(__x86_64) || defined(__ia64__)) || defined(__arm64ec__)
#undef __MACHINEIW64
#define __MACHINEIW64 __MACHINEZ
#endif
@@ -187,17 +187,17 @@ extern "C" {
#define __MACHINEIA64 __MACHINEZ
#endif
-#if !(defined(__ia64__) || defined(__x86_64))
+#if !(defined(__ia64__) || defined(__x86_64)) || defined(__arm64ec__)
#undef __MACHINEW64
#define __MACHINEW64 __MACHINEZ
#endif
-#if !(defined(_X86_) || defined(__x86_64))
+#if !(defined(_X86_) || defined(__x86_64)) || defined(__arm64ec__)
#undef __MACHINEI
#define __MACHINEI __MACHINEZ
#endif
-#if !(defined(_X86_) || defined(__x86_64))
+#if !(defined(_X86_) || defined(__x86_64)) || defined(__arm64ec__)
#undef __MACHINEX86X
#define __MACHINEX86X __MACHINEZ
#endif
@@ -207,7 +207,7 @@ extern "C" {
#define __MACHINEX86X_NOX64 __MACHINEZ
#endif
-#if !(defined(_X86_) || defined(__x86_64)) || defined(__ia64__)
+#if !(defined(_X86_) || defined(__x86_64)) || defined(__ia64__) || defined(__arm64ec__)
#undef __MACHINEX86X_NOIA64
#define __MACHINEX86X_NOIA64 __MACHINEZ
#endif
@@ -228,17 +228,17 @@ extern "C" {
#define __MACHINECC __MACHINEZ
#endif
-#if !(defined(__aarch64__))
+#if !(defined(__aarch64__) || defined(__arm64ec__))
#undef __MACHINEARM64
#define __MACHINEARM64 __MACHINEZ
#endif
-#if !(defined(__arm__) || defined(__aarch64__))
+#if !(defined(__arm__) || defined(__aarch64__) || defined(__arm64ec__))
#undef __MACHINEARM_ARM64
#define __MACHINEARM_ARM64 __MACHINEZ
#endif
-#if !(defined(__x86_64))
+#if !(defined(__x86_64)) || defined(__arm64ec__)
#undef __MACHINEX64
#define __MACHINEX64 __MACHINEZ
#endif
diff --git a/mingw-w64-headers/include/psdk_inc/intrin-impl.h b/mingw-w64-headers/include/psdk_inc/intrin-impl.h
index 872246a44..e109c15d0 100644
--- a/mingw-w64-headers/include/psdk_inc/intrin-impl.h
+++ b/mingw-w64-headers/include/psdk_inc/intrin-impl.h
@@ -134,7 +134,7 @@ __INTRINSICS_USEINLINE
FunctionName: Any valid function name
DataType: __LONG32 or __int64
OffsetConstraint: either "I" for 32bit data types or "J" for 64. */
-#if defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_)
+#if (defined(__x86_64__) && !defined(__arm64ec__)) || (defined(_AMD64_) && !defined(_ARM64EC_)) || defined(__i386__) || defined(_X86_)
#define __buildbittesti(x, y, z, a) unsigned char x(y volatile *Base, y Offset) \
{ \
unsigned char old; \
@@ -162,7 +162,7 @@ __INTRINSICS_USEINLINE
: "memory", "cc"); \
return (old >> Offset) & 1; \
}
-#elif defined(__aarch64__) || defined(_ARM64_)
+#elif defined(__aarch64__) || defined(_ARM64_) || defined(__arm64ec__) || defined(_ARM64EC_)
#define __buildbittesti(x, y, z, a) unsigned char x(y volatile *Base, y Offset) \
{ \
unsigned int old, tmp1, tmp2; \
@@ -198,7 +198,7 @@ __INTRINSICS_USEINLINE
: "memory", "cc"); \
return (old >> Offset) & 1; \
}
-#endif /* defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_) */
+#endif /* (defined(__x86_64__) && !defined(__arm64ec__)) || (defined(_AMD64_) && !defined(_ARM64EC_)) || defined(__i386__) || defined(_X86_) */
/* This macro is used by YieldProcessor when compiling x86 w/o SSE2.
It generates the same opcodes as _mm_pause. */
@@ -668,8 +668,7 @@ unsigned short _rotr16(unsigned short __X, unsigned char __C)
#define __INTRINSIC_DEFINED__rotr16
#endif /* __INTRINSIC_PROLOG */
-#if defined(__x86_64__) || defined(_AMD64_)
-
+#if (defined(__x86_64__) && !defined(__arm64ec__)) || (defined(_AMD64_) && !defined(_ARM64EC_))
#if __INTRINSIC_PROLOG(__faststorefence)
void __faststorefence(void);
#if !__has_builtin(__faststorefence)
@@ -1103,7 +1102,7 @@ unsigned __int64 __shiftright128 (unsigned __int64 LowPart, unsigned __int64 Hi
#define __INTRINSIC_DEFINED___shiftright128
#endif /* __INTRINSIC_PROLOG */
-#endif /* defined(__x86_64__) || defined(_AMD64_) */
+#endif /* #(defined(__x86_64__) && !defined(__arm64ec__)) || (defined(_AMD64_) && !defined(_ARM64EC_)) */
/* ***************************************************** */
@@ -1195,7 +1194,7 @@ unsigned char _BitScanReverse(unsigned __LONG32 *Index, unsigned __LONG32 Mask)
#endif /* defined(__arm__) || defined(_ARM_) */
-#if defined(__aarch64__) || defined(_ARM64_)
+#if defined(__aarch64__) || defined(_ARM64_) || defined(__arm64ec__) || defined(_ARM64EC_)
#if __INTRINSIC_PROLOG(_interlockedbittestandset)
unsigned char _interlockedbittestandset(__LONG32 volatile *a, __LONG32 b);
@@ -1436,9 +1435,9 @@ unsigned char _BitScanReverse64(unsigned __LONG32 *Index, unsigned __int64 Mask)
#define __INTRINSIC_DEFINED__BitScanReverse64
#endif /* __INTRINSIC_PROLOG */
-#endif /* defined(__aarch64__) || define(_ARM64_) */
+#endif /* defined(__aarch64__) || define(_ARM64_) || defined(__arm64ec__) || defined(_ARM64EC_) */
-#if defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+#if defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) || defined(__arm64ec__) || defined(_ARM64EC_)
#if __INTRINSIC_PROLOG(_bittest)
unsigned char _bittest(const __LONG32 *__a, __LONG32 __b);
@@ -1494,9 +1493,9 @@ unsigned char _bittestandcomplement(__LONG32 *__a, __LONG32 __b)
#define __INTRINSIC_DEFINED__bittestandcomplement
#endif /* __INTRINSIC_PROLOG */
-#endif /* defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) */
+#endif /* defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) || defined(__arm64ec__) || defined(_ARM64EC_) */
-#if defined(__aarch64__) || defined(_ARM64_)
+#if defined(__aarch64__) || defined(_ARM64_) || defined(__arm64ec__) || defined(_ARM64EC_)
#if __INTRINSIC_PROLOG(_bittest64)
unsigned char _bittest64(const __int64 *__a, __int64 __b);
@@ -1552,7 +1551,7 @@ unsigned char _bittestandcomplement64(__int64 *__a, __int64 __b)
#define __INTRINSIC_DEFINED__bittestandcomplement64
#endif /* __INTRINSIC_PROLOG */
-#endif /* defined(__aarch64__) || define(_ARM64_) */
+#endif /* defined(__aarch64__) || define(_ARM64_) || defined(__arm64ec__) || defined(_ARM64EC_) */
/* ***************************************************** */
@@ -1777,7 +1776,7 @@ void *_InterlockedExchangePointer(void *volatile *Target,void *Value) {
#endif /* defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) */
-#if defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_)
+#if (defined(__x86_64__) && !defined(__arm64ec__)) || (defined(_AMD64_) && !defined(_ARM64EC_)) || defined(__i386__) || defined(_X86_)
#if __INTRINSIC_PROLOG(__int2c)
void __int2c(void);
@@ -2157,7 +2156,7 @@ unsigned __int64 _xgetbv(unsigned int index)
#endif /* __INTRINSIC_PROLOG */
#endif /* __GNUC__ < 8 */
-#endif /* defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_) */
+#endif /* (defined(__x86_64__) && !defined(__arm64ec__)) || (defined(_AMD64_) && !defined(_ARM64EC_)) || defined(__i386__) || defined(_X86_) */
/* ***************************************************** */
diff --git a/mingw-w64-headers/include/winnt.h b/mingw-w64-headers/include/winnt.h
index c53136b1f..b6d1f58ed 100644
--- a/mingw-w64-headers/include/winnt.h
+++ b/mingw-w64-headers/include/winnt.h
@@ -1589,7 +1589,7 @@ __MINGW_CXX14_CONSTEXPR inline ENUMTYPE& operator ^= (ENUMTYPE& a, ENUMTYPE b) {
#ifdef _AMD64_
-#if defined(__x86_64) && !defined(RC_INVOKED)
+#if defined(__x86_64) && !defined(__arm64ec__) && !defined(RC_INVOKED)
#ifdef __cplusplus
extern "C" {
@@ -1789,7 +1789,7 @@ extern "C" {
#ifdef __cplusplus
}
#endif
-#endif /* defined(__x86_64) && !defined(RC_INVOKED) */
+#endif /* defined(__x86_64) && !defined(__arm64ec__) && !defined(RC_INVOKED) */
#define EXCEPTION_READ_FAULT 0
#define EXCEPTION_WRITE_FAULT 1
@@ -2154,9 +2154,9 @@ extern "C" {
#endif /* _ARM_ */
-#ifdef _ARM64_
+#if defined(_ARM64_) || defined(_ARM64EC_)
-#if defined(__aarch64__) && !defined(RC_INVOKED)
+#if (defined(__aarch64__) || defined(__arm64ec__)) && !defined(RC_INVOKED)
#ifdef __cplusplus
extern "C" {
@@ -2226,7 +2226,7 @@ extern "C" {
#ifdef __cplusplus
}
#endif
-#endif /* defined(__aarch64__) && !defined(RC_INVOKED) */
+#endif /* (defined(__aarch64__) || defined(__arm64ec__)) && !defined(RC_INVOKED) */
#define EXCEPTION_READ_FAULT 0
#define EXCEPTION_WRITE_FAULT 1
@@ -9120,7 +9120,7 @@ typedef DWORD (WINAPI *PRTL_RUN_ONCE_INIT_FN)(PRTL_RUN_ONCE, PVOID, PVOID *);
#if !defined (__CRT__NO_INLINE) && !defined (__WIDL__)
__CRT_INLINE PVOID WINAPI RtlSecureZeroMemory(PVOID ptr,SIZE_T cnt) {
volatile char *vptr =(volatile char *)ptr;
-#ifdef __x86_64
+#if defined(__x86_64__) && !defined(__arm64ec__)
__stosb((PBYTE)((DWORD64)vptr),0,cnt);
#else
while(cnt) {
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public