131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonSubtarget.cpp - Hexagon Subtarget Information --------------===//
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 implements the Hexagon specific subclass of TargetSubtarget.
11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonSubtarget.h"
15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "Hexagon.h"
167517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande#include "HexagonRegisterInfo.h"
17b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/CommandLine.h"
18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/ErrorHandling.h"
19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumusing namespace llvm;
20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_CTOR
22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_TARGET_DESC
23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenSubtargetInfo.inc"
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool>
26b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableV3("enable-hexagon-v3", cl::Hidden,
27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum         cl::desc("Enable Hexagon V3 instructions."));
28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool>
30b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableMemOps(
31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    "enable-hexagon-memops",
3297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(true),
3397e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::desc(
3497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma      "Generate V4 MEMOP in code generation for Hexagon target"));
3597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma
3697e602b574b38d57384f0f877700357531a3d23eJyotsna Vermastatic cl::opt<bool>
3797e602b574b38d57384f0f877700357531a3d23eJyotsna VermaDisableMemOps(
3897e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    "disable-hexagon-memops",
3997e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(false),
4097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::desc(
4197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma      "Do not generate V4 MEMOP in code generation for Hexagon target"));
427517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
437517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pandestatic cl::opt<bool>
447517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish PandeEnableIEEERndNear(
457517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    "enable-hexagon-ieee-rnd-near",
467517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    cl::Hidden, cl::ZeroOrMore, cl::init(false),
477517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    cl::desc("Generate non-chopped conversion from fp to int."));
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
49b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumHexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS):
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  HexagonGenSubtargetInfo(TT, CPU, FS),
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  CPUString(CPU.str()) {
52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
53b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  // If the programmer has not specified a Hexagon version, default to -mv4.
54b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  if (CPUString.empty())
55e88ed0934637a21f02ef5dc8b01075c0f8870d11Sebastian Pop    CPUString = "hexagonv4";
56b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop
57b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  if (CPUString == "hexagonv2") {
58b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop    HexagonArchVersion = V2;
59b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  } else if (CPUString == "hexagonv3") {
60b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop    EnableV3 = true;
61b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop    HexagonArchVersion = V3;
62b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  } else if (CPUString == "hexagonv4") {
63b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop    HexagonArchVersion = V4;
64b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  } else if (CPUString == "hexagonv5") {
65b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop    HexagonArchVersion = V5;
66b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  } else {
67b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop    llvm_unreachable("Unrecognized Hexagon processor version");
68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
70b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop  ParseSubtargetFeatures(CPUString, FS);
71b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // Initialize scheduling itinerary for the specified CPU.
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  InstrItins = getInstrItineraryForCPU(CPUString);
74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
7597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma  // UseMemOps on by default unless disabled explicitly
7697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma  if (DisableMemOps)
7797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    UseMemOps = false;
7897e602b574b38d57384f0f877700357531a3d23eJyotsna Verma  else if (EnableMemOps)
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    UseMemOps = true;
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  else
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    UseMemOps = false;
827517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
837517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  if (EnableIEEERndNear)
847517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    ModeIEEERndNear = true;
857517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  else
867517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    ModeIEEERndNear = false;
87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
887517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
89