LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MipsSubtarget.cpp
Go to the documentation of this file.
1 //===-- MipsSubtarget.cpp - Mips Subtarget Information --------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the Mips specific subclass of TargetSubtargetInfo.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #define DEBUG_TYPE "mips-subtarget"
15 
16 #include "MipsMachineFunction.h"
17 #include "MipsSubtarget.h"
18 #include "MipsTargetMachine.h"
19 #include "Mips.h"
20 #include "MipsRegisterInfo.h"
21 #include "llvm/IR/Attributes.h"
22 #include "llvm/IR/Function.h"
24 #include "llvm/Support/Debug.h"
27 
28 #define GET_SUBTARGETINFO_TARGET_DESC
29 #define GET_SUBTARGETINFO_CTOR
30 #include "MipsGenSubtargetInfo.inc"
31 
32 
33 using namespace llvm;
34 
35 // FIXME: Maybe this should be on by default when Mips16 is specified
36 //
38  "mips-mixed-16-32",
39  cl::init(false),
40  cl::desc("Allow for a mixture of Mips16 "
41  "and Mips32 code in a single source file"),
42  cl::Hidden);
43 
45  "mips-os16",
46  cl::init(false),
47  cl::desc("Compile all functions that don' use "
48  "floating point as Mips 16"),
49  cl::Hidden);
50 
51 static cl::opt<bool>
52 Mips16HardFloat("mips16-hard-float", cl::NotHidden,
53  cl::desc("MIPS: mips16 hard float enable."),
54  cl::init(false));
55 
56 static cl::opt<bool>
58  "mips16-constant-islands", cl::Hidden,
59  cl::desc("MIPS: mips16 constant islands enable. experimental feature"),
60  cl::init(false));
61 
62 void MipsSubtarget::anchor() { }
63 
64 MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
65  const std::string &FS, bool little,
66  Reloc::Model _RM, MipsTargetMachine *_TM) :
67  MipsGenSubtargetInfo(TT, CPU, FS),
68  MipsArchVersion(Mips32), MipsABI(UnknownABI), IsLittle(little),
69  IsSingleFloat(false), IsFP64bit(false), IsGP64bit(false), HasVFPU(false),
70  IsLinux(true), HasSEInReg(false), HasCondMov(false), HasSwap(false),
71  HasBitCount(false), HasFPIdx(false),
72  InMips16Mode(false), InMips16HardFloat(Mips16HardFloat),
73  InMicroMipsMode(false), HasDSP(false), HasDSPR2(false),
74  AllowMixed16_32(Mixed16_32 | Mips_Os16), Os16(Mips_Os16), HasMSA(false),
75  RM(_RM), OverrideMode(NoOverride), TM(_TM)
76 {
77  std::string CPUName = CPU;
78  if (CPUName.empty())
79  CPUName = "mips32";
80 
81  // Parse features string.
82  ParseSubtargetFeatures(CPUName, FS);
83 
85 
86  // Initialize scheduling itinerary for the specified CPU.
87  InstrItins = getInstrItineraryForCPU(CPUName);
88 
89  // Set MipsABI if it hasn't been set yet.
90  if (MipsABI == UnknownABI)
91  MipsABI = hasMips64() ? N64 : O32;
92 
93  // Check if Architecture and ABI are compatible.
94  assert(((!hasMips64() && (isABI_O32() || isABI_EABI())) ||
95  (hasMips64() && (isABI_N32() || isABI_N64()))) &&
96  "Invalid Arch & ABI pair.");
97 
98  if (hasMSA() && !isFP64bit())
99  report_fatal_error("MSA requires a 64-bit FPU register file (FR=1 mode). "
100  "See -mattr=+fp64.",
101  false);
102 
103  // Is the target system Linux ?
104  if (TT.find("linux") == std::string::npos)
105  IsLinux = false;
106 
107  // Set UseSmallSection.
109  // set some subtarget specific features
110  if (inMips16Mode())
111  HasBitCount=false;
112 }
113 
114 bool
117  RegClassVector &CriticalPathRCs) const {
119  CriticalPathRCs.clear();
120  CriticalPathRCs.push_back(hasMips64() ?
121  &Mips::GPR64RegClass : &Mips::GPR32RegClass);
122  return OptLevel >= CodeGenOpt::Aggressive;
123 }
124 
125 //FIXME: This logic for reseting the subtarget along with
126 // the helper classes can probably be simplified but there are a lot of
127 // cases so we will defer rewriting this to later.
128 //
130  bool ChangeToMips16 = false, ChangeToNoMips16 = false;
131  DEBUG(dbgs() << "resetSubtargetFeatures" << "\n");
132  AttributeSet FnAttrs = MF->getFunction()->getAttributes();
133  ChangeToMips16 = FnAttrs.hasAttribute(AttributeSet::FunctionIndex,
134  "mips16");
135  ChangeToNoMips16 = FnAttrs.hasAttribute(AttributeSet::FunctionIndex,
136  "nomips16");
137  assert (!(ChangeToMips16 & ChangeToNoMips16) &&
138  "mips16 and nomips16 specified on the same function");
139  if (ChangeToMips16) {
141  return;
143  PreviousInMips16Mode = true;
145  return;
146  } else if (ChangeToNoMips16) {
148  return;
150  PreviousInMips16Mode = false;
152  return;
153  } else {
154  if (OverrideMode == NoOverride)
155  return;
157  DEBUG(dbgs() << "back to default" << "\n");
160  PreviousInMips16Mode = true;
161  } else if (!inMips16Mode() && PreviousInMips16Mode) {
163  PreviousInMips16Mode = false;
164  }
165  return;
166  }
167 }
168 
171 }
172 
174  DEBUG(dbgs() << "use constant islands " << Mips16ConstantIslands << "\n");
175  return Mips16ConstantIslands;
176 }
static cl::opt< bool > Mips_Os16("mips-os16", cl::init(false), cl::desc("Compile all functions that don' use ""floating point as Mips 16"), cl::Hidden)
MipsTargetMachine * TM
const Function * getFunction() const
bool hasAttribute(unsigned Index, Attribute::AttrKind Kind) const
Return true if the attribute exists at the given index.
Definition: Attributes.cpp:818
void resetSubtarget(MachineFunction *MF)
Reset the subtarget for the Mips target.
bool isABI_O32() const
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
InstrItineraryData InstrItins
This file contains the simple types necessary to represent the attributes associated with functions a...
bool hasMSA() const
#define false
Definition: ConvertUTF.c:64
bool hasMips64() const
bool isABI_N64() const
bool isABI_N32() const
#define true
Definition: ConvertUTF.c:65
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:314
static cl::opt< bool > Mips16HardFloat("mips16-hard-float", cl::NotHidden, cl::desc("MIPS: mips16 hard float enable."), cl::init(false))
static cl::opt< bool > Mips16ConstantIslands("mips16-constant-islands", cl::Hidden, cl::desc("MIPS: mips16 constant islands enable. experimental feature"), cl::init(false))
bool isFP64bit() const
bool mipsSEUsesSoftFloat() const
bool inMips16Mode() const
MipsSubtarget(const std::string &TT, const std::string &CPU, const std::string &FS, bool little, Reloc::Model RM, MipsTargetMachine *TM)
enum llvm::MipsSubtarget::@189 OverrideMode
static bool useConstantIslands()
virtual bool enablePostRAScheduler(CodeGenOpt::Level OptLevel, AntiDepBreakMode &Mode, RegClassVector &CriticalPathRCs) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
Definition: Debug.cpp:101
AttributeSet getAttributes() const
Return the attribute list for this Function.
Definition: Function.h:170
bool isABI_EABI() const
Only O32 and EABI supported right now.
void ParseSubtargetFeatures(StringRef CPU, StringRef FS)
static cl::opt< bool > Mixed16_32("mips-mixed-16-32", cl::init(false), cl::desc("Allow for a mixture of Mips16 ""and Mips32 code in a single source file"), cl::Hidden)
MipsABIEnum MipsABI
Definition: MipsSubtarget.h:51
#define DEBUG(X)
Definition: Debug.h:97