Replace string GNU Triples with llvm::Triple in MCSubtargetInfo and create*MCSubtarge...
[oota-llvm.git] / lib / MC / MCSubtargetInfo.cpp
1 //===-- MCSubtargetInfo.cpp - 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 #include "llvm/MC/MCSubtargetInfo.h"
11 #include "llvm/ADT/StringRef.h"
12 #include "llvm/ADT/Triple.h"
13 #include "llvm/MC/MCInstrItineraries.h"
14 #include "llvm/MC/SubtargetFeature.h"
15 #include "llvm/Support/raw_ostream.h"
16 #include <algorithm>
17
18 using namespace llvm;
19
20 /// InitMCProcessorInfo - Set or change the CPU (optionally supplemented
21 /// with feature string). Recompute feature bits and scheduling model.
22 void
23 MCSubtargetInfo::InitMCProcessorInfo(StringRef CPU, StringRef FS) {
24   SubtargetFeatures Features(FS);
25   FeatureBits = Features.getFeatureBits(CPU, ProcDesc, ProcFeatures);
26   InitCPUSchedModel(CPU);
27 }
28
29 void
30 MCSubtargetInfo::InitCPUSchedModel(StringRef CPU) {
31   if (!CPU.empty())
32     CPUSchedModel = getSchedModelForCPU(CPU);
33   else
34     CPUSchedModel = MCSchedModel::GetDefaultSchedModel();
35 }
36
37 void MCSubtargetInfo::InitMCSubtargetInfo(
38     const Triple &TT, StringRef C, StringRef FS,
39     ArrayRef<SubtargetFeatureKV> PF, ArrayRef<SubtargetFeatureKV> PD,
40     const SubtargetInfoKV *ProcSched, const MCWriteProcResEntry *WPR,
41     const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA,
42     const InstrStage *IS, const unsigned *OC, const unsigned *FP) {
43   TargetTriple = TT;
44   CPU = C;
45   ProcFeatures = PF;
46   ProcDesc = PD;
47   ProcSchedModels = ProcSched;
48   WriteProcResTable = WPR;
49   WriteLatencyTable = WL;
50   ReadAdvanceTable = RA;
51
52   Stages = IS;
53   OperandCycles = OC;
54   ForwardingPaths = FP;
55
56   InitMCProcessorInfo(CPU, FS);
57 }
58
59 /// ToggleFeature - Toggle a feature and returns the re-computed feature
60 /// bits. This version does not change the implied bits.
61 FeatureBitset MCSubtargetInfo::ToggleFeature(uint64_t FB) {
62   FeatureBits.flip(FB);
63   return FeatureBits;
64 }
65
66 FeatureBitset MCSubtargetInfo::ToggleFeature(const FeatureBitset &FB) {
67   FeatureBits ^= FB;
68   return FeatureBits;
69 }
70
71 /// ToggleFeature - Toggle a feature and returns the re-computed feature
72 /// bits. This version will also change all implied bits.
73 FeatureBitset MCSubtargetInfo::ToggleFeature(StringRef FS) {
74   SubtargetFeatures Features;
75   FeatureBits = Features.ToggleFeature(FeatureBits, FS, ProcFeatures);
76   return FeatureBits;
77 }
78
79 FeatureBitset MCSubtargetInfo::ApplyFeatureFlag(StringRef FS) {
80   SubtargetFeatures Features;
81   FeatureBits = Features.ApplyFeatureFlag(FeatureBits, FS, ProcFeatures);
82   return FeatureBits;
83 }
84
85 MCSchedModel
86 MCSubtargetInfo::getSchedModelForCPU(StringRef CPU) const {
87   assert(ProcSchedModels && "Processor machine model not available!");
88
89   unsigned NumProcs = ProcDesc.size();
90 #ifndef NDEBUG
91   for (size_t i = 1; i < NumProcs; i++) {
92     assert(strcmp(ProcSchedModels[i - 1].Key, ProcSchedModels[i].Key) < 0 &&
93            "Processor machine model table is not sorted");
94   }
95 #endif
96
97   // Find entry
98   const SubtargetInfoKV *Found =
99     std::lower_bound(ProcSchedModels, ProcSchedModels+NumProcs, CPU);
100   if (Found == ProcSchedModels+NumProcs || StringRef(Found->Key) != CPU) {
101     if (CPU != "help") // Don't error if the user asked for help.
102       errs() << "'" << CPU
103              << "' is not a recognized processor for this target"
104              << " (ignoring processor)\n";
105     return MCSchedModel::GetDefaultSchedModel();
106   }
107   assert(Found->Value && "Missing processor SchedModel value");
108   return *(const MCSchedModel *)Found->Value;
109 }
110
111 InstrItineraryData
112 MCSubtargetInfo::getInstrItineraryForCPU(StringRef CPU) const {
113   const MCSchedModel SchedModel = getSchedModelForCPU(CPU);
114   return InstrItineraryData(SchedModel, Stages, OperandCycles, ForwardingPaths);
115 }
116
117 /// Initialize an InstrItineraryData instance.
118 void MCSubtargetInfo::initInstrItins(InstrItineraryData &InstrItins) const {
119   InstrItins =
120     InstrItineraryData(CPUSchedModel, Stages, OperandCycles, ForwardingPaths);
121 }