diff options
| -rw-r--r-- | clang/include/clang/Basic/BuiltinsX86.def | 3 | ||||
| -rw-r--r-- | clang/include/clang/Driver/Options.td | 2 | ||||
| -rw-r--r-- | clang/lib/Basic/Targets/X86.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Basic/Targets/X86.h | 1 | ||||
| -rw-r--r-- | clang/lib/Headers/immintrin.h | 12 | ||||
| -rw-r--r-- | clang/test/CodeGen/rdpid-builtins.c | 10 | ||||
| -rw-r--r-- | clang/test/Driver/x86-target-features.c | 4 | ||||
| -rw-r--r-- | clang/test/Preprocessor/predefined-arch-macros.c | 2 | ||||
| -rw-r--r-- | clang/test/Preprocessor/x86_target_features.c | 3 |
9 files changed, 44 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def index 9169b7c2292..b7a058182c3 100644 --- a/clang/include/clang/Basic/BuiltinsX86.def +++ b/clang/include/clang/Basic/BuiltinsX86.def @@ -894,6 +894,9 @@ BUILTIN(__builtin_ia32_rdpmc, "ULLii", "") BUILTIN(__builtin_ia32_rdtsc, "ULLi", "") BUILTIN(__rdtsc, "ULLi", "") BUILTIN(__builtin_ia32_rdtscp, "ULLiUi*", "") + +TARGET_BUILTIN(__builtin_ia32_rdpid, "Ui", "", "rdpid") + // PKU TARGET_BUILTIN(__builtin_ia32_rdpkru, "Ui", "", "pku") TARGET_BUILTIN(__builtin_ia32_wrpkru, "vUi", "", "pku") diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 128960382e8..4ddaa10b226 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2562,6 +2562,8 @@ def mprefetchwt1 : Flag<["-"], "mprefetchwt1">, Group<m_x86_Features_Group>; def mno_prefetchwt1 : Flag<["-"], "mno-prefetchwt1">, Group<m_x86_Features_Group>; def mprfchw : Flag<["-"], "mprfchw">, Group<m_x86_Features_Group>; def mno_prfchw : Flag<["-"], "mno-prfchw">, Group<m_x86_Features_Group>; +def mrdpid : Flag<["-"], "mrdpid">, Group<m_x86_Features_Group>; +def mno_rdpid : Flag<["-"], "mno-rdpid">, Group<m_x86_Features_Group>; def mrdrnd : Flag<["-"], "mrdrnd">, Group<m_x86_Features_Group>; def mno_rdrnd : Flag<["-"], "mno-rdrnd">, Group<m_x86_Features_Group>; def mrtm : Flag<["-"], "mrtm">, Group<m_x86_Features_Group>; diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp index ca4a6b97b3a..ddc02322305 100644 --- a/clang/lib/Basic/Targets/X86.cpp +++ b/clang/lib/Basic/Targets/X86.cpp @@ -160,6 +160,7 @@ bool X86TargetInfo::initFeatureMap( setFeatureEnabledImpl(Features, "avx512vnni", true); setFeatureEnabledImpl(Features, "avx512vbmi2", true); setFeatureEnabledImpl(Features, "avx512vpopcntdq", true); + setFeatureEnabledImpl(Features, "rdpid", true); LLVM_FALLTHROUGH; case CK_Cannonlake: setFeatureEnabledImpl(Features, "avx512ifma", true); @@ -784,6 +785,8 @@ bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HasPREFETCHWT1 = true; } else if (Feature == "+clzero") { HasCLZERO = true; + } else if (Feature == "+rdpid") { + HasRDPID = true; } X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature) @@ -1123,6 +1126,8 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__PREFETCHWT1__"); if (HasCLZERO) Builder.defineMacro("__CLZERO__"); + if (HasRDPID) + Builder.defineMacro("__RDPID__"); // Each case falls through to the previous one here. switch (SSELevel) { @@ -1253,6 +1258,7 @@ bool X86TargetInfo::isValidFeatureName(StringRef Name) const { .Case("popcnt", true) .Case("prefetchwt1", true) .Case("prfchw", true) + .Case("rdpid", true) .Case("rdrnd", true) .Case("rdseed", true) .Case("rtm", true) @@ -1324,6 +1330,7 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const { .Case("popcnt", HasPOPCNT) .Case("prefetchwt1", HasPREFETCHWT1) .Case("prfchw", HasPRFCHW) + .Case("rdpid", HasRDPID) .Case("rdrnd", HasRDRND) .Case("rdseed", HasRDSEED) .Case("rtm", HasRTM) diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index 290d3db3504..db98619cdb9 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -96,6 +96,7 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo { bool HasCLWB = false; bool HasMOVBE = false; bool HasPREFETCHWT1 = false; + bool HasRDPID = false; /// \brief Enumeration of all of the X86 CPUs supported by Clang. /// diff --git a/clang/lib/Headers/immintrin.h b/clang/lib/Headers/immintrin.h index d3421dc86c9..a332879500d 100644 --- a/clang/lib/Headers/immintrin.h +++ b/clang/lib/Headers/immintrin.h @@ -247,6 +247,18 @@ _mm256_cvtph_ps(__m128i __a) #include <gfniintrin.h> #endif +#if !defined(_MSC_VER) || __has_feature(modules) || defined(__RDPID__) +/// \brief Returns the value of the IA32_TSC_AUX MSR (0xc0000103). +/// +/// \headerfile <immintrin.h> +/// +/// This intrinsic corresponds to the <c> RDPID </c> instruction. +static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("rdpid"))) +_rdpid_u32(void) { + return __builtin_ia32_rdpid(); +} +#endif // __RDPID__ + #if !defined(_MSC_VER) || __has_feature(modules) || defined(__RDRND__) static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) _rdrand16_step(unsigned short *__p) diff --git a/clang/test/CodeGen/rdpid-builtins.c b/clang/test/CodeGen/rdpid-builtins.c new file mode 100644 index 00000000000..35516b05bd4 --- /dev/null +++ b/clang/test/CodeGen/rdpid-builtins.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -target-feature +rdpid -emit-llvm -o - %s | FileCheck %s + + +#include <x86intrin.h> + +unsigned int test_rdpid_u32(void) { +// CHECK-LABEL: @test_rdpid_u32 +// CHECK: call i32 @llvm.x86.rdpid + return _rdpid_u32(); +} diff --git a/clang/test/Driver/x86-target-features.c b/clang/test/Driver/x86-target-features.c index 1289823d1db..07d194c0458 100644 --- a/clang/test/Driver/x86-target-features.c +++ b/clang/test/Driver/x86-target-features.c @@ -125,3 +125,7 @@ // VBMI2: "-target-feature" "+avx512vbmi2" // NO-VBMI2: "-target-feature" "-avx512vbmi2" +// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mrdpid %s -### -o %t.o 2>&1 | FileCheck -check-prefix=RDPID %s +// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mno-rdpid %s -### -o %t.o 2>&1 | FileCheck -check-prefix=NO-RDPID %s +// RDPID: "-target-feature" "+rdpid" +// NO-RDPID: "-target-feature" "-rdpid" diff --git a/clang/test/Preprocessor/predefined-arch-macros.c b/clang/test/Preprocessor/predefined-arch-macros.c index 2c0558286d6..bf981076a18 100644 --- a/clang/test/Preprocessor/predefined-arch-macros.c +++ b/clang/test/Preprocessor/predefined-arch-macros.c @@ -1086,6 +1086,7 @@ // CHECK_ICL_M32: #define __PKU__ 1 // CHECK_ICL_M32: #define __POPCNT__ 1 // CHECK_ICL_M32: #define __PRFCHW__ 1 +// CHECK_ICL_M32: #define __RDPID__ 1 // CHECK_ICL_M32: #define __RDRND__ 1 // CHECK_ICL_M32: #define __RDSEED__ 1 // CHECK_ICL_M32: #define __RTM__ 1 @@ -1141,6 +1142,7 @@ // CHECK_ICL_M64: #define __PKU__ 1 // CHECK_ICL_M64: #define __POPCNT__ 1 // CHECK_ICL_M64: #define __PRFCHW__ 1 +// CHECK_ICL_M64: #define __RDPID__ 1 // CHECK_ICL_M64: #define __RDRND__ 1 // CHECK_ICL_M64: #define __RDSEED__ 1 // CHECK_ICL_M64: #define __RTM__ 1 diff --git a/clang/test/Preprocessor/x86_target_features.c b/clang/test/Preprocessor/x86_target_features.c index 542328aca04..c962f61317a 100644 --- a/clang/test/Preprocessor/x86_target_features.c +++ b/clang/test/Preprocessor/x86_target_features.c @@ -436,3 +436,6 @@ // VPCLMULQDQNOPCLMUL-NOT: #define __PCLMUL__ 1 // VPCLMULQDQNOPCLMUL-NOT: #define __VPCLMULQDQ__ 1 +// RUN: %clang -target i386-unknown-unknown -march=atom -mrdpid -x c -E -dM -o - %s | FileCheck -match-full-lines --check-prefix=RDPID %s + +// RDPID: #define __RDPID__ 1 |

