diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index ce7e4d4639cea..c705d30cf6bf4 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -17,6 +17,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/TargetParser/ARMTargetParser.h" using namespace clang; using namespace clang::targets; @@ -836,6 +837,69 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (Opts.RWPI) Builder.defineMacro("__ARM_RWPI", "1"); + // Macros for enabling co-proc intrinsics + uint64_t FeatureCoprocBF = 0; + switch (ArchKind) { + default: + break; + case llvm::ARM::ArchKind::ARMV4: + case llvm::ARM::ArchKind::ARMV4T: + // Filter __arm_ldcl and __arm_stcl in acle.h + FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1; + break; + case llvm::ARM::ArchKind::ARMV5T: + FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1 | FEATURE_COPROC_B2; + break; + case llvm::ARM::ArchKind::ARMV5TE: + case llvm::ARM::ArchKind::ARMV5TEJ: + if (!isThumb()) + FeatureCoprocBF = + FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | FEATURE_COPROC_B3; + break; + case llvm::ARM::ArchKind::ARMV6: + case llvm::ARM::ArchKind::ARMV6K: + case llvm::ARM::ArchKind::ARMV6KZ: + case llvm::ARM::ArchKind::ARMV6T2: + if (!isThumb() || ArchKind == llvm::ARM::ArchKind::ARMV6T2) + FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | + FEATURE_COPROC_B3 | FEATURE_COPROC_B4; + break; + case llvm::ARM::ArchKind::ARMV7A: + case llvm::ARM::ArchKind::ARMV7R: + case llvm::ARM::ArchKind::ARMV7M: + case llvm::ARM::ArchKind::ARMV7S: + case llvm::ARM::ArchKind::ARMV7EM: + FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | + FEATURE_COPROC_B3 | FEATURE_COPROC_B4; + break; + case llvm::ARM::ArchKind::ARMV8A: + case llvm::ARM::ArchKind::ARMV8R: + case llvm::ARM::ArchKind::ARMV8_1A: + case llvm::ARM::ArchKind::ARMV8_2A: + case llvm::ARM::ArchKind::ARMV8_3A: + case llvm::ARM::ArchKind::ARMV8_4A: + case llvm::ARM::ArchKind::ARMV8_5A: + case llvm::ARM::ArchKind::ARMV8_6A: + case llvm::ARM::ArchKind::ARMV8_7A: + case llvm::ARM::ArchKind::ARMV8_8A: + case llvm::ARM::ArchKind::ARMV8_9A: + case llvm::ARM::ArchKind::ARMV9A: + case llvm::ARM::ArchKind::ARMV9_1A: + case llvm::ARM::ArchKind::ARMV9_2A: + case llvm::ARM::ArchKind::ARMV9_3A: + case llvm::ARM::ArchKind::ARMV9_4A: + // Filter __arm_cdp, __arm_ldcl, __arm_stcl in arm_acle.h + FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3; + break; + case llvm::ARM::ArchKind::ARMV8MMainline: + case llvm::ARM::ArchKind::ARMV8_1MMainline: + FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | + FEATURE_COPROC_B3 | FEATURE_COPROC_B4; + break; + } + Builder.defineMacro("__ARM_FEATURE_COPROC", + "0x" + Twine::utohexstr(FeatureCoprocBF)); + if (ArchKind == llvm::ARM::ArchKind::XSCALE) Builder.defineMacro("__XSCALE__"); diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index b1aa2794c7e4c..9802eb01abf3c 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -100,6 +100,19 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { }; uint32_t HW_FP; + enum { + /// __arm_cdp __arm_ldc, __arm_ldcl, __arm_stc, + /// __arm_stcl, __arm_mcr and __arm_mrc + FEATURE_COPROC_B1 = (1 << 0), + /// __arm_cdp2, __arm_ldc2, __arm_stc2, __arm_ldc2l, + /// __arm_stc2l, __arm_mcr2 and __arm_mrc2 + FEATURE_COPROC_B2 = (1 << 1), + /// __arm_mcrr, __arm_mrrc + FEATURE_COPROC_B3 = (1 << 2), + /// __arm_mcrr2, __arm_mrrc2 + FEATURE_COPROC_B4 = (1 << 3), + }; + void setABIAAPCS(); void setABIAPCS(bool IsAAPCS16); diff --git a/clang/lib/Headers/arm_acle.h b/clang/lib/Headers/arm_acle.h index 61d80258d166a..9aae2285aeb1d 100644 --- a/clang/lib/Headers/arm_acle.h +++ b/clang/lib/Headers/arm_acle.h @@ -756,6 +756,65 @@ __arm_st64bv0(void *__addr, data512_t __value) { __builtin_arm_mops_memset_tag(__tagged_address, __value, __size) #endif +/* Coprocessor Intrinsics */ +#if defined(__ARM_FEATURE_COPROC) + +#if (__ARM_FEATURE_COPROC & 0x1) + +#if (__ARM_ARCH < 8) +#define __arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2) \ + __builtin_arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2) +#endif /* __ARM_ARCH < 8 */ + +#define __arm_ldc(coproc, CRd, p) __builtin_arm_ldc(coproc, CRd, p) +#define __arm_stc(coproc, CRd, p) __builtin_arm_stc(coproc, CRd, p) + +#define __arm_mcr(coproc, opc1, value, CRn, CRm, opc2) \ + __builtin_arm_mcr(coproc, opc1, value, CRn, CRm, opc2) +#define __arm_mrc(coproc, opc1, CRn, CRm, opc2) \ + __builtin_arm_mrc(coproc, opc1, CRn, CRm, opc2) + +#if (__ARM_ARCH != 4) && (__ARM_ARCH < 8) +#define __arm_ldcl(coproc, CRd, p) __builtin_arm_ldcl(coproc, CRd, p) +#define __arm_stcl(coproc, CRd, p) __builtin_arm_stcl(coproc, CRd, p) +#endif /* (__ARM_ARCH != 4) && (__ARM_ARCH != 8) */ + +#if (__ARM_ARCH_8M_MAIN__) || (__ARM_ARCH_8_1M_MAIN__) +#define __arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2) \ + __builtin_arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2) +#define __arm_ldcl(coproc, CRd, p) __builtin_arm_ldcl(coproc, CRd, p) +#define __arm_stcl(coproc, CRd, p) __builtin_arm_stcl(coproc, CRd, p) +#endif /* ___ARM_ARCH_8M_MAIN__ */ + +#endif /* __ARM_FEATURE_COPROC & 0x1 */ + +#if (__ARM_FEATURE_COPROC & 0x2) +#define __arm_cdp2(coproc, opc1, CRd, CRn, CRm, opc2) \ + __builtin_arm_cdp2(coproc, opc1, CRd, CRn, CRm, opc2) +#define __arm_ldc2(coproc, CRd, p) __builtin_arm_ldc2(coproc, CRd, p) +#define __arm_stc2(coproc, CRd, p) __builtin_arm_stc2(coproc, CRd, p) +#define __arm_ldc2l(coproc, CRd, p) __builtin_arm_ldc2l(coproc, CRd, p) +#define __arm_stc2l(coproc, CRd, p) __builtin_arm_stc2l(coproc, CRd, p) +#define __arm_mcr2(coproc, opc1, value, CRn, CRm, opc2) \ + __builtin_arm_mcr2(coproc, opc1, value, CRn, CRm, opc2) +#define __arm_mrc2(coproc, opc1, CRn, CRm, opc2) \ + __builtin_arm_mrc2(coproc, opc1, CRn, CRm, opc2) +#endif + +#if (__ARM_FEATURE_COPROC & 0x4) +#define __arm_mcrr(coproc, opc1, value, CRm) \ + __builtin_arm_mcrr(coproc, opc1, value, CRm) +#define __arm_mrrc(coproc, opc1, CRm) __builtin_arm_mrrc(coproc, opc1, CRm) +#endif + +#if (__ARM_FEATURE_COPROC & 0x8) +#define __arm_mcrr2(coproc, opc1, value, CRm) \ + __builtin_arm_mcrr2(coproc, opc1, value, CRm) +#define __arm_mrrc2(coproc, opc1, CRm) __builtin_arm_mrrc2(coproc, opc1, CRm) +#endif + +#endif // __ARM_FEATURE_COPROC + /* Transactional Memory Extension (TME) Intrinsics */ #if defined(__ARM_FEATURE_TME) && __ARM_FEATURE_TME diff --git a/clang/test/CodeGen/arm-acle-coproc.c b/clang/test/CodeGen/arm-acle-coproc.c new file mode 100644 index 0000000000000..cf87130932edf --- /dev/null +++ b/clang/test/CodeGen/arm-acle-coproc.c @@ -0,0 +1,383 @@ +// RUN: %clang_cc1 -triple armv4 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4 %s +// RUN: %clang_cc1 -triple armv4t %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4 %s +// RUN: %clang_cc1 -triple armv5 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5 %s +// RUN: %clang_cc1 -triple armv5te %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-TE %s +// RUN: %clang_cc1 -triple armv5tej %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-TE %s +// RUN: %clang_cc1 -triple armv6 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V6 %s +// RUN: %clang_cc1 -triple armv6m %s -E -dD -o - | FileCheck --check-prefix=CHECK-V6M %s +// RUN: %clang_cc1 -triple armv7a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V7 %s +// RUN: %clang_cc1 -triple armv7r %s -E -dD -o - | FileCheck --check-prefix=CHECK-V7 %s +// RUN: %clang_cc1 -triple armv7m %s -E -dD -o - | FileCheck --check-prefix=CHECK-V7 %s +// RUN: %clang_cc1 -triple armv8a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8r %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.1a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.2a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.3a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.6a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.7a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.8a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv8.9a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv9a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv9.1a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv9.2a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv9.3a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple armv9.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv4 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s +// RUN: %clang_cc1 -triple thumbv4t %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s +// RUN: %clang_cc1 -triple thumbv5 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-THUMB %s +// RUN: %clang_cc1 -triple thumbv5te %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-TE-THUMB %s +// RUN: %clang_cc1 -triple thumbv5tej %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-TE-THUMB %s +// RUN: %clang_cc1 -triple thumbv6 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V6-THUMB %s +// RUN: %clang_cc1 -triple thumbv6k %s -E -dD -o - | FileCheck --check-prefix=CHECK-V6-THUMB %s +// RUN: %clang_cc1 -triple thumbv6kz %s -E -dD -o - | FileCheck --check-prefix=CHECK-V6-THUMB %s +// RUN: %clang_cc1 -triple thumbv6m %s -E -dD -o - | FileCheck --check-prefix=CHECK-V6M %s +// RUN: %clang_cc1 -triple thumbv7a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V7 %s +// RUN: %clang_cc1 -triple thumbv7r %s -E -dD -o - | FileCheck --check-prefix=CHECK-V7 %s +// RUN: %clang_cc1 -triple thumbv7m %s -E -dD -o - | FileCheck --check-prefix=CHECK-V7 %s +// RUN: %clang_cc1 -triple thumbv8a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8r %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.1a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.2a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.3a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.6a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.7a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.8a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8.9a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv9a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv9.1a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv9.2a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv9.3a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv9.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s +// RUN: %clang_cc1 -triple thumbv8m.base %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-BASE %s +// RUN: %clang_cc1 -triple thumbv8m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s +// RUN: %clang_cc1 -triple thumbv8.1m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s + +#include + +void cdp() { + __arm_cdp(1, 2, 3, 4, 5, 6); + // CHECK-LABEL: void cdp() + // CHECK-V4: __builtin_arm_cdp + // CHECK-V4-THUMB-NOT: __builtin_arm_cdp + // CHECK-V5: __builtin_arm_cdp + // CHECK-V5-TE: __builtin_arm_cdp + // CHECK-V5-THUMB-NOT: __builtin_arm_cdp + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_cdp + // CHECK-V6: __builtin_arm_cdp + // CHECK-V6-THUMB-NOT: __builtin_arm_cdp + // CHECK-V6M-NOT: __builtin_arm_cdp + // CHECK-V7: __builtin_arm_cdp + // CHECK-V8-NOT: __builtin_arm_cdp + // CHECK-V8-BASE-NOT: __builtin_arm_cdp + // CHECK-V8-MAIN: __builtin_arm_cdp +} + +void cdp2() { + __arm_cdp2(1, 2, 3, 4, 5, 6); + // CHECK-LABEL: void cdp2() + // CHECK-V4-NOT: __builtin_arm_cdp2 + // CHECK-V4-THUMB-NOT: __builtin_arm_cdp2 + // CHECK-V5: __builtin_arm_cdp2 + // CHECK-V5-TE: __builtin_arm_cdp2 + // CHECK-V5-THUMB-NOT: __builtin_arm_cdp2 + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_cdp2 + // CHECK-V6: __builtin_arm_cdp2 + // CHECK-V6-THUMB-NOT: __builtin_arm_cdp2 + // CHECK-V6M-NOT: __builtin_arm_cdp2 + // CHECK-V7: __builtin_arm_cdp2 + // CHECK-V8-NOT: __builtin_arm_cdp2 + // CHECK-V8-BASE-NOT: __builtin_arm_cdp2 + // CHECK-V8-MAIN: __builtin_arm_cdp2 +} + +void ldc(int i) { + __arm_ldc(1, 2, &i); + // CHECK-LABEL: void ldc() + // CHECK-V4: __builtin_arm_ldc + // CHECK-V4-THUMB-NOT: __builtin_arm_ldc + // CHECK-V5: __builtin_arm_ldc + // CHECK-V5-TE: __builtin_arm_ldc + // CHECK-V5-THUMB-NOT: __builtin_arm_ldc + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_ldc + // CHECK-V6: __builtin_arm_ldc + // CHECK-V6-THUMB-NOT: __builtin_arm_ldc + // CHECK-V6M-NOT: __builtin_arm_ldc + // CHECK-V7: __builtin_arm_ldc + // CHECK-V8: __builtin_arm_ldc + // CHECK-V8-BASE-NOT: __builtin_arm_ldc + // CHECK-V8-MAIN: __builtin_arm_ldc +} + +void ldcl(int i) { + __arm_ldcl(1, 2, &i); + // CHECK-LABEL: void ldcl() + // CHECK-V4-NOT: __builtin_arm_ldcl + // CHECK-V4-THUMB-NOT: __builtin_arm_ldcl + // CHECK-V5: __builtin_arm_ldcl + // CHECK-V5-TE: __builtin_arm_ldcl + // CHECK-V5-THUMB-NOT: __builtin_arm_ldcl + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_ldcl + // CHECK-V6: __builtin_arm_ldcl + // CHECK-V6-THUMB-NOT: __builtin_arm_ldcl + // CHECK-V6M-NOT: __builtin_arm_ldcl + // CHECK-V7: __builtin_arm_ldcl + // CHECK-V8-NOT: __builtin_arm_ldcl + // CHECK-V8-BASE-NOT: __builtin_arm_ldcl + // CHECK-V8-MAIN: __builtin_arm_ldcl +} + +void ldc2(int i) { + __arm_ldc2(1, 2, &i); + // CHECK-LABEL: void ldc2() + // CHECK-V4-NOT: __builtin_arm_ldc2 + // CHECK-V4-THUMB-NOT: __builtin_arm_ldc2 + // CHECK-V5: __builtin_arm_ldc2 + // CHECK-V5-TE: __builtin_arm_ldc2 + // CHECK-V5-THUMB-NOT: __builtin_arm_ldc2 + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_ldc2 + // CHECK-V6: __builtin_arm_ldc2 + // CHECK-V6-THUMB-NOT: __builtin_arm_ldc2 + // CHECK-V6M-NOT: __builtin_arm_ldc2 + // CHECK-V7: __builtin_arm_ldc2 + // CHECK-V8-NOT: __builtin_arm_ldc2 + // CHECK-V8-BASE-NOT: __builtin_arm_ldc2 + // CHECK-V8-MAIN: __builtin_arm_ldc2 +} + +void ldc2l(int i) { + __arm_ldc2l(1, 2, &i); + // CHECK-LABEL: void ldc2l() + // CHECK-V4-NOT: __builtin_arm_ldc2l + // CHECK-V4-THUMB-NOT: __builtin_arm_ldc2l + // CHECK-V5: __builtin_arm_ldc2l + // CHECK-V5-TE: __builtin_arm_ldc2l + // CHECK-V5-THUMB-NOT: __builtin_arm_ldc2l + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_ldc2l + // CHECK-V6: __builtin_arm_ldc2l + // CHECK-V6-THUMB-NOT: __builtin_arm_ldc2l + // CHECK-V6M-NOT: __builtin_arm_ldc2l + // CHECK-V7: __builtin_arm_ldc2l + // CHECK-V8-NOT: __builtin_arm_ldc2l + // CHECK-V8-BASE-NOT: __builtin_arm_ldc2l + // CHECK-V8-MAIN: __builtin_arm_ldc2l +} + +void stc(int i) { + __arm_stc(1, 2, &i); + // CHECK-LABEL: void stc() + // CHECK-V4: __builtin_arm_stc + // CHECK-V4-THUMB-NOT: __builtin_arm_stc + // CHECK-V5: __builtin_arm_stc + // CHECK-V5-TE: __builtin_arm_stc + // CHECK-V5-THUMB-NOT: __builtin_arm_stc + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_stc + // CHECK-V6: __builtin_arm_stc + // CHECK-V6-THUMB-NOT: __builtin_arm_stc + // CHECK-V6M-NOT: __builtin_arm_stc + // CHECK-V7: __builtin_arm_stc + // CHECK-V8: __builtin_arm_stc + // CHECK-V8-BASE-NOT: __builtin_arm_stc + // CHECK-V8-MAIN: __builtin_arm_stc +} + +void stcl(int i) { + __arm_stcl(1, 2, &i); + // CHECK-LABEL: void stcl() + // CHECK-V4-NOT: __builtin_arm_stcl + // CHECK-V4-THUMB-NOT: __builtin_arm_stcl + // CHECK-V5: __builtin_arm_stcl + // CHECK-V5-TE: __builtin_arm_stcl + // CHECK-V5-THUMB-NOT: __builtin_arm_stcl + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_stcl + // CHECK-V6: __builtin_arm_stcl + // CHECK-V6-THUMB-NOT: __builtin_arm_stcl + // CHECK-V6M-NOT: __builtin_arm_stcl + // CHECK-V7: __builtin_arm_stcl + // CHECK-V8-NOT: __builtin_arm_stcl + // CHECK-V8-BASE-NOT: __builtin_arm_stcl + // CHECK-V8-MAIN: __builtin_arm_stcl +} + +void stc2(int i) { + __arm_stc2(1, 2, &i); + // CHECK-LABEL: void stc2() + // CHECK-V4-NOT: __builtin_arm_stc2 + // CHECK-V4-THUMB-NOT: __builtin_arm_stc2 + // CHECK-V5: __builtin_arm_stc2 + // CHECK-V5-TE: __builtin_arm_stc2 + // CHECK-V5-THUMB-NOT: __builtin_arm_stc2 + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_stc2 + // CHECK-V6: __builtin_arm_stc2 + // CHECK-V6-THUMB-NOT: __builtin_arm_stc2 + // CHECK-V6M-NOT: __builtin_arm_stc2 + // CHECK-V7: __builtin_arm_stc2 + // CHECK-V8-NOT: __builtin_arm_stc2 + // CHECK-V8-BASE-NOT: __builtin_arm_stc2 + // CHECK-V8-MAIN: __builtin_arm_stc2 +} + +void stc2l(int i) { + __arm_stc2l(1, 2, &i); + // CHECK-LABEL: void stc2l() + // CHECK-V4-NOT: __builtin_arm_stc2l + // CHECK-V4-THUMB-NOT: __builtin_arm_stc2l + // CHECK-V5: __builtin_arm_stc2l + // CHECK-V5-TE: __builtin_arm_stc2l + // CHECK-V5-THUMB-NOT: __builtin_arm_stc2l + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_stc2l + // CHECK-V6: __builtin_arm_stc2l + // CHECK-V6-THUMB-NOT: __builtin_arm_stc2l + // CHECK-V6M-NOT: __builtin_arm_stc2l + // CHECK-V7: __builtin_arm_stc2l + // CHECK-V8-NOT: __builtin_arm_stc2l + // CHECK-V8-BASE-NOT: __builtin_arm_stc2l + // CHECK-V8-MAIN: __builtin_arm_stc2l +} + +void mcr() { + __arm_mcr(1, 2, 3, 4, 5, 6); + // CHECK-LABEL: void mcr() + // CHECK-V4: __builtin_arm_mcr + // CHECK-V4-THUMB-NOT: __builtin_arm_mcr + // CHECK-V5: __builtin_arm_mcr + // CHECK-V5-TE: __builtin_arm_mcr + // CHECK-V5-THUMB-NOT: __builtin_arm_mcr + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_mcr + // CHECK-V6: __builtin_arm_mcr + // CHECK-V6-THUMB-NOT: __builtin_arm_mcr + // CHECK-V6M-NOT: __builtin_arm_mcr + // CHECK-V7: __builtin_arm_mcr + // CHECK-V8: __builtin_arm_mcr + // CHECK-V8-BASE-NOT: __builtin_arm_mcr + // CHECK-V8-MAIN: __builtin_arm_mcr +} + +void mcr2() { + __arm_mcr2(1, 2, 3, 4, 5, 6); + // CHECK-LABEL: void mcr2() + // CHECK-V4-NOT: __builtin_arm_mcr2 + // CHECK-V4-THUMB-NOT: __builtin_arm_mcr2 + // CHECK-V5: __builtin_arm_mcr2 + // CHECK-V5-TE: __builtin_arm_mcr2 + // CHECK-V5-THUMB-NOT: __builtin_arm_mcr2 + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_mcr2 + // CHECK-V6: __builtin_arm_mcr2 + // CHECK-V6-THUMB-NOT: __builtin_arm_mcr2 + // CHECK-V6M-NOT: __builtin_arm_mcr2 + // CHECK-V7: __builtin_arm_mcr2 + // CHECK-V8-NOT: __builtin_arm_mcr2 + // CHECK-V8-BASE-NOT: __builtin_arm_mcr2 + // CHECK-V8-MAIN: __builtin_arm_mcr2 +} + +void mrc() { + __arm_mrc(1, 2, 3, 4, 5); + // CHECK-LABEL: void mrc() + // CHECK-V4: __builtin_arm_mrc + // CHECK-V4-THUMB-NOT: __builtin_arm_mrc + // CHECK-V5: __builtin_arm_mrc + // CHECK-V5-TE: __builtin_arm_mrc + // CHECK-V5-THUMB-NOT: __builtin_arm_mrc + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_mrc + // CHECK-V6: __builtin_arm_mrc + // CHECK-V6-THUMB-NOT: __builtin_arm_mrc + // CHECK-V6M-NOT: __builtin_arm_mrc + // CHECK-V7: __builtin_arm_mrc + // CHECK-V8: __builtin_arm_mrc + // CHECK-V8-BASE-NOT: __builtin_arm_mrc + // CHECK-V8-MAIN: __builtin_arm_mrc +} + +void mrc2() { + __arm_mrc2(1, 2, 3, 4, 5); + // CHECK-LABEL: void mrc2() + // CHECK-V4-NOT: __builtin_arm_mrc2 + // CHECK-V4-THUMB-NOT: __builtin_arm_mrc2 + // CHECK-V5: __builtin_arm_mrc2 + // CHECK-V5-TE: __builtin_arm_mrc2 + // CHECK-V5-THUMB-NOT: __builtin_arm_mrc2 + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_mrc2 + // CHECK-V6: __builtin_arm_mrc2 + // CHECK-V6-THUMB-NOT: __builtin_arm_mrc2 + // CHECK-V6M-NOT: __builtin_arm_mrc2 + // CHECK-V7: __builtin_arm_mrc2 + // CHECK-V8-NOT: __builtin_arm_mrc2 + // CHECK-V8-BASE-NOT: __builtin_arm_mrc2 + // CHECK-V8-MAIN: __builtin_arm_mrc2 +} + +void mcrr() { + __arm_mcrr(1, 2, 3, 4); + // CHECK-LABEL: void mcrr() + // CHECK-V4-NOT: __builtin_arm_mcrr + // CHECK-V4-THUMB-NOT: __builtin_arm_mcrr + // CHECK-V5-NOT: __builtin_arm_mcrr + // CHECK-V5-TE: __builtin_arm_mcrr + // CHECK-V5-THUMB-NOT: __builtin_arm_mcrr + // CHECK-V5-THUMB-NOT: __builtin_arm_mcrr + // CHECK-V6: __builtin_arm_mcrr + // CHECK-V6-THUMB-NOT: __builtin_arm_mcrr + // CHECK-V6M-NOT: __builtin_arm_mcrr + // CHECK-V7: __builtin_arm_mcrr + // CHECK-V8: __builtin_arm_mcrr + // CHECK-V8-BASE-NOT: __builtin_arm_mcrr + // CHECK-V8-MAIN: __builtin_arm_mcrr +} + +void mcrr2() { + __arm_mcrr2(1, 2, 3, 4); + // CHECK-LABEL: void mcrr2() + // CHECK-V4-NOT: __builtin_arm_mcrr2 + // CHECK-V4-THUMB-NOT: __builtin_arm_mcrr2 + // CHECK-V5-NOT: __builtin_arm_mcrr2 + // CHECK-V5-TE-NOT: __builtin_arm_mcrr2 + // CHECK-V5-THUMB-NOT: __builtin_arm_mcrr2 + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_mcrr2 + // CHECK-V6: __builtin_arm_mcrr2 + // CHECK-V6-THUMB-NOT: __builtin_arm_mcrr2 + // CHECK-V6M-NOT: __builtin_arm_mcrr2 + // CHECK-V7: __builtin_arm_mcrr2 + // CHECK-V8-NOT: __builtin_arm_mcrr2 + // CHECK-V8-BASE-NOT: __builtin_arm_mcrr2 + // CHECK-V8-MAIN: __builtin_arm_mcrr2 +} + +void mrrc() { + __arm_mrrc(1, 2, 3); + // CHECK-LABEL: void mrrc() + // CHECK-V4-NOT: __builtin_arm_mrrc + // CHECK-V4-THUMB-NOT: __builtin_arm_mrrc + // CHECK-V5-NOT: __builtin_arm_mrrc + // CHECK-V5-TE: __builtin_arm_mrrc + // CHECK-V5-THUMB-NOT: __builtin_arm_mrrc + // CHECK-V5-THUMB-TE-NOT: __builtin_arm_mrrc + // CHECK-V6: __builtin_arm_mrrc + // CHECK-V6-THUMB-NOT: __builtin_arm_mrrc + // CHECK-V6M-NOT: __builtin_arm_mrrc + // CHECK-V7: __builtin_arm_mrrc + // CHECK-V8: __builtin_arm_mrrc + // CHECK-V8-BASE-NOT: __builtin_arm_mrrc + // CHECK-V8-MAIN: __builtin_arm_mrrc +} + +void mrrc2() { + __arm_mrrc2(1, 2, 3); + // CHECK-LABEL: void mrrc2() + // CHECK-V4-NOT: __builtin_arm_mrrc2 + // CHECK-V4-THUMB-NOT: __builtin_arm_mrrc2 + // CHECK-V5-NOT: __builtin_arm_mrrc2 + // CHECK-V5-TE-NOT: __builtin_arm_mrrc2 + // CHECK-V5-THUMB-NOT: __builtin_arm_mrrc2 + // CHECK-V5-TE-THUMB-NOT: __builtin_arm_mrrc2 + // CHECK-V6: __builtin_arm_mrrc2 + // CHECK-V6-THUMB-NOT: __builtin_arm_mrrc2 + // CHECK-V6M-NOT: __builtin_arm_mrrc2 + // CHECK-V7: __builtin_arm_mrrc2 + // CHECK-V8-NOT: __builtin_arm_mrrc2 + // CHECK-V8-BASE-NOT: __builtin_arm_mrrc2 + // CHECK-V8-MAIN: __builtin_arm_mrrc2 +} diff --git a/clang/test/Preprocessor/aarch64-target-features.c b/clang/test/Preprocessor/aarch64-target-features.c index db89aa7b608ad..45208735920d0 100644 --- a/clang/test/Preprocessor/aarch64-target-features.c +++ b/clang/test/Preprocessor/aarch64-target-features.c @@ -45,6 +45,7 @@ // CHECK-NOT: __ARM_PCS_VFP 1 // CHECK-NOT: __ARM_SIZEOF_MINIMAL_ENUM 1 // CHECK-NOT: __ARM_SIZEOF_WCHAR_T 2 +// CHECK-NOT: __ARM_FEATURE_COPROC // CHECK-NOT: __ARM_FEATURE_SVE // CHECK-NOT: __ARM_FEATURE_DOTPROD // CHECK-NOT: __ARM_FEATURE_PAC_DEFAULT