aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSubtarget.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSubtarget.h')
-rw-r--r--contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSubtarget.h92
1 files changed, 55 insertions, 37 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSubtarget.h b/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSubtarget.h
index c8237e60b4e4..831f7fadaa62 100644
--- a/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSubtarget.h
+++ b/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSubtarget.h
@@ -20,7 +20,7 @@
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
-#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
+#include "llvm/CodeGen/RegisterBankInfo.h"
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DataLayout.h"
@@ -34,22 +34,6 @@ class StringRef;
class RISCVSubtarget : public RISCVGenSubtargetInfo {
public:
- enum ExtZvl : unsigned {
- NotSet = 0,
- Zvl32b = 32,
- Zvl64b = 64,
- Zvl128b = 128,
- Zvl256b = 256,
- Zvl512b = 512,
- Zvl1024b = 1024,
- Zvl2048b = 2048,
- Zvl4096b = 4096,
- Zvl8192b = 8192,
- Zvl16384b = 16384,
- Zvl32768b = 32768,
- Zvl65536b = 65536
- };
-
enum RISCVProcFamilyEnum : uint8_t {
Others,
SiFive7,
@@ -65,6 +49,7 @@ private:
bool HasStdExtF = false;
bool HasStdExtD = false;
bool HasStdExtC = false;
+ bool HasStdExtZihintpause = false;
bool HasStdExtZba = false;
bool HasStdExtZbb = false;
bool HasStdExtZbc = false;
@@ -81,6 +66,7 @@ private:
bool HasStdExtZve64x = false;
bool HasStdExtZve64f = false;
bool HasStdExtZve64d = false;
+ bool HasStdExtZvfh = false;
bool HasStdExtZfhmin = false;
bool HasStdExtZfh = false;
bool HasStdExtZfinx = false;
@@ -100,13 +86,19 @@ private:
bool HasStdExtZks = false;
bool HasStdExtZkt = false;
bool HasStdExtZk = false;
+ bool HasStdExtZicbom = false;
+ bool HasStdExtZicboz = false;
+ bool HasStdExtZicbop = false;
bool HasRV64 = false;
bool IsRV32E = false;
bool EnableLinkerRelax = false;
bool EnableRVCHintInstrs = true;
+ bool EnableDefaultUnroll = true;
bool EnableSaveRestore = false;
+ bool EnableUnalignedScalarMem = false;
+ bool HasLUIADDIFusion = false;
unsigned XLen = 32;
- ExtZvl ZvlLen = ExtZvl::NotSet;
+ unsigned ZvlLen = 0;
MVT XLenVT = MVT::i32;
uint8_t MaxInterleaveFactor = 2;
RISCVABI::ABI TargetABI = RISCVABI::ABI_Unknown;
@@ -161,6 +153,7 @@ public:
bool hasStdExtD() const { return HasStdExtD; }
bool hasStdExtC() const { return HasStdExtC; }
bool hasStdExtV() const { return HasStdExtV; }
+ bool hasStdExtZihintpause() const { return HasStdExtZihintpause; }
bool hasStdExtZba() const { return HasStdExtZba; }
bool hasStdExtZbb() const { return HasStdExtZbb; }
bool hasStdExtZbc() const { return HasStdExtZbc; }
@@ -171,7 +164,8 @@ public:
bool hasStdExtZbr() const { return HasStdExtZbr; }
bool hasStdExtZbs() const { return HasStdExtZbs; }
bool hasStdExtZbt() const { return HasStdExtZbt; }
- bool hasStdExtZvl() const { return ZvlLen != ExtZvl::NotSet; }
+ bool hasStdExtZvl() const { return ZvlLen != 0; }
+ bool hasStdExtZvfh() const { return HasStdExtZvfh; }
bool hasStdExtZfhmin() const { return HasStdExtZfhmin; }
bool hasStdExtZfh() const { return HasStdExtZfh; }
bool hasStdExtZfinx() const { return HasStdExtZfinx; }
@@ -187,11 +181,17 @@ public:
bool hasStdExtZksed() const { return HasStdExtZksed; }
bool hasStdExtZksh() const { return HasStdExtZksh; }
bool hasStdExtZkr() const { return HasStdExtZkr; }
+ bool hasStdExtZicbom() const { return HasStdExtZicbom; }
+ bool hasStdExtZicboz() const { return HasStdExtZicboz; }
+ bool hasStdExtZicbop() const { return HasStdExtZicbop; }
bool is64Bit() const { return HasRV64; }
bool isRV32E() const { return IsRV32E; }
bool enableLinkerRelax() const { return EnableLinkerRelax; }
bool enableRVCHintInstrs() const { return EnableRVCHintInstrs; }
+ bool enableDefaultUnroll() const { return EnableDefaultUnroll; }
bool enableSaveRestore() const { return EnableSaveRestore; }
+ bool enableUnalignedScalarMem() const { return EnableUnalignedScalarMem; }
+ bool hasLUIADDIFusion() const { return HasLUIADDIFusion; }
MVT getXLenVT() const { return XLenVT; }
unsigned getXLen() const { return XLen; }
unsigned getFLen() const {
@@ -203,27 +203,34 @@ public:
return 0;
}
- unsigned getMinVLen() const { return ZvlLen; }
+ unsigned getELEN() const {
+ assert(hasVInstructions() && "Expected V extension");
+ return hasVInstructionsI64() ? 64 : 32;
+ }
+ unsigned getRealMinVLen() const {
+ unsigned VLen = getMinRVVVectorSizeInBits();
+ return VLen == 0 ? getArchMinVLen() : VLen;
+ }
+ unsigned getRealMaxVLen() const {
+ unsigned VLen = getMaxRVVVectorSizeInBits();
+ return VLen == 0 ? getArchMaxVLen() : VLen;
+ }
RISCVABI::ABI getTargetABI() const { return TargetABI; }
bool isRegisterReservedByUser(Register i) const {
assert(i < RISCV::NUM_TARGET_REGS && "Register out of range");
return UserReservedRegister[i];
}
+ bool hasMacroFusion() const { return hasLUIADDIFusion(); }
+
// Vector codegen related methods.
- bool hasVInstructions() const { return HasStdExtV || HasStdExtZve32x; }
- bool hasVInstructionsI64() const { return HasStdExtV || HasStdExtZve64x; }
- bool hasVInstructionsF16() const {
- return (HasStdExtV || HasStdExtZve32f) && HasStdExtZfh;
- }
+ bool hasVInstructions() const { return HasStdExtZve32x; }
+ bool hasVInstructionsI64() const { return HasStdExtZve64x; }
+ bool hasVInstructionsF16() const { return HasStdExtZvfh && HasStdExtZfh; }
// FIXME: Consider Zfinx in the future
- bool hasVInstructionsF32() const {
- return HasStdExtV || (HasStdExtZve32f && HasStdExtF);
- }
+ bool hasVInstructionsF32() const { return HasStdExtZve32f && HasStdExtF; }
// FIXME: Consider Zdinx in the future
- bool hasVInstructionsF64() const {
- return HasStdExtV || (HasStdExtZve64d && HasStdExtD);
- }
+ bool hasVInstructionsF64() const { return HasStdExtZve64d && HasStdExtD; }
// F16 and F64 both require F32.
bool hasVInstructionsAnyF() const { return hasVInstructionsF32(); }
unsigned getMaxInterleaveFactor() const {
@@ -237,6 +244,18 @@ protected:
std::unique_ptr<LegalizerInfo> Legalizer;
std::unique_ptr<RegisterBankInfo> RegBankInfo;
+ // Return the known range for the bit length of RVV data registers as set
+ // at the command line. A value of 0 means nothing is known about that particular
+ // limit beyond what's implied by the architecture.
+ // NOTE: Please use getRealMinVLen and getRealMaxVLen instead!
+ unsigned getMaxRVVVectorSizeInBits() const;
+ unsigned getMinRVVVectorSizeInBits() const;
+
+ // Return the known range for the bit length of RVV data registers as indicated
+ // by -march and -mattr.
+ unsigned getArchMinVLen() const { return ZvlLen; }
+ unsigned getArchMaxVLen() const { return 65536; }
+
public:
const CallLowering *getCallLowering() const override;
InstructionSelector *getInstructionSelector() const override;
@@ -249,14 +268,13 @@ public:
// pool if exceeded.
unsigned getMaxBuildIntsCost() const;
- // Return the known range for the bit length of RVV data registers. A value
- // of 0 means nothing is known about that particular limit beyond what's
- // implied by the architecture.
- unsigned getMaxRVVVectorSizeInBits() const;
- unsigned getMinRVVVectorSizeInBits() const;
unsigned getMaxLMULForFixedLengthVectors() const;
- unsigned getMaxELENForFixedLengthVectors() const;
bool useRVVForFixedLengthVectors() const;
+
+ bool enableSubRegLiveness() const override;
+
+ void getPostRAMutations(std::vector<std::unique_ptr<ScheduleDAGMutation>>
+ &Mutations) const override;
};
} // End llvm namespace