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 "HexagonFrameLowering.h"
     18 #include "HexagonInstrInfo.h"
     19 #include "HexagonISelLowering.h"
     20 #include "HexagonSelectionDAGInfo.h"
     21 #include "llvm/IR/DataLayout.h"
     22 #include "llvm/Target/TargetMachine.h"
     23 #include "llvm/Target/TargetSubtargetInfo.h"
     24 #include <string>
     25 
     26 #define GET_SUBTARGETINFO_HEADER
     27 #include "HexagonGenSubtargetInfo.inc"
     28 
     29 #define Hexagon_SMALL_DATA_THRESHOLD 8
     30 #define Hexagon_SLOTS 4
     31 
     32 namespace llvm {
     33 
     34 class HexagonSubtarget : public HexagonGenSubtargetInfo {
     35   virtual void anchor();
     36 
     37   bool UseMemOps;
     38   bool ModeIEEERndNear;
     39 
     40 public:
     41   enum HexagonArchEnum {
     42     V1, V2, V3, V4, V5
     43   };
     44 
     45   HexagonArchEnum HexagonArchVersion;
     46 private:
     47   std::string CPUString;
     48   const DataLayout DL;       // Calculates type size & alignment.
     49   HexagonInstrInfo InstrInfo;
     50   HexagonTargetLowering TLInfo;
     51   HexagonSelectionDAGInfo TSInfo;
     52   HexagonFrameLowering FrameLowering;
     53   InstrItineraryData InstrItins;
     54 
     55 public:
     56   HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS,
     57                    const TargetMachine &TM);
     58 
     59   /// getInstrItins - Return the instruction itineraies based on subtarget
     60   /// selection.
     61   const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
     62   const HexagonInstrInfo *getInstrInfo() const { return &InstrInfo; }
     63   const HexagonRegisterInfo *getRegisterInfo() const {
     64     return &InstrInfo.getRegisterInfo();
     65   }
     66   const HexagonTargetLowering *getTargetLowering() const { return &TLInfo; }
     67   const HexagonFrameLowering *getFrameLowering() const {
     68     return &FrameLowering;
     69   }
     70   const HexagonSelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; }
     71   const DataLayout *getDataLayout() const { return &DL; }
     72 
     73   HexagonSubtarget &initializeSubtargetDependencies(StringRef CPU,
     74                                                     StringRef FS);
     75 
     76   /// ParseSubtargetFeatures - Parses features string setting specified
     77   /// subtarget options.  Definition of function is auto generated by tblgen.
     78   void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
     79 
     80   bool hasV2TOps () const { return HexagonArchVersion >= V2; }
     81   bool hasV2TOpsOnly () const { return HexagonArchVersion == V2; }
     82   bool hasV3TOps () const { return HexagonArchVersion >= V3; }
     83   bool hasV3TOpsOnly () const { return HexagonArchVersion == V3; }
     84   bool hasV4TOps () const { return HexagonArchVersion >= V4; }
     85   bool hasV4TOpsOnly () const { return HexagonArchVersion == V4; }
     86   bool useMemOps () const { return HexagonArchVersion >= V4 && UseMemOps; }
     87   bool hasV5TOps () const { return HexagonArchVersion >= V5; }
     88   bool hasV5TOpsOnly () const { return HexagonArchVersion == V5; }
     89   bool modeIEEERndNear () const { return ModeIEEERndNear; }
     90 
     91   bool isSubtargetV2() const { return HexagonArchVersion == V2;}
     92   const std::string &getCPUString () const { return CPUString; }
     93 
     94   // Threshold for small data section
     95   unsigned getSmallDataThreshold() const {
     96     return Hexagon_SMALL_DATA_THRESHOLD;
     97   }
     98   const HexagonArchEnum &getHexagonArchVersion() const {
     99     return  HexagonArchVersion;
    100   }
    101 };
    102 
    103 } // end namespace llvm
    104 
    105 #endif
    106