Home | History | Annotate | Download | only in Hexagon
      1 //===-- HexagonSubtarget.h - Define Subtarget for the Hexagon ---*- C++ -*-===//
      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 // This file declares the Hexagon specific subclass of TargetSubtarget.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef Hexagon_SUBTARGET_H
     15 #define Hexagon_SUBTARGET_H
     16 
     17 #include "llvm/Target/TargetMachine.h"
     18 #include "llvm/Target/TargetSubtargetInfo.h"
     19 #include <string>
     20 
     21 #define GET_SUBTARGETINFO_HEADER
     22 #include "HexagonGenSubtargetInfo.inc"
     23 
     24 #define Hexagon_SMALL_DATA_THRESHOLD 8
     25 #define Hexagon_SLOTS 4
     26 
     27 namespace llvm {
     28 
     29 class HexagonSubtarget : public HexagonGenSubtargetInfo {
     30 
     31   bool UseMemOps;
     32   bool ModeIEEERndNear;
     33 
     34 public:
     35   enum HexagonArchEnum {
     36     V1, V2, V3, V4, V5
     37   };
     38 
     39   HexagonArchEnum HexagonArchVersion;
     40   std::string CPUString;
     41   InstrItineraryData InstrItins;
     42 
     43 public:
     44   HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS);
     45 
     46   /// getInstrItins - Return the instruction itineraies based on subtarget
     47   /// selection.
     48   const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
     49 
     50 
     51   /// ParseSubtargetFeatures - Parses features string setting specified
     52   /// subtarget options.  Definition of function is auto generated by tblgen.
     53   void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
     54 
     55   bool hasV2TOps () const { return HexagonArchVersion >= V2; }
     56   bool hasV2TOpsOnly () const { return HexagonArchVersion == V2; }
     57   bool hasV3TOps () const { return HexagonArchVersion >= V3; }
     58   bool hasV3TOpsOnly () const { return HexagonArchVersion == V3; }
     59   bool hasV4TOps () const { return HexagonArchVersion >= V4; }
     60   bool hasV4TOpsOnly () const { return HexagonArchVersion == V4; }
     61   bool useMemOps () const { return HexagonArchVersion >= V4 && UseMemOps; }
     62   bool hasV5TOps () const { return HexagonArchVersion >= V5; }
     63   bool hasV5TOpsOnly () const { return HexagonArchVersion == V5; }
     64   bool modeIEEERndNear () const { return ModeIEEERndNear; }
     65 
     66   bool isSubtargetV2() const { return HexagonArchVersion == V2;}
     67   const std::string &getCPUString () const { return CPUString; }
     68 
     69   // Threshold for small data section
     70   unsigned getSmallDataThreshold() const {
     71     return Hexagon_SMALL_DATA_THRESHOLD;
     72   }
     73   const HexagonArchEnum &getHexagonArchVersion() const {
     74     return  HexagonArchVersion;
     75   }
     76 };
     77 
     78 } // end namespace llvm
     79 
     80 #endif
     81