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