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