1ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Cheng//===-- llvm/MC/SubtargetFeature.h - CPU characteristics --------*- C++ -*-===//
2b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//
3b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//                     The LLVM Compiler Infrastructure
4b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//
8b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//===----------------------------------------------------------------------===//
9b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//
10b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey// This file defines and manages user or tool specified CPU characteristics.
11b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey// The intent is to be able to package specific features that should or should
12b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey// not be used on a specific target processor.  A tool, such as llc, could, as
13b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey// as example, gather chip info from the command line, a long with features
14b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey// that should be used on that chip.
15b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//
16b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//===----------------------------------------------------------------------===//
17b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
18ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Cheng#ifndef LLVM_MC_SUBTARGETFEATURE_H
19ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Cheng#define LLVM_MC_SUBTARGETFEATURE_H
20b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/ArrayRef.h"
22e823db8bae7fe42cd4f1fa861bec8c36a636702bViktor Kutuzov#include "llvm/ADT/Triple.h"
231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h"
24b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
25b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskeynamespace llvm {
26e0c86afac63a2dbbcff0ad79ed7b93d860451385Chris Lattner  class raw_ostream;
27e1bff38386b0af24b5564c3d20888c7bbb045099Evan Cheng  class StringRef;
28639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
29b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//===----------------------------------------------------------------------===//
30b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey///
31b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey/// SubtargetFeatureKV - Used to provide key value pairs for feature and
32b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey/// CPU bit flags.
33b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//
34b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskeystruct SubtargetFeatureKV {
35b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  const char *Key;                      // K-V key string
36839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey  const char *Desc;                     // Help descriptor
37b6a638898a92d5cd782209fbeb673fe7846a29ebEvan Cheng  uint64_t Value;                       // K-V integer value
38b6a638898a92d5cd782209fbeb673fe7846a29ebEvan Cheng  uint64_t Implies;                     // K-V bit mask
39639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
404df7c5baa1dfe2d9de7eef2600c9ac325e9fdcd6Will Dietz  // Compare routine for std::lower_bound
414df7c5baa1dfe2d9de7eef2600c9ac325e9fdcd6Will Dietz  bool operator<(StringRef S) const {
424df7c5baa1dfe2d9de7eef2600c9ac325e9fdcd6Will Dietz    return StringRef(Key) < S;
43b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  }
44b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey};
45639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
46b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey//===----------------------------------------------------------------------===//
47b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey///
4834bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey/// SubtargetInfoKV - Used to provide key value pairs for CPU and arbitrary
4934bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey/// pointers.
5034bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey//
5134bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskeystruct SubtargetInfoKV {
5234bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey  const char *Key;                      // K-V key string
5398eb98b0f2e6573f5aee67ce3e75624392d637b7Roman Divacky  const void *Value;                    // K-V pointer value
54639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
554df7c5baa1dfe2d9de7eef2600c9ac325e9fdcd6Will Dietz  // Compare routine for std::lower_bound
564df7c5baa1dfe2d9de7eef2600c9ac325e9fdcd6Will Dietz  bool operator<(StringRef S) const {
574df7c5baa1dfe2d9de7eef2600c9ac325e9fdcd6Will Dietz    return StringRef(Key) < S;
5834bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey  }
5934bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey};
60639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
6134bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey//===----------------------------------------------------------------------===//
6234bd5d5d876212611d8b66a18f4c8604b342c6ebJim Laskey///
63639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach/// SubtargetFeatures - Manages the enabling and disabling of subtarget
64b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey/// specific features.  Features are encoded as a string of the form
65ed36a478671cd30bd9ec9505739fae7ea4798b40Matt Arsenault///   "+attr1,+attr2,-attr3,...,+attrN"
66b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey/// A comma separates each feature from the next (all lowercase.)
67b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey/// Each of the remaining features is prefixed with + or - indicating whether
68b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey/// that feature should be enabled or disabled contrary to the cpu
69b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey/// specification.
70b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey///
71b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
72b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskeyclass SubtargetFeatures {
73b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  std::vector<std::string> Features;    // Subtarget features as a vector
74b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskeypublic:
7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  explicit SubtargetFeatures(StringRef Initial = "");
76b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
77b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  /// Features string accessors.
783f9b9eb57dafc2a25a6e3d9ee570bd5a884b11e3Rafael Espindola  std::string getString() const;
79b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
80b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  /// Adding Features.
812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  void AddFeature(StringRef String, bool Enable = true);
82639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
83ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// ToggleFeature - Toggle a feature and returns the newly updated feature
84ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// bits.
8537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t ToggleFeature(uint64_t Bits, StringRef String,
86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                         ArrayRef<SubtargetFeatureKV> FeatureTable);
87639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
88276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  /// Get feature bits of a CPU.
8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t getFeatureBits(StringRef CPU,
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                          ArrayRef<SubtargetFeatureKV> CPUTable,
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                          ArrayRef<SubtargetFeatureKV> FeatureTable);
92639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
93b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  /// Print feature string.
94e0c86afac63a2dbbcff0ad79ed7b93d860451385Chris Lattner  void print(raw_ostream &OS) const;
95639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
96b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  // Dump feature info.
97b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey  void dump() const;
98e823db8bae7fe42cd4f1fa861bec8c36a636702bViktor Kutuzov
99c697f8b28832a0dcb8b7ceb919b02628050b7730Rafael Espindola  /// Adds the default features for the specified target triple.
100276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  void getDefaultSubtargetFeatures(const Triple& Triple);
101b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey};
102b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
103b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey} // End namespace llvm
104b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey
105b3302db18a779527a4b1cd7a2024543ade7e83c6Jim Laskey#endif
106