diff options
author | Kito Cheng <kito.cheng@sifive.com> | 2020-10-06 14:33:43 +0800 |
---|---|---|
committer | Kito Cheng <kito.cheng@sifive.com> | 2020-10-16 13:55:08 +0800 |
commit | cfa7094e49cfb7e37a84c0aa57c85c64c0581d17 (patch) | |
tree | 1bcc08cc02ee227e4b0442c994370c96385a0dd0 /llvm/lib/Support/TargetParser.cpp | |
parent | 19ae9b6e21e2491debeb910e2c541be9796f1b13 (diff) | |
download | llvm-cfa7094e49cfb7e37a84c0aa57c85c64c0581d17.zip llvm-cfa7094e49cfb7e37a84c0aa57c85c64c0581d17.tar.gz llvm-cfa7094e49cfb7e37a84c0aa57c85c64c0581d17.tar.bz2 |
[RISCV] Add -mtune support
- The goal of this patch is improve option compatible with RISCV-V GCC,
-mcpu support on GCC side will sent patch in next few days.
- -mtune only affect the pipeline model and non-arch/extension related
target feature, e.g. instruction fusion; in td file it called
TuneFeatures, which is introduced by X86 back-end[1].
- -mtune accept all valid option for -mcpu and extra alias processor
option, e.g. `generic`, `rocket` and `sifive-7-series`, the purpose is
option compatible with RISCV-V GCC.
- Processor alias for -mtune will resolve according the current target arch,
rv32 or rv64, e.g. `rocket` will resolve to `rocket-rv32` or `rocket-rv64`.
- Interaction between -mcpu and -mtune:
* -mtune has higher priority than -mcpu for pipeline model and
TuneFeatures.
[1] https://reviews.llvm.org/D85165
Reviewed By: luismarques
Differential Revision: https://reviews.llvm.org/D89025
Diffstat (limited to 'llvm/lib/Support/TargetParser.cpp')
-rw-r--r-- | llvm/lib/Support/TargetParser.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/lib/Support/TargetParser.cpp b/llvm/lib/Support/TargetParser.cpp index 4d96b34..60d102e 100644 --- a/llvm/lib/Support/TargetParser.cpp +++ b/llvm/lib/Support/TargetParser.cpp @@ -253,6 +253,12 @@ bool checkCPUKind(CPUKind Kind, bool IsRV64) { return RISCVCPUInfo[static_cast<unsigned>(Kind)].is64Bit() == IsRV64; } +bool checkTuneCPUKind(CPUKind Kind, bool IsRV64) { + if (Kind == CK_INVALID) + return false; + return RISCVCPUInfo[static_cast<unsigned>(Kind)].is64Bit() == IsRV64; +} + CPUKind parseCPUKind(StringRef CPU) { return llvm::StringSwitch<CPUKind>(CPU) #define PROC(ENUM, NAME, FEATURES, DEFAULT_MARCH) .Case(NAME, CK_##ENUM) @@ -260,6 +266,22 @@ CPUKind parseCPUKind(StringRef CPU) { .Default(CK_INVALID); } +StringRef resolveTuneCPUAlias(StringRef TuneCPU, bool IsRV64) { + return llvm::StringSwitch<StringRef>(TuneCPU) +#define PROC_ALIAS(NAME, RV32, RV64) .Case(NAME, IsRV64 ? StringRef(RV64) : StringRef(RV32)) +#include "llvm/Support/RISCVTargetParser.def" + .Default(TuneCPU); +} + +CPUKind parseTuneCPUKind(StringRef TuneCPU, bool IsRV64) { + TuneCPU = resolveTuneCPUAlias(TuneCPU, IsRV64); + + return llvm::StringSwitch<CPUKind>(TuneCPU) +#define PROC(ENUM, NAME, FEATURES, DEFAULT_MARCH) .Case(NAME, CK_##ENUM) +#include "llvm/Support/RISCVTargetParser.def" + .Default(CK_INVALID); +} + StringRef getMArchFromMcpu(StringRef CPU) { CPUKind Kind = parseCPUKind(CPU); return RISCVCPUInfo[static_cast<unsigned>(Kind)].DefaultMarch; @@ -272,6 +294,15 @@ void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64) { } } +void fillValidTuneCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64) { + for (const auto &C : RISCVCPUInfo) { + if (C.Kind != CK_INVALID && IsRV64 == C.is64Bit()) + Values.emplace_back(C.Name); + } +#define PROC_ALIAS(NAME, RV32, RV64) Values.emplace_back(StringRef(NAME)); +#include "llvm/Support/RISCVTargetParser.def" +} + // Get all features except standard extension feature bool getCPUFeaturesExceptStdExt(CPUKind Kind, std::vector<StringRef> &Features) { |