PPCSubtarget.cpp revision 2668959b8879097db368aec7d76c455260abc75b
18c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//===- PowerPCSubtarget.cpp - PPC Subtarget Information ---------*- C++ -*-===// 28c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// 38c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// The LLVM Compiler Infrastructure 48c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// 58c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// This file was developed by Nate Begeman and is distributed under the 68c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// University of Illinois Open Source License. See LICENSE.TXT for details. 78c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// 88c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//===----------------------------------------------------------------------===// 98c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// 108c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// This file implements the PPC specific subclass of TargetSubtarget. 118c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman// 128c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//===----------------------------------------------------------------------===// 138c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman 142668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPCSubtarget.h" 152668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h" 168c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include "llvm/Module.h" 173c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner#include "llvm/Support/CommandLine.h" 18b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#include "llvm/Target/SubtargetFeature.h" 19b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 203c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattnerusing namespace llvm; 213c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris LattnerPPCTargetEnum llvm::PPCTarget = TargetDefault; 223c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner 233c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattnernamespace llvm { 243c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner cl::opt<PPCTargetEnum, true> 253c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner PPCTargetArg(cl::desc("Force generation of code for a specific PPC target:"), 263c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner cl::values( 273c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner clEnumValN(TargetAIX, "aix", " Enable AIX codegen"), 281e9de3ed2db440fac99e5cc85b7d98b0a23a2727Chris Lattner clEnumValN(TargetDarwin,"darwin", 291e9de3ed2db440fac99e5cc85b7d98b0a23a2727Chris Lattner " Enable Darwin codegen"), 303c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner clEnumValEnd), 313c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner cl::location(PPCTarget), cl::init(TargetDefault)); 323c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner} 338c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman 34b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeyenum PowerPCFeature { 35b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCFeature64Bit = 1 << 0, 36b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCFeatureAltivec = 1 << 1, 37b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCFeatureFSqrt = 1 << 2, 38b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCFeatureGPUL = 1 << 3, 39b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey}; 40b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 41b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey/// Sorted (by key) array of values for CPU subtype. 42b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic const SubtargetFeatureKV PowerPCSubTypeKV[] = { 43839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "601" , "Select the PowerPC 601 processor", 0 }, 44839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "602" , "Select the PowerPC 602 processor", 0 }, 45839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "603" , "Select the PowerPC 603 processor", 0 }, 46839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "603e" , "Select the PowerPC 603e processor", 0 }, 47839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "603ev" , "Select the PowerPC 603ev processor", 0 }, 48839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "604" , "Select the PowerPC 604 processor", 0 }, 49839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "604e" , "Select the PowerPC 604e processor", 0 }, 50839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "620" , "Select the PowerPC 620 processor", 0 }, 51839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "7400" , "Select the PowerPC 7400 (G4) processor", 52839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey PowerPCFeatureAltivec }, 53839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "7450" , "Select the PowerPC 7450 (G4+) processor", 54839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey PowerPCFeatureAltivec }, 55839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "750" , "Select the PowerPC 750 (G3) processor", 0 }, 56839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "970" , "Select the PowerPC 970 (G5 - GPUL) processor", 57839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey PowerPCFeature64Bit | PowerPCFeatureAltivec | 58b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCFeatureFSqrt | PowerPCFeatureGPUL }, 59839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "g3" , "Select the PowerPC G3 (750) processor", 0 }, 60839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "g4" , "Select the PowerPC G4 (7400) processor", 61839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey PowerPCFeatureAltivec }, 62839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "g4+" , "Select the PowerPC G4+ (7450) processor", 63839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey PowerPCFeatureAltivec }, 64839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "g5" , "Select the PowerPC g5 (970 - GPUL) processor", 65839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey PowerPCFeature64Bit | PowerPCFeatureAltivec | 66b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCFeatureFSqrt | PowerPCFeatureGPUL }, 67839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "generic", "Select instructions for a generic PowerPC processor", 0 } 68b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey}; 69b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey/// Length of PowerPCSubTypeKV. 70b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic const unsigned PowerPCSubTypeKVSize = sizeof(PowerPCSubTypeKV) 71b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey / sizeof(SubtargetFeatureKV); 72b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 73b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey/// Sorted (by key) array of values for CPU features. 74b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic SubtargetFeatureKV PowerPCFeatureKV[] = { 75839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "64bit" , "Should 64 bit instructions be used" , PowerPCFeature64Bit }, 76839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "altivec", "Should Altivec instructions be used" , PowerPCFeatureAltivec }, 77839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "fsqrt" , "Should the fsqrt instruction be used", PowerPCFeatureFSqrt }, 78839615a510c582ddcdb09a8e2934f30775daa032Jim Laskey { "gpul" , "Should GPUL instructions be used" , PowerPCFeatureGPUL } 79b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey }; 80b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey/// Length of PowerPCFeatureKV. 81b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic const unsigned PowerPCFeatureKVSize = sizeof(PowerPCFeatureKV) 82b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey / sizeof(SubtargetFeatureKV); 83b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 84b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 858c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#if defined(__APPLE__) 868c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/mach.h> 878c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/mach_host.h> 888c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/host_info.h> 898c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#include <mach/machine.h> 908c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman 91b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey/// GetCurrentPowerPCFeatures - Returns the current CPUs features. 92b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic const char *GetCurrentPowerPCCPU() { 938c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman host_basic_info_data_t hostInfo; 948c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman mach_msg_type_number_t infoCount; 958c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman 968c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman infoCount = HOST_BASIC_INFO_COUNT; 978c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, 988c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman &infoCount); 99b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 100b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey if (hostInfo.cpu_type != CPU_TYPE_POWERPC) return "generic"; 101b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 102b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey switch(hostInfo.cpu_subtype) { 103b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_601: return "601"; 104b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_602: return "602"; 105b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_603: return "603"; 106b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_603e: return "603e"; 107b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_603ev: return "603ev"; 108b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_604: return "604"; 109b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_604e: return "604e"; 110b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_620: return "620"; 111b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_750: return "750"; 112b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_7400: return "7400"; 113b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_7450: return "7450"; 114b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey case CPU_SUBTYPE_POWERPC_970: return "970"; 115b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey default: ; 116b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey } 1178c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman 118b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey return "generic"; 119b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey} 1208c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#endif 1218c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman 122b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim LaskeyPPCSubtarget::PPCSubtarget(const Module &M, const std::string &FS) 1233c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner : StackAlignment(16), IsGigaProcessor(false), IsAIX(false), IsDarwin(false) { 1243c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner 125b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey // Determine default and user specified characteristics 126c98d8236490666ad3f5c9224226bda12269fed77Chris Lattner std::string CPU = "generic"; 127b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#if defined(__APPLE__) 128b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey CPU = GetCurrentPowerPCCPU(); 129b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#endif 130b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey uint32_t Bits = 131b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey SubtargetFeatures::Parse(FS, CPU, 132b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCSubTypeKV, PowerPCSubTypeKVSize, 133b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey PowerPCFeatureKV, PowerPCFeatureKVSize); 1341e9de3ed2db440fac99e5cc85b7d98b0a23a2727Chris Lattner IsGigaProcessor = (Bits & PowerPCFeatureGPUL ) != 0; 135d401dff7966ca3ac644cddcda4f1e6d30074923eNate Begeman Is64Bit = (Bits & PowerPCFeature64Bit) != 0; 1361e9de3ed2db440fac99e5cc85b7d98b0a23a2727Chris Lattner HasFSQRT = (Bits & PowerPCFeatureFSqrt) != 0; 137b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 138b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey // Set the boolean corresponding to the current target triple, or the default 1398c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman // if one cannot be determined, to true. 1408c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman const std::string& TT = M.getTargetTriple(); 1418c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman if (TT.length() > 5) { 1423c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner IsDarwin = TT.find("darwin") != std::string::npos; 1438c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman } else if (TT.empty()) { 1448c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#if defined(_POWER) 1453c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner IsAIX = true; 1468c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#elif defined(__APPLE__) 1473c304a3ba18a040d3c3dbd15ab69da5543cdbd54Chris Lattner IsDarwin = true; 1488c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman#endif 1498c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman } 1508c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman} 151