blob: ca448bf1de252f7ef5bf6ceabdfbb13c5d9643d5 [file] [log] [blame]
Jia Liu31d157a2012-02-18 12:03:15 +00001//===-- PowerPCSubtarget.cpp - PPC Subtarget Information ------------------===//
Nate Begeman8c00f8c2005-08-04 07:12:09 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Nate Begeman8c00f8c2005-08-04 07:12:09 +00007//
8//===----------------------------------------------------------------------===//
9//
Evan Cheng5b1b44892011-07-01 21:01:15 +000010// This file implements the PPC specific subclass of TargetSubtargetInfo.
Nate Begeman8c00f8c2005-08-04 07:12:09 +000011//
12//===----------------------------------------------------------------------===//
13
Chris Lattner26689592005-10-14 23:51:18 +000014#include "PPCSubtarget.h"
Hal Finkel64c34e22011-12-02 04:58:02 +000015#include "PPCRegisterInfo.h"
Chris Lattner26689592005-10-14 23:51:18 +000016#include "PPC.h"
Hal Finkel2bd0acd2012-06-11 15:43:13 +000017#include "llvm/ADT/StringRef.h"
18#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar3be03402009-08-02 22:11:08 +000019#include "llvm/GlobalValue.h"
Chris Lattner57fc62c2006-12-11 23:22:45 +000020#include "llvm/Target/TargetMachine.h"
Hal Finkel2bd0acd2012-06-11 15:43:13 +000021#include "llvm/Support/DataStream.h"
22#include "llvm/Support/Debug.h"
Evan Cheng3e74d6f2011-08-24 18:08:43 +000023#include "llvm/Support/TargetRegistry.h"
Dan Gohmand68a0762009-01-05 17:59:02 +000024#include <cstdlib>
Evan Cheng94214702011-07-01 20:45:01 +000025
Evan Cheng94214702011-07-01 20:45:01 +000026#define GET_SUBTARGETINFO_TARGET_DESC
Evan Chengebdeeab2011-07-08 01:53:10 +000027#define GET_SUBTARGETINFO_CTOR
Evan Cheng385e9302011-07-01 22:36:09 +000028#include "PPCGenSubtargetInfo.inc"
Evan Cheng94214702011-07-01 20:45:01 +000029
Chris Lattner3c304a32005-08-05 22:05:03 +000030using namespace llvm;
Chris Lattner3c304a32005-08-05 22:05:03 +000031
Nate Begeman8c00f8c2005-08-04 07:12:09 +000032#if defined(__APPLE__)
33#include <mach/mach.h>
34#include <mach/mach_host.h>
35#include <mach/host_info.h>
36#include <mach/machine.h>
37
Jim Laskeyb1e11802005-09-01 21:38:21 +000038/// GetCurrentPowerPCFeatures - Returns the current CPUs features.
39static const char *GetCurrentPowerPCCPU() {
Nate Begeman8c00f8c2005-08-04 07:12:09 +000040 host_basic_info_data_t hostInfo;
41 mach_msg_type_number_t infoCount;
42
43 infoCount = HOST_BASIC_INFO_COUNT;
44 host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo,
45 &infoCount);
Jim Laskeyb1e11802005-09-01 21:38:21 +000046
47 if (hostInfo.cpu_type != CPU_TYPE_POWERPC) return "generic";
48
49 switch(hostInfo.cpu_subtype) {
50 case CPU_SUBTYPE_POWERPC_601: return "601";
51 case CPU_SUBTYPE_POWERPC_602: return "602";
52 case CPU_SUBTYPE_POWERPC_603: return "603";
53 case CPU_SUBTYPE_POWERPC_603e: return "603e";
54 case CPU_SUBTYPE_POWERPC_603ev: return "603ev";
55 case CPU_SUBTYPE_POWERPC_604: return "604";
56 case CPU_SUBTYPE_POWERPC_604e: return "604e";
57 case CPU_SUBTYPE_POWERPC_620: return "620";
58 case CPU_SUBTYPE_POWERPC_750: return "750";
59 case CPU_SUBTYPE_POWERPC_7400: return "7400";
60 case CPU_SUBTYPE_POWERPC_7450: return "7450";
61 case CPU_SUBTYPE_POWERPC_970: return "970";
62 default: ;
63 }
Nate Begeman8c00f8c2005-08-04 07:12:09 +000064
Jim Laskeyb1e11802005-09-01 21:38:21 +000065 return "generic";
66}
Hal Finkel2bd0acd2012-06-11 15:43:13 +000067#elif defined(__linux__) && (defined(__ppc__) || defined(__powerpc__))
68static const char *GetCurrentPowerPCCPU() {
69 // Access to the Processor Version Register (PVR) on PowerPC is privileged,
70 // and so we must use an operating-system interface to determine the current
71 // processor type. On Linux, this is exposed through the /proc/cpuinfo file.
72 const char *generic = "generic";
73
74 // Note: We cannot mmap /proc/cpuinfo here and then process the resulting
75 // memory buffer because the 'file' has 0 size (it can be read from only
76 // as a stream).
77
78 std::string Err;
79 DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err);
80 if (!DS) {
81 DEBUG(dbgs() << "Unable to open /proc/cpuinfo: " << Err << "\n");
82 return generic;
83 }
84
85 // The cpu line is second (after the 'processor: 0' line), so if this
86 // buffer is too small then something has changed (or is wrong).
87 char buffer[1024];
88 size_t CPUInfoSize = DS->GetBytes((unsigned char*) buffer, sizeof(buffer));
89 delete DS;
90
91 const char *CPUInfoStart = buffer;
92 const char *CPUInfoEnd = buffer + CPUInfoSize;
93
94 const char *CIP = CPUInfoStart;
95
96 const char *CPUStart = 0;
97 size_t CPULen = 0;
98
99 // We need to find the first line which starts with cpu, spaces, and a colon.
100 // After the colon, there may be some additional spaces and then the cpu type.
101 while (CIP < CPUInfoEnd && CPUStart == 0) {
102 if (CIP < CPUInfoEnd && *CIP == '\n')
103 ++CIP;
104
105 if (CIP < CPUInfoEnd && *CIP == 'c') {
106 ++CIP;
107 if (CIP < CPUInfoEnd && *CIP == 'p') {
108 ++CIP;
109 if (CIP < CPUInfoEnd && *CIP == 'u') {
110 ++CIP;
111 while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
112 ++CIP;
113
114 if (CIP < CPUInfoEnd && *CIP == ':') {
115 ++CIP;
116 while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
117 ++CIP;
118
119 if (CIP < CPUInfoEnd) {
120 CPUStart = CIP;
121 while (CIP < CPUInfoEnd && (*CIP != ' ' && *CIP != '\t' &&
122 *CIP != ',' && *CIP != '\n'))
123 ++CIP;
124 CPULen = CIP - CPUStart;
125 }
126 }
127 }
128 }
129 }
130
131 if (CPUStart == 0)
132 while (CIP < CPUInfoEnd && *CIP != '\n')
133 ++CIP;
134 }
135
136 if (CPUStart == 0)
137 return generic;
138
139 return StringSwitch<const char *>(StringRef(CPUStart, CPULen))
140 .Case("604e", "604e")
141 .Case("604", "604")
142 .Case("7400", "7400")
143 .Case("7410", "7400")
144 .Case("7447", "7400")
145 .Case("7455", "7450")
146 .Case("G4", "g4")
147 .Case("POWER4", "g4")
148 .Case("PPC970FX", "970")
149 .Case("PPC970MP", "970")
150 .Case("G5", "g5")
151 .Case("POWER5", "g5")
152 .Case("POWER6", "pwr6")
153 .Case("POWER7", "pwr7")
154 .Default(generic);
155}
Nate Begeman8c00f8c2005-08-04 07:12:09 +0000156#endif
157
Jim Laskey581a8f72005-10-26 17:30:34 +0000158
Evan Cheng276365d2011-06-30 01:53:36 +0000159PPCSubtarget::PPCSubtarget(const std::string &TT, const std::string &CPU,
160 const std::string &FS, bool is64Bit)
Evan Cheng0ddff1b2011-07-07 07:07:08 +0000161 : PPCGenSubtargetInfo(TT, CPU, FS)
Evan Cheng94214702011-07-01 20:45:01 +0000162 , StackAlignment(16)
Dale Johannesendb01c8b2008-02-14 23:35:16 +0000163 , DarwinDirective(PPC::DIR_NONE)
Jim Laskey581a8f72005-10-26 17:30:34 +0000164 , IsGigaProcessor(false)
Chris Lattnera7a58542006-06-16 17:34:12 +0000165 , Has64BitSupport(false)
166 , Use64BitRegs(false)
Chris Lattner7c1fb5f2006-06-16 17:50:12 +0000167 , IsPPC64(is64Bit)
Jim Laskey581a8f72005-10-26 17:30:34 +0000168 , HasAltivec(false)
169 , HasFSQRT(false)
Chris Lattner51269842006-03-01 05:50:56 +0000170 , HasSTFIWX(false)
Hal Finkelc6d08f12011-10-17 04:03:49 +0000171 , IsBookE(false)
Chris Lattner564da5d2008-01-02 19:35:16 +0000172 , HasLazyResolverStubs(false)
Torok Edwin0e3a1a82010-08-04 20:47:44 +0000173 , IsJITCodeModel(false)
Daniel Dunbar869eca12011-04-19 20:54:28 +0000174 , TargetTriple(TT) {
Chris Lattner3c304a32005-08-05 22:05:03 +0000175
Jim Laskeyb1e11802005-09-01 21:38:21 +0000176 // Determine default and user specified characteristics
Evan Cheng276365d2011-06-30 01:53:36 +0000177 std::string CPUName = CPU;
178 if (CPUName.empty())
179 CPUName = "generic";
Hal Finkel2bd0acd2012-06-11 15:43:13 +0000180#if defined(__APPLE__) || \
181 (defined(__linux__) && (defined(__ppc__) || defined(__powerpc__)))
Evan Cheng276365d2011-06-30 01:53:36 +0000182 if (CPUName == "generic")
183 CPUName = GetCurrentPowerPCCPU();
Jim Laskeyb1e11802005-09-01 21:38:21 +0000184#endif
Jim Laskey581a8f72005-10-26 17:30:34 +0000185
186 // Parse features string.
Evan Cheng0ddff1b2011-07-07 07:07:08 +0000187 ParseSubtargetFeatures(CPUName, FS);
Jim Laskeyb1e11802005-09-01 21:38:21 +0000188
Evan Cheng94214702011-07-01 20:45:01 +0000189 // Initialize scheduling itinerary for the specified CPU.
190 InstrItins = getInstrItineraryForCPU(CPUName);
191
Chris Lattner7c1fb5f2006-06-16 17:50:12 +0000192 // If we are generating code for ppc64, verify that options make sense.
193 if (is64Bit) {
Dale Johannesen3b407442008-02-15 18:40:53 +0000194 Has64BitSupport = true;
Chris Lattner8fa05da2006-06-16 20:05:06 +0000195 // Silently force 64-bit register use on ppc64.
196 Use64BitRegs = true;
Chris Lattner7c1fb5f2006-06-16 17:50:12 +0000197 }
198
199 // If the user requested use of 64-bit regs, but the cpu selected doesn't
Dale Johannesen3b407442008-02-15 18:40:53 +0000200 // support it, ignore.
201 if (use64BitRegs() && !has64BitSupport())
Chris Lattner7c1fb5f2006-06-16 17:50:12 +0000202 Use64BitRegs = false;
Chris Lattner57fc62c2006-12-11 23:22:45 +0000203
204 // Set up darwin-specific properties.
Chris Lattner74da6712009-08-11 22:49:34 +0000205 if (isDarwin())
Chris Lattner57fc62c2006-12-11 23:22:45 +0000206 HasLazyResolverStubs = true;
Chris Lattner57fc62c2006-12-11 23:22:45 +0000207}
208
209/// SetJITMode - This is called to inform the subtarget info that we are
210/// producing code for the JIT.
211void PPCSubtarget::SetJITMode() {
212 // JIT mode doesn't want lazy resolver stubs, it knows exactly where
213 // everything is. This matters for PPC64, which codegens in PIC mode without
214 // stubs.
215 HasLazyResolverStubs = false;
Torok Edwin0e3a1a82010-08-04 20:47:44 +0000216
217 // Calls to external functions need to use indirect calls
218 IsJITCodeModel = true;
Chris Lattner57fc62c2006-12-11 23:22:45 +0000219}
220
221
222/// hasLazyResolverStub - Return true if accesses to the specified global have
223/// to go through a dyld lazy resolution stub. This means that an extra load
224/// is required to get the address of the global.
Daniel Dunbar3be03402009-08-02 22:11:08 +0000225bool PPCSubtarget::hasLazyResolverStub(const GlobalValue *GV,
226 const TargetMachine &TM) const {
Chris Lattner1e61e692010-11-15 02:46:57 +0000227 // We never have stubs if HasLazyResolverStubs=false or if in static mode.
Chris Lattner57fc62c2006-12-11 23:22:45 +0000228 if (!HasLazyResolverStubs || TM.getRelocationModel() == Reloc::Static)
229 return false;
Evan Chengae94e592008-12-05 01:06:39 +0000230 // If symbol visibility is hidden, the extra load is not needed if
231 // the symbol is definitely defined in the current translation unit.
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +0000232 bool isDecl = GV->isDeclaration() && !GV->isMaterializable();
Evan Chengae94e592008-12-05 01:06:39 +0000233 if (GV->hasHiddenVisibility() && !isDecl && !GV->hasCommonLinkage())
234 return false;
Chris Lattner57fc62c2006-12-11 23:22:45 +0000235 return GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
Evan Chengae94e592008-12-05 01:06:39 +0000236 GV->hasCommonLinkage() || isDecl;
Nate Begeman8c00f8c2005-08-04 07:12:09 +0000237}
Hal Finkel64c34e22011-12-02 04:58:02 +0000238
239bool PPCSubtarget::enablePostRAScheduler(
240 CodeGenOpt::Level OptLevel,
241 TargetSubtargetInfo::AntiDepBreakMode& Mode,
242 RegClassVector& CriticalPathRCs) const {
Hal Finkel01a90f42012-06-10 11:15:36 +0000243 // FIXME: It would be best to use TargetSubtargetInfo::ANTIDEP_ALL here,
244 // but we can't because we can't reassign the cr registers. There is a
245 // dependence between the cr register and the RLWINM instruction used
246 // to extract its value which the anti-dependency breaker can't currently
247 // see. Maybe we should make a late-expanded pseudo to encode this dependency.
248 // (the relevant code is in PPCDAGToDAGISel::SelectSETCC)
249
250 Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
Hal Finkel64c34e22011-12-02 04:58:02 +0000251
Hal Finkel64c34e22011-12-02 04:58:02 +0000252 CriticalPathRCs.clear();
253
254 if (isPPC64())
255 CriticalPathRCs.push_back(&PPC::G8RCRegClass);
256 else
257 CriticalPathRCs.push_back(&PPC::GPRCRegClass);
Hal Finkel01a90f42012-06-10 11:15:36 +0000258
259 CriticalPathRCs.push_back(&PPC::F8RCRegClass);
260 CriticalPathRCs.push_back(&PPC::VRRCRegClass);
Hal Finkel64c34e22011-12-02 04:58:02 +0000261
262 return OptLevel >= CodeGenOpt::Default;
263}
264