blob: cdd16df4cb1aa216541c45ab3a64fb608e22b0f6 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- HexagonSubtarget.cpp - Hexagon Subtarget Information --------------===//
Tony Linthicum1213a7a2011-12-12 21:14:40 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Hexagon specific subclass of TargetSubtarget.
11//
12//===----------------------------------------------------------------------===//
13
14#include "HexagonSubtarget.h"
15#include "Hexagon.h"
Sirish Pande69295b82012-05-10 20:20:25 +000016#include "HexagonRegisterInfo.h"
Tony Linthicum1213a7a2011-12-12 21:14:40 +000017#include "llvm/Support/CommandLine.h"
18#include "llvm/Support/ErrorHandling.h"
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000019#include <map>
20
Tony Linthicum1213a7a2011-12-12 21:14:40 +000021using namespace llvm;
22
Chandler Carruthe96dd892014-04-21 22:55:11 +000023#define DEBUG_TYPE "hexagon-subtarget"
24
Tony Linthicum1213a7a2011-12-12 21:14:40 +000025#define GET_SUBTARGETINFO_CTOR
26#define GET_SUBTARGETINFO_TARGET_DESC
27#include "HexagonGenSubtargetInfo.inc"
28
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000029static cl::opt<bool> EnableMemOps("enable-hexagon-memops",
30 cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(true),
31 cl::desc("Generate V4 MEMOP in code generation for Hexagon target"));
Jyotsna Vermafdc660b2013-03-22 18:41:34 +000032
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000033static cl::opt<bool> DisableMemOps("disable-hexagon-memops",
34 cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(false),
35 cl::desc("Do not generate V4 MEMOP in code generation for Hexagon target"));
Sirish Pande69295b82012-05-10 20:20:25 +000036
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000037static cl::opt<bool> EnableIEEERndNear("enable-hexagon-ieee-rnd-near",
38 cl::Hidden, cl::ZeroOrMore, cl::init(false),
39 cl::desc("Generate non-chopped conversion from fp to int."));
Tony Linthicum1213a7a2011-12-12 21:14:40 +000040
Krzysztof Parzyszekb9a1c3a2015-11-24 14:55:26 +000041static cl::opt<bool> EnableBSBSched("enable-bsb-sched",
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000042 cl::Hidden, cl::ZeroOrMore, cl::init(true));
43
44static cl::opt<bool> EnableHexagonHVXDouble("enable-hexagon-hvx-double",
45 cl::Hidden, cl::ZeroOrMore, cl::init(false),
46 cl::desc("Enable Hexagon Double Vector eXtensions"));
47
48static cl::opt<bool> EnableHexagonHVX("enable-hexagon-hvx",
49 cl::Hidden, cl::ZeroOrMore, cl::init(false),
50 cl::desc("Enable Hexagon Vector eXtensions"));
Krzysztof Parzyszekb9a1c3a2015-11-24 14:55:26 +000051
Eric Christopher5f141b02015-03-11 22:56:10 +000052static cl::opt<bool> DisableHexagonMISched("disable-hexagon-misched",
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000053 cl::Hidden, cl::ZeroOrMore, cl::init(false),
54 cl::desc("Disable Hexagon MI Scheduling"));
55
56void HexagonSubtarget::initializeEnvironment() {
57 UseMemOps = false;
58 ModeIEEERndNear = false;
59 UseBSBScheduling = false;
60}
Eric Christopher5f141b02015-03-11 22:56:10 +000061
Eric Christopherc4c63ae2014-06-27 00:27:40 +000062HexagonSubtarget &
63HexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000064 // Default architecture.
Sebastian Pop1a0bef62012-08-20 19:56:47 +000065 if (CPUString.empty())
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000066 CPUString = "hexagonv60";
Sebastian Pop1a0bef62012-08-20 19:56:47 +000067
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000068 static std::map<StringRef, HexagonArchEnum> CpuTable {
69 { "hexagonv4", V4 },
70 { "hexagonv5", V5 },
71 { "hexagonv55", V55 },
72 { "hexagonv60", V60 },
73 };
74
75 auto foundIt = CpuTable.find(CPUString);
76 if (foundIt != CpuTable.end())
77 HexagonArchVersion = foundIt->second;
78 else
Sebastian Pop1a0bef62012-08-20 19:56:47 +000079 llvm_unreachable("Unrecognized Hexagon processor version");
Tony Linthicum1213a7a2011-12-12 21:14:40 +000080
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000081 UseHVXOps = false;
82 UseHVXDblOps = false;
Sebastian Pop1a0bef62012-08-20 19:56:47 +000083 ParseSubtargetFeatures(CPUString, FS);
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000084
85 if (EnableHexagonHVX.getPosition())
86 UseHVXOps = EnableHexagonHVX;
87 if (EnableHexagonHVXDouble.getPosition())
88 UseHVXDblOps = EnableHexagonHVXDouble;
89
Eric Christopherc4c63ae2014-06-27 00:27:40 +000090 return *this;
91}
92
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000093HexagonSubtarget::HexagonSubtarget(const Triple &TT, StringRef CPU,
94 StringRef FS, const TargetMachine &TM)
Daniel Sanders50f17232015-09-15 16:17:27 +000095 : HexagonGenSubtargetInfo(TT, CPU, FS), CPUString(CPU),
Eric Christopherd737b762015-02-02 22:11:36 +000096 InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this),
Mehdi Amini157e5a62015-07-09 02:10:08 +000097 FrameLowering() {
Sebastian Pop1a0bef62012-08-20 19:56:47 +000098
Krzysztof Parzyszek207c13f2015-11-25 20:30:59 +000099 initializeEnvironment();
100
Tony Linthicum1213a7a2011-12-12 21:14:40 +0000101 // Initialize scheduling itinerary for the specified CPU.
102 InstrItins = getInstrItineraryForCPU(CPUString);
103
Jyotsna Vermafdc660b2013-03-22 18:41:34 +0000104 // UseMemOps on by default unless disabled explicitly
105 if (DisableMemOps)
106 UseMemOps = false;
107 else if (EnableMemOps)
Tony Linthicum1213a7a2011-12-12 21:14:40 +0000108 UseMemOps = true;
109 else
110 UseMemOps = false;
Sirish Pande69295b82012-05-10 20:20:25 +0000111
112 if (EnableIEEERndNear)
113 ModeIEEERndNear = true;
114 else
115 ModeIEEERndNear = false;
Krzysztof Parzyszekb9a1c3a2015-11-24 14:55:26 +0000116
117 UseBSBScheduling = hasV60TOps() && EnableBSBSched;
Tony Linthicum1213a7a2011-12-12 21:14:40 +0000118}
Sirish Pande69295b82012-05-10 20:20:25 +0000119
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +0000120// Pin the vtable to this file.
121void HexagonSubtarget::anchor() {}
Eric Christopher5f141b02015-03-11 22:56:10 +0000122
123bool HexagonSubtarget::enableMachineScheduler() const {
124 if (DisableHexagonMISched.getNumOccurrences())
125 return !DisableHexagonMISched;
126 return true;
127}