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
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "hexagon-subtarget"
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_CTOR
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_TARGET_DESC
25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenSubtargetInfo.inc"
26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool>
28b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableV3("enable-hexagon-v3", cl::Hidden,
29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum         cl::desc("Enable Hexagon V3 instructions."));
30b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool>
32b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableMemOps(
33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    "enable-hexagon-memops",
3497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(true),
3597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::desc(
3697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma      "Generate V4 MEMOP in code generation for Hexagon target"));
3797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma
3897e602b574b38d57384f0f877700357531a3d23eJyotsna Vermastatic cl::opt<bool>
3997e602b574b38d57384f0f877700357531a3d23eJyotsna VermaDisableMemOps(
4097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    "disable-hexagon-memops",
4197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(false),
4297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    cl::desc(
4397e602b574b38d57384f0f877700357531a3d23eJyotsna Verma      "Do not generate V4 MEMOP in code generation for Hexagon target"));
447517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
457517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pandestatic cl::opt<bool>
467517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish PandeEnableIEEERndNear(
477517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    "enable-hexagon-ieee-rnd-near",
487517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    cl::Hidden, cl::ZeroOrMore, cl::init(false),
497517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    cl::desc("Generate non-chopped conversion from fp to int."));
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesHexagonSubtarget &
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesHexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
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);
71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return *this;
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesHexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS,
75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                   const TargetMachine &TM)
76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    : HexagonGenSubtargetInfo(TT, CPU, FS), CPUString(CPU.str()),
77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      DL("e-m:e-p:32:32-i1:32-i64:64-a:0-n32"),
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM),
79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      TSInfo(DL), FrameLowering() {
80b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // Initialize scheduling itinerary for the specified CPU.
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  InstrItins = getInstrItineraryForCPU(CPUString);
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
8497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma  // UseMemOps on by default unless disabled explicitly
8597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma  if (DisableMemOps)
8697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma    UseMemOps = false;
8797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma  else if (EnableMemOps)
88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    UseMemOps = true;
89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  else
90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    UseMemOps = false;
917517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
927517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  if (EnableIEEERndNear)
937517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    ModeIEEERndNear = true;
947517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande  else
957517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    ModeIEEERndNear = false;
96b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
977517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
98354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka// Pin the vtable to this file.
99354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid HexagonSubtarget::anchor() {}
100