intrin.h checks for x86_64. But the "x86_64" define is also defined for ARM64EC, and we don't support all the intrinsics in ARM64EC mode. Fix the preprocessor checks to handle this correctly. (If we actually need some of these intrinsics in ARM64EC mode, we can revisit later.) Not exactly sure how I didn't run into this issue before now... I think I've built code that requires these headers, but maybe not since the define fix landed.
80 lines
2.3 KiB
C++
80 lines
2.3 KiB
C++
// RUN: %clang_cc1 -triple i386-pc-win32 -target-cpu pentium4 \
|
|
// RUN: -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
|
|
// RUN: -ffreestanding -fsyntax-only -Werror \
|
|
// RUN: -isystem %S/Inputs/include %s
|
|
|
|
// RUN: %clang_cc1 -triple i386-pc-win32 -target-cpu broadwell \
|
|
// RUN: -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
|
|
// RUN: -ffreestanding -emit-obj -o /dev/null -Werror \
|
|
// RUN: -isystem %S/Inputs/include %s
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-pc-win32 \
|
|
// RUN: -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
|
|
// RUN: -ffreestanding -emit-obj -o /dev/null -Werror \
|
|
// RUN: -isystem %S/Inputs/include %s
|
|
|
|
// RUN: %clang_cc1 -triple thumbv7--windows \
|
|
// RUN: -fms-compatibility -fms-compatibility-version=17.00 \
|
|
// RUN: -ffreestanding -fsyntax-only -Werror \
|
|
// RUN: -isystem %S/Inputs/include %s
|
|
|
|
// RUN: %clang_cc1 -triple aarch64--windows \
|
|
// RUN: -fms-compatibility -fms-compatibility-version=17.00 \
|
|
// RUN: -ffreestanding -fsyntax-only -Werror \
|
|
// RUN: -isystem %S/Inputs/include %s
|
|
|
|
// RUN: %clang_cc1 -triple arm64ec--windows \
|
|
// RUN: -fms-compatibility -fms-compatibility-version=17.00 \
|
|
// RUN: -ffreestanding -fsyntax-only -Werror \
|
|
// RUN: -isystem %S/Inputs/include %s
|
|
|
|
// REQUIRES: x86-registered-target
|
|
|
|
// intrin.h needs size_t, but -ffreestanding prevents us from getting it from
|
|
// stddef.h. Work around it with this typedef.
|
|
typedef __SIZE_TYPE__ size_t;
|
|
|
|
#include <intrin.h>
|
|
|
|
// Use some C++ to make sure we closed the extern "C" brackets.
|
|
template <typename T>
|
|
void foo(T V) {}
|
|
|
|
// __asm__ blocks are only checked for inline functions that end up being
|
|
// emitted, so call functions with __asm__ blocks to make sure their inline
|
|
// assembly parses.
|
|
void f() {
|
|
__movsb(0, 0, 0);
|
|
__movsd(0, 0, 0);
|
|
__movsw(0, 0, 0);
|
|
|
|
__stosd(0, 0, 0);
|
|
__stosw(0, 0, 0);
|
|
|
|
#if defined(_M_X64) && !defined(_M_ARM64EC)
|
|
__movsq(0, 0, 0);
|
|
__stosq(0, 0, 0);
|
|
#endif
|
|
|
|
int info[4];
|
|
__cpuid(info, 0);
|
|
__cpuidex(info, 0, 0);
|
|
#if (defined(_M_X64) && !defined(_M_ARM64EC)) || defined(_M_IX86)
|
|
_xgetbv(0);
|
|
#endif
|
|
__halt();
|
|
__nop();
|
|
__readmsr(0);
|
|
|
|
__readcr3();
|
|
__writecr3(0);
|
|
|
|
#ifdef _M_ARM
|
|
__dmb(_ARM_BARRIER_ISHST);
|
|
#endif
|
|
|
|
#ifdef _M_ARM64
|
|
__dmb(_ARM64_BARRIER_SY);
|
|
#endif
|
|
}
|