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
17b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetSubtargetInfo.h"
18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetMachine.h"
19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include <string>
20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_HEADER
22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenSubtargetInfo.inc"
23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define Hexagon_SMALL_DATA_THRESHOLD 8
257517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande#define Hexagon_SLOTS 4
26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace llvm {
28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumclass HexagonSubtarget : public HexagonGenSubtargetInfo {
30b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool UseMemOps;
327517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  bool ModeIEEERndNear;
33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumpublic:
35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  enum HexagonArchEnum {
367517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    V1, V2, V3, V4, V5
37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  };
38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonArchEnum HexagonArchVersion;
40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  std::string CPUString;
41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  InstrItineraryData InstrItins;
42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumpublic:
44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS);
45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  /// getInstrItins - Return the instruction itineraies based on subtarget
47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  /// selection.
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  /// ParseSubtargetFeatures - Parses features string setting specified
52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  /// subtarget options.  Definition of function is auto generated by tblgen.
53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool hasV2TOps () const { return HexagonArchVersion >= V2; }
56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool hasV2TOpsOnly () const { return HexagonArchVersion == V2; }
57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool hasV3TOps () const { return HexagonArchVersion >= V3; }
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool hasV3TOpsOnly () const { return HexagonArchVersion == V3; }
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool hasV4TOps () const { return HexagonArchVersion >= V4; }
607517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  bool hasV4TOpsOnly () const { return HexagonArchVersion == V4; }
61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool useMemOps () const { return HexagonArchVersion >= V4 && UseMemOps; }
627517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  bool hasV5TOps () const { return HexagonArchVersion >= V5; }
637517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  bool hasV5TOpsOnly () const { return HexagonArchVersion == V5; }
647517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  bool modeIEEERndNear () const { return ModeIEEERndNear; }
65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool isSubtargetV2() const { return HexagonArchVersion == V2;}
67b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const std::string &getCPUString () const { return CPUString; }
68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // Threshold for small data section
70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned getSmallDataThreshold() const {
71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return Hexagon_SMALL_DATA_THRESHOLD;
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const HexagonArchEnum &getHexagonArchVersion() const {
74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    return  HexagonArchVersion;
75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum};
77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} // end namespace llvm
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#endif
81