131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonSubtarget.h - Define Subtarget for the Hexagon ---*- C++ -*-===// 2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// The LLVM Compiler Infrastructure 4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source 6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details. 7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file declares the Hexagon specific subclass of TargetSubtarget. 11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#ifndef Hexagon_SUBTARGET_H 15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define Hexagon_SUBTARGET_H 16b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "HexagonFrameLowering.h" 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "HexagonInstrInfo.h" 19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "HexagonISelLowering.h" 20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "HexagonSelectionDAGInfo.h" 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/IR/DataLayout.h" 22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetMachine.h" 23a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetSubtargetInfo.h" 24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include <string> 25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_HEADER 27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenSubtargetInfo.inc" 28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define Hexagon_SMALL_DATA_THRESHOLD 8 307517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande#define Hexagon_SLOTS 4 31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 32b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace llvm { 33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumclass HexagonSubtarget : public HexagonGenSubtargetInfo { 35354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka virtual void anchor(); 36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool UseMemOps; 387517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande bool ModeIEEERndNear; 39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumpublic: 41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum enum HexagonArchEnum { 427517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande V1, V2, V3, V4, V5 43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum HexagonArchEnum HexagonArchVersion; 46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprivate: 47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum std::string CPUString; 48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout DL; // Calculates type size & alignment. 49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HexagonInstrInfo InstrInfo; 50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HexagonTargetLowering TLInfo; 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HexagonSelectionDAGInfo TSInfo; 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HexagonFrameLowering FrameLowering; 53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum InstrItineraryData InstrItins; 54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumpublic: 56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS, 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const TargetMachine &TM); 58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// getInstrItins - Return the instruction itineraies based on subtarget 60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// selection. 61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const InstrItineraryData &getInstrItineraryData() const { return InstrItins; } 62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const HexagonInstrInfo *getInstrInfo() const { return &InstrInfo; } 63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const HexagonRegisterInfo *getRegisterInfo() const { 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return &InstrInfo.getRegisterInfo(); 65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const HexagonTargetLowering *getTargetLowering() const { return &TLInfo; } 67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const HexagonFrameLowering *getFrameLowering() const { 68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return &FrameLowering; 69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const HexagonSelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; } 71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout *getDataLayout() const { return &DL; } 72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HexagonSubtarget &initializeSubtargetDependencies(StringRef CPU, 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef FS); 75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// ParseSubtargetFeatures - Parses features string setting specified 77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// subtarget options. Definition of function is auto generated by tblgen. 78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool hasV2TOps () const { return HexagonArchVersion >= V2; } 81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool hasV2TOpsOnly () const { return HexagonArchVersion == V2; } 82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool hasV3TOps () const { return HexagonArchVersion >= V3; } 83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool hasV3TOpsOnly () const { return HexagonArchVersion == V3; } 84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool hasV4TOps () const { return HexagonArchVersion >= V4; } 857517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande bool hasV4TOpsOnly () const { return HexagonArchVersion == V4; } 86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool useMemOps () const { return HexagonArchVersion >= V4 && UseMemOps; } 877517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande bool hasV5TOps () const { return HexagonArchVersion >= V5; } 887517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande bool hasV5TOpsOnly () const { return HexagonArchVersion == V5; } 897517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande bool modeIEEERndNear () const { return ModeIEEERndNear; } 90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 91b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum bool isSubtargetV2() const { return HexagonArchVersion == V2;} 92b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const std::string &getCPUString () const { return CPUString; } 93b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 94b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Threshold for small data section 95b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned getSmallDataThreshold() const { 96b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon_SMALL_DATA_THRESHOLD; 97b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 98b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const HexagonArchEnum &getHexagonArchVersion() const { 99b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return HexagonArchVersion; 100b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 101b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}; 102b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 103b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} // end namespace llvm 104b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 105b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#endif 106