13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_MIPS_H 
   14#define LLVM_CLANG_LIB_BASIC_TARGETS_MIPS_H 
   19#include "llvm/Support/Compiler.h" 
   20#include "llvm/TargetParser/Triple.h" 
   26  void setDataLayout() {
 
   30      Layout = 
"m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
 
   31    else if (
ABI == 
"n32")
 
   32      Layout = 
"m:e-p:32:32-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128";
 
   33    else if (
ABI == 
"n64")
 
   34      Layout = 
"m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128";
 
   36      llvm_unreachable(
"Invalid ABI");
 
   51  bool CanUseBSDABICalls;
 
   52  enum MipsFloatABI { HardFloat, SoftFloat } FloatABI;
 
   53  enum DspRevEnum { NoDSP, DSP1, DSP2 } DspRev;
 
   56  bool UseIndirectJumpHazard;
 
   67        IsNoABICalls(
false), CanUseBSDABICalls(
false), FloatABI(HardFloat),
 
   68        DspRev(NoDSP), HasMSA(
false), DisableMadd4(
false),
 
   72    if (Triple.isMIPS32())
 
   74    else if (Triple.isABIN32())
 
   79    CPU = 
ABI == 
"o32" ? 
"mips32r2" : 
"mips64r2";
 
   81    CanUseBSDABICalls = Triple.isOSFreeBSD() ||
 
 
   86    return CPU == 
"mips32r6" || CPU == 
"mips64r6" || CPU == 
"i6400" ||
 
 
   91    if (CPU == 
"mips32r6" || 
ABI == 
"n32" || 
ABI == 
"n64" || 
ABI == 
"64")
 
   93    else if (CPU == 
"mips1")
 
 
   99  bool isNan2008()
 const override { 
return IsNan2008; }
 
  101  bool processorSupportsGPR64() 
const;
 
  105  bool setABI(
const std::string &Name)
 override {
 
 
  173  bool isValidCPUName(StringRef Name) 
const override;
 
  176  bool setCPU(
const std::string &Name)
 override {
 
 
  181  const std::string &
getCPU()
 const { 
return CPU; }
 
  185                 const std::vector<std::string> &FeaturesVec)
 const override {
 
  189      Features[
"mips64r2"] = Features[
"cnmips"] = 
true;
 
  190    else if (CPU == 
"octeon+")
 
  191      Features[
"mips64r2"] = Features[
"cnmips"] = Features[
"cnmipsp"] = 
true;
 
  193      Features[CPU] = 
true;
 
 
  197  unsigned getISARev() 
const;
 
  214        "$0", 
"$1", 
"$2", 
"$3", 
"$4", 
"$5", 
"$6", 
"$7", 
"$8", 
"$9", 
"$10",
 
  215        "$11", 
"$12", 
"$13", 
"$14", 
"$15", 
"$16", 
"$17", 
"$18", 
"$19", 
"$20",
 
  216        "$21", 
"$22", 
"$23", 
"$24", 
"$25", 
"$26", 
"$27", 
"$28", 
"$29", 
"$30",
 
  219        "$f0", 
"$f1", 
"$f2", 
"$f3", 
"$f4", 
"$f5", 
"$f6", 
"$f7", 
"$f8", 
"$f9",
 
  220        "$f10", 
"$f11", 
"$f12", 
"$f13", 
"$f14", 
"$f15", 
"$f16", 
"$f17", 
"$f18",
 
  221        "$f19", 
"$f20", 
"$f21", 
"$f22", 
"$f23", 
"$f24", 
"$f25", 
"$f26", 
"$f27",
 
  222        "$f28", 
"$f29", 
"$f30", 
"$f31",
 
  224        "hi", 
"lo", 
"", 
"$fcc0", 
"$fcc1", 
"$fcc2", 
"$fcc3", 
"$fcc4", 
"$fcc5",
 
  225        "$fcc6", 
"$fcc7", 
"$ac1hi", 
"$ac1lo", 
"$ac2hi", 
"$ac2lo", 
"$ac3hi",
 
  228        "$w0", 
"$w1", 
"$w2", 
"$w3", 
"$w4", 
"$w5", 
"$w6", 
"$w7", 
"$w8", 
"$w9",
 
  229        "$w10", 
"$w11", 
"$w12", 
"$w13", 
"$w14", 
"$w15", 
"$w16", 
"$w17", 
"$w18",
 
  230        "$w19", 
"$w20", 
"$w21", 
"$w22", 
"$w23", 
"$w24", 
"$w25", 
"$w26", 
"$w27",
 
  231        "$w28", 
"$w29", 
"$w30", 
"$w31",
 
  233        "$msair", 
"$msacsr", 
"$msaaccess", 
"$msasave", 
"$msamodify",
 
  234        "$msarequest", 
"$msamap", 
"$msaunmap" 
 
  254      return FloatABI != SoftFloat;
 
  268      if (Name[1] == 
'C') { 
 
 
  279    switch (*Constraint) {
 
  281      if (Constraint[1] == 
'C') {
 
  282        R = std::string(
"^") + std::string(Constraint, 2);
 
 
  322    IsSingleFloat = 
false;
 
  323    FloatABI = HardFloat;
 
  327    bool OddSpregGiven = 
false;
 
  328    bool StrictAlign = 
false;
 
  329    bool FpGiven = 
false;
 
  331    for (
const auto &
Feature : Features) {
 
  332      if (
Feature == 
"+single-float")
 
  333        IsSingleFloat = 
true;
 
  334      else if (
Feature == 
"+soft-float")
 
  335        FloatABI = SoftFloat;
 
  338      else if (
Feature == 
"+micromips")
 
  344      else if (
Feature == 
"+strict-align")
 
  347        DspRev = std::max(DspRev, DSP1);
 
  349        DspRev = std::max(DspRev, DSP2);
 
  352      else if (
Feature == 
"+nomadd4")
 
  357      } 
else if (
Feature == 
"-fp64") {
 
  360      } 
else if (
Feature == 
"+fpxx") {
 
  363      } 
else if (
Feature == 
"+nan2008")
 
  365      else if (
Feature == 
"-nan2008")
 
  367      else if (
Feature == 
"+abs2008")
 
  369      else if (
Feature == 
"-abs2008")
 
  371      else if (
Feature == 
"+noabicalls")
 
  373      else if (
Feature == 
"+use-indirect-jump-hazard")
 
  374        UseIndirectJumpHazard = 
true;
 
  375      else if (
Feature == 
"+nooddspreg") {
 
  377        OddSpregGiven = 
false;
 
  378      } 
else if (
Feature == 
"-nooddspreg") {
 
  380        OddSpregGiven = 
true;
 
  390    if (HasMSA && !FpGiven) {
 
  392      Features.push_back(
"+fp64");
 
 
  412        {{
"at"}, 
"$1"},  {{
"v0"}, 
"$2"},         {{
"v1"}, 
"$3"},
 
  413        {{
"a0"}, 
"$4"},  {{
"a1"}, 
"$5"},         {{
"a2"}, 
"$6"},
 
  414        {{
"a3"}, 
"$7"},  {{
"t0"}, 
"$8"},         {{
"t1"}, 
"$9"},
 
  415        {{
"t2"}, 
"$10"}, {{
"t3"}, 
"$11"},        {{
"t4"}, 
"$12"},
 
  416        {{
"t5"}, 
"$13"}, {{
"t6"}, 
"$14"},        {{
"t7"}, 
"$15"},
 
  417        {{
"s0"}, 
"$16"}, {{
"s1"}, 
"$17"},        {{
"s2"}, 
"$18"},
 
  418        {{
"s3"}, 
"$19"}, {{
"s4"}, 
"$20"},        {{
"s5"}, 
"$21"},
 
  419        {{
"s6"}, 
"$22"}, {{
"s7"}, 
"$23"},        {{
"t8"}, 
"$24"},
 
  420        {{
"t9"}, 
"$25"}, {{
"k0"}, 
"$26"},        {{
"k1"}, 
"$27"},
 
  421        {{
"gp"}, 
"$28"}, {{
"sp", 
"$sp"}, 
"$29"}, {{
"fp", 
"$fp"}, 
"$30"},
 
  425        {{
"at"}, 
"$1"},  {{
"v0"}, 
"$2"},         {{
"v1"}, 
"$3"},
 
  426        {{
"a0"}, 
"$4"},  {{
"a1"}, 
"$5"},         {{
"a2"}, 
"$6"},
 
  427        {{
"a3"}, 
"$7"},  {{
"a4"}, 
"$8"},         {{
"a5"}, 
"$9"},
 
  428        {{
"a6"}, 
"$10"}, {{
"a7"}, 
"$11"},        {{
"t0"}, 
"$12"},
 
  429        {{
"t1"}, 
"$13"}, {{
"t2"}, 
"$14"},        {{
"t3"}, 
"$15"},
 
  430        {{
"s0"}, 
"$16"}, {{
"s1"}, 
"$17"},        {{
"s2"}, 
"$18"},
 
  431        {{
"s3"}, 
"$19"}, {{
"s4"}, 
"$20"},        {{
"s5"}, 
"$21"},
 
  432        {{
"s6"}, 
"$22"}, {{
"s7"}, 
"$23"},        {{
"t8"}, 
"$24"},
 
  433        {{
"t9"}, 
"$25"}, {{
"k0"}, 
"$26"},        {{
"k1"}, 
"$27"},
 
  434        {{
"gp"}, 
"$28"}, {{
"sp", 
"$sp"}, 
"$29"}, {{
"fp", 
"$fp"}, 
"$30"},
 
 
  446  unsigned getUnwindWordWidth() 
const override;
 
  452    return std::make_pair(32, 32);
 
 
 
  458  const llvm::Triple Triple;
 
 
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Defines the clang::TargetOptions class.
Concrete class used by the front-end to report problems and issues.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
TargetOptions & getTargetOpts() const
Retrieve the target options.
TargetInfo(const llvm::Triple &T)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
void resetDataLayout(StringRef DL, const char *UserLabelPrefix="")
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
unsigned HasUnalignedAccess
unsigned char MaxAtomicPromoteWidth
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
virtual std::string convertConstraint(const char *&Constraint) const
unsigned char MaxAtomicInlineWidth
Options for controlling the target.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
MicrosoftMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
MinGWMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
bool hasBitIntType() const override
Determine whether the _BitInt type is supported on this target.
enum clang::targets::MipsTargetInfo::FPModeEnum FPMode
MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
bool setCPU(const std::string &Name) override
Target the specified CPU.
StringRef getABI() const override
Get the ABI currently in use.
ArrayRef< const char * > getGCCRegNames() const override
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
bool hasInt128Type() const override
Determine whether the __int128 type is supported on this target.
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
bool isIEEE754_2008Default() const
enum FPModeEnum getDefaultFPMode() const
std::pair< unsigned, unsigned > hardwareInterferenceSizes() const override
The first value in the pair is the minimum offset between two objects to avoid false sharing (destruc...
bool setABI(const std::string &Name) override
Use the specified ABI.
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
std::string convertConstraint(const char *&Constraint) const override
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
bool isNan2008() const override
Returns true if NaN encoding is IEEE 754-2008.
const std::string & getCPU() const
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
WindowsMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Defines the clang::TargetInfo interface.
static const char *const GCCRegNames[]
The JSON file list parser is used to communicate input to InstallAPI.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
unsigned short SuitableAlign
unsigned char PointerWidth
const llvm::fltSemantics * LongDoubleFormat
unsigned char PointerAlign
unsigned char LongDoubleAlign
unsigned char LongDoubleWidth