1234285Sdim//===-- HexagonSubtarget.h - Define Subtarget for the Hexagon ---*- C++ -*-===// 2234285Sdim// 3234285Sdim// The LLVM Compiler Infrastructure 4234285Sdim// 5234285Sdim// This file is distributed under the University of Illinois Open Source 6234285Sdim// License. See LICENSE.TXT for details. 7234285Sdim// 8234285Sdim//===----------------------------------------------------------------------===// 9234285Sdim// 10234285Sdim// This file declares the Hexagon specific subclass of TargetSubtarget. 11234285Sdim// 12234285Sdim//===----------------------------------------------------------------------===// 13234285Sdim 14234285Sdim#ifndef Hexagon_SUBTARGET_H 15234285Sdim#define Hexagon_SUBTARGET_H 16234285Sdim 17252723Sdim#include "llvm/Target/TargetMachine.h" 18234285Sdim#include "llvm/Target/TargetSubtargetInfo.h" 19234285Sdim#include <string> 20234285Sdim 21234285Sdim#define GET_SUBTARGETINFO_HEADER 22234285Sdim#include "HexagonGenSubtargetInfo.inc" 23234285Sdim 24234285Sdim#define Hexagon_SMALL_DATA_THRESHOLD 8 25245431Sdim#define Hexagon_SLOTS 4 26234285Sdim 27234285Sdimnamespace llvm { 28234285Sdim 29234285Sdimclass HexagonSubtarget : public HexagonGenSubtargetInfo { 30263509Sdim virtual void anchor(); 31234285Sdim bool UseMemOps; 32245431Sdim bool ModeIEEERndNear; 33234285Sdim 34234285Sdimpublic: 35234285Sdim enum HexagonArchEnum { 36245431Sdim V1, V2, V3, V4, V5 37234285Sdim }; 38234285Sdim 39234285Sdim HexagonArchEnum HexagonArchVersion; 40234285Sdim std::string CPUString; 41234285Sdim InstrItineraryData InstrItins; 42234285Sdim 43234285Sdimpublic: 44234285Sdim HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS); 45234285Sdim 46234285Sdim /// getInstrItins - Return the instruction itineraies based on subtarget 47234285Sdim /// selection. 48234285Sdim const InstrItineraryData &getInstrItineraryData() const { return InstrItins; } 49234285Sdim 50234285Sdim 51234285Sdim /// ParseSubtargetFeatures - Parses features string setting specified 52234285Sdim /// subtarget options. Definition of function is auto generated by tblgen. 53234285Sdim void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 54234285Sdim 55234285Sdim bool hasV2TOps () const { return HexagonArchVersion >= V2; } 56234285Sdim bool hasV2TOpsOnly () const { return HexagonArchVersion == V2; } 57234285Sdim bool hasV3TOps () const { return HexagonArchVersion >= V3; } 58234285Sdim bool hasV3TOpsOnly () const { return HexagonArchVersion == V3; } 59234285Sdim bool hasV4TOps () const { return HexagonArchVersion >= V4; } 60245431Sdim bool hasV4TOpsOnly () const { return HexagonArchVersion == V4; } 61234285Sdim bool useMemOps () const { return HexagonArchVersion >= V4 && UseMemOps; } 62245431Sdim bool hasV5TOps () const { return HexagonArchVersion >= V5; } 63245431Sdim bool hasV5TOpsOnly () const { return HexagonArchVersion == V5; } 64245431Sdim bool modeIEEERndNear () const { return ModeIEEERndNear; } 65234285Sdim 66234285Sdim bool isSubtargetV2() const { return HexagonArchVersion == V2;} 67234285Sdim const std::string &getCPUString () const { return CPUString; } 68234285Sdim 69234285Sdim // Threshold for small data section 70234285Sdim unsigned getSmallDataThreshold() const { 71234285Sdim return Hexagon_SMALL_DATA_THRESHOLD; 72234285Sdim } 73234285Sdim const HexagonArchEnum &getHexagonArchVersion() const { 74234285Sdim return HexagonArchVersion; 75234285Sdim } 76234285Sdim}; 77234285Sdim 78234285Sdim} // end namespace llvm 79234285Sdim 80234285Sdim#endif 81