diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/RISCV/Utils/RISCVBaseInfo.h')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/RISCV/Utils/RISCVBaseInfo.h | 223 | 
1 files changed, 223 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/RISCV/Utils/RISCVBaseInfo.h b/contrib/llvm-project/llvm/lib/Target/RISCV/Utils/RISCVBaseInfo.h new file mode 100644 index 000000000000..4e6cdd8606b1 --- /dev/null +++ b/contrib/llvm-project/llvm/lib/Target/RISCV/Utils/RISCVBaseInfo.h @@ -0,0 +1,223 @@ +//===-- RISCVBaseInfo.h - Top level definitions for RISCV MC ----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains small standalone enum definitions for the RISCV target +// useful for the compiler back-end and the MC libraries. +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVBASEINFO_H +#define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVBASEINFO_H + +#include "RISCVRegisterInfo.h" +#include "MCTargetDesc/RISCVMCTargetDesc.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/MC/MCInstrDesc.h" +#include "llvm/MC/SubtargetFeature.h" + +namespace llvm { + +// RISCVII - This namespace holds all of the target specific flags that +// instruction info tracks. All definitions must match RISCVInstrFormats.td. +namespace RISCVII { +enum { +  InstFormatPseudo = 0, +  InstFormatR = 1, +  InstFormatR4 = 2, +  InstFormatI = 3, +  InstFormatS = 4, +  InstFormatB = 5, +  InstFormatU = 6, +  InstFormatJ = 7, +  InstFormatCR = 8, +  InstFormatCI = 9, +  InstFormatCSS = 10, +  InstFormatCIW = 11, +  InstFormatCL = 12, +  InstFormatCS = 13, +  InstFormatCA = 14, +  InstFormatCB = 15, +  InstFormatCJ = 16, +  InstFormatOther = 17, + +  InstFormatMask = 31, +}; + +// RISC-V Specific Machine Operand Flags +enum { +  MO_None = 0, +  MO_CALL = 1, +  MO_PLT = 2, +  MO_LO = 3, +  MO_HI = 4, +  MO_PCREL_LO = 5, +  MO_PCREL_HI = 6, +  MO_GOT_HI = 7, +  MO_TPREL_LO = 8, +  MO_TPREL_HI = 9, +  MO_TPREL_ADD = 10, +  MO_TLS_GOT_HI = 11, +  MO_TLS_GD_HI = 12, + +  // Used to differentiate between target-specific "direct" flags and "bitmask" +  // flags. A machine operand can only have one "direct" flag, but can have +  // multiple "bitmask" flags. +  MO_DIRECT_FLAG_MASK = 15 +}; +} // namespace RISCVII + +namespace RISCVOp { +enum OperandType : unsigned { +  OPERAND_FIRST_RISCV_IMM = MCOI::OPERAND_FIRST_TARGET, +  OPERAND_UIMM4 = OPERAND_FIRST_RISCV_IMM, +  OPERAND_UIMM5, +  OPERAND_UIMM12, +  OPERAND_SIMM12, +  OPERAND_SIMM13_LSB0, +  OPERAND_UIMM20, +  OPERAND_SIMM21_LSB0, +  OPERAND_UIMMLOG2XLEN, +  OPERAND_LAST_RISCV_IMM = OPERAND_UIMMLOG2XLEN +}; +} // namespace RISCVOp + +// Describes the predecessor/successor bits used in the FENCE instruction. +namespace RISCVFenceField { +enum FenceField { +  I = 8, +  O = 4, +  R = 2, +  W = 1 +}; +} + +// Describes the supported floating point rounding mode encodings. +namespace RISCVFPRndMode { +enum RoundingMode { +  RNE = 0, +  RTZ = 1, +  RDN = 2, +  RUP = 3, +  RMM = 4, +  DYN = 7, +  Invalid +}; + +inline static StringRef roundingModeToString(RoundingMode RndMode) { +  switch (RndMode) { +  default: +    llvm_unreachable("Unknown floating point rounding mode"); +  case RISCVFPRndMode::RNE: +    return "rne"; +  case RISCVFPRndMode::RTZ: +    return "rtz"; +  case RISCVFPRndMode::RDN: +    return "rdn"; +  case RISCVFPRndMode::RUP: +    return "rup"; +  case RISCVFPRndMode::RMM: +    return "rmm"; +  case RISCVFPRndMode::DYN: +    return "dyn"; +  } +} + +inline static RoundingMode stringToRoundingMode(StringRef Str) { +  return StringSwitch<RoundingMode>(Str) +      .Case("rne", RISCVFPRndMode::RNE) +      .Case("rtz", RISCVFPRndMode::RTZ) +      .Case("rdn", RISCVFPRndMode::RDN) +      .Case("rup", RISCVFPRndMode::RUP) +      .Case("rmm", RISCVFPRndMode::RMM) +      .Case("dyn", RISCVFPRndMode::DYN) +      .Default(RISCVFPRndMode::Invalid); +} + +inline static bool isValidRoundingMode(unsigned Mode) { +  switch (Mode) { +  default: +    return false; +  case RISCVFPRndMode::RNE: +  case RISCVFPRndMode::RTZ: +  case RISCVFPRndMode::RDN: +  case RISCVFPRndMode::RUP: +  case RISCVFPRndMode::RMM: +  case RISCVFPRndMode::DYN: +    return true; +  } +} +} // namespace RISCVFPRndMode + +namespace RISCVSysReg { +struct SysReg { +  const char *Name; +  unsigned Encoding; +  const char *AltName; +  // FIXME: add these additional fields when needed. +  // Privilege Access: Read, Write, Read-Only. +  // unsigned ReadWrite; +  // Privilege Mode: User, System or Machine. +  // unsigned Mode; +  // Check field name. +  // unsigned Extra; +  // Register number without the privilege bits. +  // unsigned Number; +  FeatureBitset FeaturesRequired; +  bool isRV32Only; + +  bool haveRequiredFeatures(FeatureBitset ActiveFeatures) const { +    // Not in 32-bit mode. +    if (isRV32Only && ActiveFeatures[RISCV::Feature64Bit]) +      return false; +    // No required feature associated with the system register. +    if (FeaturesRequired.none()) +      return true; +    return (FeaturesRequired & ActiveFeatures) == FeaturesRequired; +  } +}; + +#define GET_SysRegsList_DECL +#include "RISCVGenSystemOperands.inc" +} // end namespace RISCVSysReg + +namespace RISCVABI { + +enum ABI { +  ABI_ILP32, +  ABI_ILP32F, +  ABI_ILP32D, +  ABI_ILP32E, +  ABI_LP64, +  ABI_LP64F, +  ABI_LP64D, +  ABI_Unknown +}; + +// Returns the target ABI, or else a StringError if the requested ABIName is +// not supported for the given TT and FeatureBits combination. +ABI computeTargetABI(const Triple &TT, FeatureBitset FeatureBits, +                     StringRef ABIName); + +ABI getTargetABI(StringRef ABIName); + +// Returns the register used to hold the stack pointer after realignment. +Register getBPReg(); + +} // namespace RISCVABI + +namespace RISCVFeatures { + +// Validates if the given combination of features are valid for the target +// triple. Exits with report_fatal_error if not. +void validate(const Triple &TT, const FeatureBitset &FeatureBits); + +} // namespace RISCVFeatures + +} // namespace llvm + +#endif  | 
