2
0

MCSubtargetInfo.cpp 4.1 KB

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