simon_tatham created this revision. simon_tatham added reviewers: dmgreen, samparker, SjoerdMeijer. Herald added subscribers: cfe-commits, kristof.beyls, javed.absar. Herald added a project: clang.
If MVE is present at all, then the macro __ARM_FEATURE_MVE is defined to a value which has bit 0 set for integer MVE, and bit 1 set for floating-point MVE. (Floating-point MVE implies integer MVE, so if this macro is defined at all then it will be set to 1 or 3, never 2.) Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D60710 Files: clang/lib/Basic/Targets/ARM.cpp clang/lib/Basic/Targets/ARM.h Index: clang/lib/Basic/Targets/ARM.h =================================================================== --- clang/lib/Basic/Targets/ARM.h +++ clang/lib/Basic/Targets/ARM.h @@ -33,6 +33,11 @@ FPARMV8 = (1 << 4) }; + enum MVEMode { + MVE_INT = (1 << 0), + MVE_FP = (1 << 1) + }; + // Possible HWDiv features. enum HWDivMode { HWDivThumb = (1 << 0), HWDivARM = (1 << 1) }; @@ -56,6 +61,7 @@ unsigned ArchVersion; unsigned FPU : 5; + unsigned MVE : 2; unsigned IsAAPCS : 1; unsigned HWDiv : 2; @@ -100,6 +106,8 @@ bool isThumb() const; bool supportsThumb() const; bool supportsThumb2() const; + bool hasMVE() const; + bool hasMVEFloat() const; StringRef getCPUAttr() const; StringRef getCPUProfile() const; Index: clang/lib/Basic/Targets/ARM.cpp =================================================================== --- clang/lib/Basic/Targets/ARM.cpp +++ clang/lib/Basic/Targets/ARM.cpp @@ -146,6 +146,14 @@ } } +bool ARMTargetInfo::hasMVE() const { + return ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline && MVE != 0; +} + +bool ARMTargetInfo::hasMVEFloat() const { + return hasMVE() && (MVE & MVE_FP); +} + bool ARMTargetInfo::isThumb() const { return ArchISA == llvm::ARM::ISAKind::THUMB; } @@ -443,6 +451,13 @@ HasLegalHalfType = true; } else if (Feature == "+dotprod") { DotProd = true; + } else if (Feature == "+mve") { + DSP = 1; + MVE |= MVE_INT; + } else if (Feature == "+mve.fp") { + DSP = 1; + MVE |= MVE_INT | MVE_FP; + HW_FP |= HW_FP_SP | HW_FP_HP; } } @@ -493,6 +508,7 @@ .Case("vfp", FPU && !SoftFloat) .Case("hwdiv", HWDiv & HWDivThumb) .Case("hwdiv-arm", HWDiv & HWDivARM) + .Case("mve", hasMVE()) .Default(false); } @@ -708,6 +724,10 @@ "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP)); } + if (hasMVE()) { + Builder.defineMacro("__ARM_FEATURE_MVE", hasMVEFloat() ? "3" : "1"); + } + Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Twine(Opts.WCharSize ? Opts.WCharSize : 4));
Index: clang/lib/Basic/Targets/ARM.h =================================================================== --- clang/lib/Basic/Targets/ARM.h +++ clang/lib/Basic/Targets/ARM.h @@ -33,6 +33,11 @@ FPARMV8 = (1 << 4) }; + enum MVEMode { + MVE_INT = (1 << 0), + MVE_FP = (1 << 1) + }; + // Possible HWDiv features. enum HWDivMode { HWDivThumb = (1 << 0), HWDivARM = (1 << 1) }; @@ -56,6 +61,7 @@ unsigned ArchVersion; unsigned FPU : 5; + unsigned MVE : 2; unsigned IsAAPCS : 1; unsigned HWDiv : 2; @@ -100,6 +106,8 @@ bool isThumb() const; bool supportsThumb() const; bool supportsThumb2() const; + bool hasMVE() const; + bool hasMVEFloat() const; StringRef getCPUAttr() const; StringRef getCPUProfile() const; Index: clang/lib/Basic/Targets/ARM.cpp =================================================================== --- clang/lib/Basic/Targets/ARM.cpp +++ clang/lib/Basic/Targets/ARM.cpp @@ -146,6 +146,14 @@ } } +bool ARMTargetInfo::hasMVE() const { + return ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline && MVE != 0; +} + +bool ARMTargetInfo::hasMVEFloat() const { + return hasMVE() && (MVE & MVE_FP); +} + bool ARMTargetInfo::isThumb() const { return ArchISA == llvm::ARM::ISAKind::THUMB; } @@ -443,6 +451,13 @@ HasLegalHalfType = true; } else if (Feature == "+dotprod") { DotProd = true; + } else if (Feature == "+mve") { + DSP = 1; + MVE |= MVE_INT; + } else if (Feature == "+mve.fp") { + DSP = 1; + MVE |= MVE_INT | MVE_FP; + HW_FP |= HW_FP_SP | HW_FP_HP; } } @@ -493,6 +508,7 @@ .Case("vfp", FPU && !SoftFloat) .Case("hwdiv", HWDiv & HWDivThumb) .Case("hwdiv-arm", HWDiv & HWDivARM) + .Case("mve", hasMVE()) .Default(false); } @@ -708,6 +724,10 @@ "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP)); } + if (hasMVE()) { + Builder.defineMacro("__ARM_FEATURE_MVE", hasMVEFloat() ? "3" : "1"); + } + Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Twine(Opts.WCharSize ? Opts.WCharSize : 4));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits