1969097968c2f845caa6085abfc357ad53eb18956Chris Lattner//===- PowerPCSubtarget.cpp - PPC Subtarget Information -------------------===//
28c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//
38c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//                     The LLVM Compiler Infrastructure
48c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
78c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//
88c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//===----------------------------------------------------------------------===//
98c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//
105b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng// This file implements the PPC specific subclass of TargetSubtargetInfo.
118c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//
128c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//===----------------------------------------------------------------------===//
138c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman
142668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPCSubtarget.h"
152668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
163be03406c9c3b2075d5ae416499af2f15f703d6fDaniel Dunbar#include "llvm/GlobalValue.h"
1757fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner#include "llvm/Target/TargetMachine.h"
183e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
19d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman#include <cstdlib>
2094214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
2194214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
22ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
23385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "PPCGenSubtargetInfo.inc"
2494214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
253c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattnerusing namespace llvm;
263c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner
278c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#if defined(__APPLE__)
288c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/mach.h>
298c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/mach_host.h>
308c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/host_info.h>
318c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/machine.h>
328c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman
33b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey/// GetCurrentPowerPCFeatures - Returns the current CPUs features.
34b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic const char *GetCurrentPowerPCCPU() {
358c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman  host_basic_info_data_t hostInfo;
368c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman  mach_msg_type_number_t infoCount;
378c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman
388c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman  infoCount = HOST_BASIC_INFO_COUNT;
398c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman  host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo,
408c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman            &infoCount);
41b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey
42b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  if (hostInfo.cpu_type != CPU_TYPE_POWERPC) return "generic";
43b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey
44b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  switch(hostInfo.cpu_subtype) {
45b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_601:   return "601";
46b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_602:   return "602";
47b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_603:   return "603";
48b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_603e:  return "603e";
49b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_603ev: return "603ev";
50b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_604:   return "604";
51b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_604e:  return "604e";
52b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_620:   return "620";
53b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_750:   return "750";
54b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_7400:  return "7400";
55b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_7450:  return "7450";
56b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  case CPU_SUBTYPE_POWERPC_970:   return "970";
57b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  default: ;
58b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  }
598c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman
60b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  return "generic";
61b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey}
628c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#endif
638c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman
64581a8f79bc1ac3cbe5d621f0b4a0252ab2890bc1Jim Laskey
65276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan ChengPPCSubtarget::PPCSubtarget(const std::string &TT, const std::string &CPU,
66276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng                           const std::string &FS, bool is64Bit)
670ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  : PPCGenSubtargetInfo(TT, CPU, FS)
6894214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  , StackAlignment(16)
69db01c8ba26f288636d3f574a96af3499ee6d2579Dale Johannesen  , DarwinDirective(PPC::DIR_NONE)
70581a8f79bc1ac3cbe5d621f0b4a0252ab2890bc1Jim Laskey  , IsGigaProcessor(false)
71a7a5854f1c3710f4bedf069be4771b81e449f2a3Chris Lattner  , Has64BitSupport(false)
72a7a5854f1c3710f4bedf069be4771b81e449f2a3Chris Lattner  , Use64BitRegs(false)
737c1fb5f08c7c1e9550b7eb2d8d32c93648a6d08eChris Lattner  , IsPPC64(is64Bit)
74581a8f79bc1ac3cbe5d621f0b4a0252ab2890bc1Jim Laskey  , HasAltivec(false)
75581a8f79bc1ac3cbe5d621f0b4a0252ab2890bc1Jim Laskey  , HasFSQRT(false)
765126984b1da4bda0e93961da07e883699f1f2d57Chris Lattner  , HasSTFIWX(false)
77c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel  , IsBookE(false)
78564da5d646dfeb56df931b42fefa7c5f2591057eChris Lattner  , HasLazyResolverStubs(false)
790e3a1a8f8fbe34d47c83d19c8b11a3bfdcacad00Torok Edwin  , IsJITCodeModel(false)
80869eca129b2560a59b8aa0e8fd57b5d8f7de1f96Daniel Dunbar  , TargetTriple(TT) {
813c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner
82b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  // Determine default and user specified characteristics
83276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  std::string CPUName = CPU;
84276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  if (CPUName.empty())
85276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng    CPUName = "generic";
86b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#if defined(__APPLE__)
87276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  if (CPUName == "generic")
88276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng    CPUName = GetCurrentPowerPCCPU();
89b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#endif
90581a8f79bc1ac3cbe5d621f0b4a0252ab2890bc1Jim Laskey
91581a8f79bc1ac3cbe5d621f0b4a0252ab2890bc1Jim Laskey  // Parse features string.
920ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(CPUName, FS);
93b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey
9494214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  // Initialize scheduling itinerary for the specified CPU.
9594214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  InstrItins = getInstrItineraryForCPU(CPUName);
9694214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
977c1fb5f08c7c1e9550b7eb2d8d32c93648a6d08eChris Lattner  // If we are generating code for ppc64, verify that options make sense.
987c1fb5f08c7c1e9550b7eb2d8d32c93648a6d08eChris Lattner  if (is64Bit) {
993b407444c9a45feb74b70b43138580d5f0299597Dale Johannesen    Has64BitSupport = true;
1008fa05dac3962202eeb6de434aeb9f720e384345bChris Lattner    // Silently force 64-bit register use on ppc64.
1018fa05dac3962202eeb6de434aeb9f720e384345bChris Lattner    Use64BitRegs = true;
1027c1fb5f08c7c1e9550b7eb2d8d32c93648a6d08eChris Lattner  }
1037c1fb5f08c7c1e9550b7eb2d8d32c93648a6d08eChris Lattner
1047c1fb5f08c7c1e9550b7eb2d8d32c93648a6d08eChris Lattner  // If the user requested use of 64-bit regs, but the cpu selected doesn't
1053b407444c9a45feb74b70b43138580d5f0299597Dale Johannesen  // support it, ignore.
1063b407444c9a45feb74b70b43138580d5f0299597Dale Johannesen  if (use64BitRegs() && !has64BitSupport())
1077c1fb5f08c7c1e9550b7eb2d8d32c93648a6d08eChris Lattner    Use64BitRegs = false;
10857fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner
10957fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner  // Set up darwin-specific properties.
11074da671c36cdaa6bea3fa7889dc9aeab572b609cChris Lattner  if (isDarwin())
11157fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner    HasLazyResolverStubs = true;
11257fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner}
11357fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner
11457fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner/// SetJITMode - This is called to inform the subtarget info that we are
11557fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner/// producing code for the JIT.
11657fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattnervoid PPCSubtarget::SetJITMode() {
11757fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner  // JIT mode doesn't want lazy resolver stubs, it knows exactly where
11857fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner  // everything is.  This matters for PPC64, which codegens in PIC mode without
11957fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner  // stubs.
12057fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner  HasLazyResolverStubs = false;
1210e3a1a8f8fbe34d47c83d19c8b11a3bfdcacad00Torok Edwin
1220e3a1a8f8fbe34d47c83d19c8b11a3bfdcacad00Torok Edwin  // Calls to external functions need to use indirect calls
1230e3a1a8f8fbe34d47c83d19c8b11a3bfdcacad00Torok Edwin  IsJITCodeModel = true;
12457fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner}
12557fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner
12657fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner
12757fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner/// hasLazyResolverStub - Return true if accesses to the specified global have
12857fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner/// to go through a dyld lazy resolution stub.  This means that an extra load
12957fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner/// is required to get the address of the global.
1303be03406c9c3b2075d5ae416499af2f15f703d6fDaniel Dunbarbool PPCSubtarget::hasLazyResolverStub(const GlobalValue *GV,
1313be03406c9c3b2075d5ae416499af2f15f703d6fDaniel Dunbar                                       const TargetMachine &TM) const {
1321e61e69d401045c54b15815f15a0fdb3ca56a9b5Chris Lattner  // We never have stubs if HasLazyResolverStubs=false or if in static mode.
13357fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner  if (!HasLazyResolverStubs || TM.getRelocationModel() == Reloc::Static)
13457fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner    return false;
135ae94e594164b193236002516970aeec4c4574768Evan Cheng  // If symbol visibility is hidden, the extra load is not needed if
136ae94e594164b193236002516970aeec4c4574768Evan Cheng  // the symbol is definitely defined in the current translation unit.
137f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  bool isDecl = GV->isDeclaration() && !GV->isMaterializable();
138ae94e594164b193236002516970aeec4c4574768Evan Cheng  if (GV->hasHiddenVisibility() && !isDecl && !GV->hasCommonLinkage())
139ae94e594164b193236002516970aeec4c4574768Evan Cheng    return false;
14057fc62c8d2bf056b0d2a0e3d1b82b3b787b899f8Chris Lattner  return GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
141ae94e594164b193236002516970aeec4c4574768Evan Cheng         GV->hasCommonLinkage() || isDecl;
1428c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman}
143