HexagonSubtarget.cpp revision cd81d94322a39503e4a3e87b6ee03d4fcb3465fb
12f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//===-- HexagonSubtarget.cpp - Hexagon Subtarget Information --------------===//
22bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//
32bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//                     The LLVM Compiler Infrastructure
42bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//
52bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// This file is distributed under the University of Illinois Open Source
62bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// License. See LICENSE.TXT for details.
72bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//
82bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//===----------------------------------------------------------------------===//
95217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson//
105217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// This file implements the Hexagon specific subclass of TargetSubtarget.
115217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson//
125217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson//===----------------------------------------------------------------------===//
135217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson
142bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "HexagonSubtarget.h"
152bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "Hexagon.h"
162bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "HexagonRegisterInfo.h"
172bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "llvm/Support/CommandLine.h"
181afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner#include "llvm/Support/ErrorHandling.h"
1948b2f3e4850cd27d54224cd42da8a160d6b95984Owen Andersonusing namespace llvm;
20c34ebf65af0139eaf5cb0969fabcd32c0b6e1710Owen Anderson
21eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson#define DEBUG_TYPE "hexagon-subtarget"
22f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson
23b4cc66d7b71357d379257930f96929e26697805dJeffrey Yasskin#define GET_SUBTARGETINFO_CTOR
24081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner#define GET_SUBTARGETINFO_TARGET_DESC
25914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson#include "HexagonGenSubtargetInfo.inc"
26001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
272a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foadstatic cl::opt<bool>
28001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonEnableV3("enable-hexagon-v3", cl::Hidden,
29ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson         cl::desc("Enable Hexagon V3 instructions."));
30ad715f86c90b06cc4ab9e1336d1bc3bf13ecb16dJeffrey Yasskin
31aad3fb7362aff151e97ad457005ea3f2872fe868Owen Andersonstatic cl::opt<bool>
32006c77df8cc7f6a9dac575600b797b8ba32b29ebOwen AndersonEnableMemOps(
3316e298f98024bcff5c7219a96cac216114c30dadOwen Anderson    "enable-hexagon-memops",
342bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson    cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(true),
35eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson    cl::desc(
36001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      "Generate V4 MEMOP in code generation for Hexagon target"));
37914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
3812ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerstatic cl::opt<bool>
39001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonDisableMemOps(
40ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson    "disable-hexagon-memops",
41001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(false),
42001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    cl::desc(
43001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson      "Do not generate V4 MEMOP in code generation for Hexagon target"));
44001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
45db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattnerstatic cl::opt<bool>
46db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerEnableIEEERndNear(
47001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    "enable-hexagon-ieee-rnd-near",
48001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    cl::Hidden, cl::ZeroOrMore, cl::init(false),
49001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    cl::desc("Generate non-chopped conversion from fp to int."));
50001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
51001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonHexagonSubtarget &
52001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonHexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
53001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  // If the programmer has not specified a Hexagon version, default to -mv4.
54001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  if (CPUString.empty())
55001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    CPUString = "hexagonv4";
56001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson
57001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  if (CPUString == "hexagonv2") {
58001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    HexagonArchVersion = V2;
59001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  } else if (CPUString == "hexagonv3") {
60001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    EnableV3 = true;
61001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    HexagonArchVersion = V3;
62001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  } else if (CPUString == "hexagonv4") {
63001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    HexagonArchVersion = V4;
64001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson  } else if (CPUString == "hexagonv5") {
65001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    HexagonArchVersion = V5;
66914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  } else {
67914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    llvm_unreachable("Unrecognized Hexagon processor version");
68914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  }
69914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
70914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  ParseSubtargetFeatures(CPUString, FS);
71914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  return *this;
72914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson}
73914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
74914e50c841bbc248ab94144c11813b5785b1292dOwen AndersonHexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS,
75914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson                                   const TargetMachine &TM)
76914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    : HexagonGenSubtargetInfo(TT, CPU, FS), CPUString(CPU.str()),
77914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson      DL("e-m:e-p:32:32-i1:32-i64:64-a:0-n32"),
78914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson      InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM),
79914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson      TSInfo(DL), FrameLowering() {
80914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
81914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  // Initialize scheduling itinerary for the specified CPU.
82914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  InstrItins = getInstrItineraryForCPU(CPUString);
83914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
84914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  // UseMemOps on by default unless disabled explicitly
85914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  if (DisableMemOps)
86914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    UseMemOps = false;
87914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  else if (EnableMemOps)
88914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    UseMemOps = true;
89914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson  else
90914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson    UseMemOps = false;
91914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson
92b227925fa313428045f554187b0136d084d723f6Chris Lattner  if (EnableIEEERndNear)
93b227925fa313428045f554187b0136d084d723f6Chris Lattner    ModeIEEERndNear = true;
94b227925fa313428045f554187b0136d084d723f6Chris Lattner  else
95b227925fa313428045f554187b0136d084d723f6Chris Lattner    ModeIEEERndNear = false;
96b227925fa313428045f554187b0136d084d723f6Chris Lattner}
97b227925fa313428045f554187b0136d084d723f6Chris Lattner
98b227925fa313428045f554187b0136d084d723f6Chris Lattner// Pin the vtable to this file.
99b227925fa313428045f554187b0136d084d723f6Chris Lattnervoid HexagonSubtarget::anchor() {}
100b227925fa313428045f554187b0136d084d723f6Chris Lattner