diff options
author | Jim Laskey <jlaskey@mac.com> | 2005-09-01 21:38:21 +0000 |
---|---|---|
committer | Jim Laskey <jlaskey@mac.com> | 2005-09-01 21:38:21 +0000 |
commit | b1e1180ca0b32f37aa74d7ad703eeaf91e66c8fa (patch) | |
tree | a34f84ab3bb875ee64e139f707e7591a5d162eca /lib/Target/PowerPC/PPCSubtarget.cpp | |
parent | b3302db18a779527a4b1cd7a2024543ade7e83c6 (diff) | |
download | external_llvm-b1e1180ca0b32f37aa74d7ad703eeaf91e66c8fa.zip external_llvm-b1e1180ca0b32f37aa74d7ad703eeaf91e66c8fa.tar.gz external_llvm-b1e1180ca0b32f37aa74d7ad703eeaf91e66c8fa.tar.bz2 |
1. Use SubtargetFeatures in llc/lli.
2. Propagate feature "string" to all targets.
3. Implement use of SubtargetFeatures in PowerPCTargetSubtarget.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23192 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCSubtarget.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPCSubtarget.cpp | 92 |
1 files changed, 82 insertions, 10 deletions
diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp index 686c11c..2c1b783 100644 --- a/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/lib/Target/PowerPC/PPCSubtarget.cpp @@ -15,6 +15,8 @@ #include "PowerPC.h" #include "llvm/Module.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Target/SubtargetFeature.h" + using namespace llvm; PPCTargetEnum llvm::PPCTarget = TargetDefault; @@ -30,42 +32,112 @@ namespace llvm { cl::desc("Enable optimizations for GP cpus")); } +enum PowerPCFeature { + PowerPCFeature64Bit = 1 << 0, + PowerPCFeatureAltivec = 1 << 1, + PowerPCFeatureFSqrt = 1 << 2, + PowerPCFeatureGPUL = 1 << 3, +}; + +/// Sorted (by key) array of values for CPU subtype. +static const SubtargetFeatureKV PowerPCSubTypeKV[] = { + { "601" , 0 }, + { "602" , 0 }, + { "603" , 0 }, + { "603e" , 0 }, + { "603ev" , 0 }, + { "604" , 0 }, + { "604e" , 0 }, + { "620" , 0 }, + { "7400" , PowerPCFeatureAltivec }, + { "7450" , PowerPCFeatureAltivec }, + { "750" , 0 }, + { "970" , PowerPCFeature64Bit | PowerPCFeatureAltivec | + PowerPCFeatureFSqrt | PowerPCFeatureGPUL }, + { "g3" , 0 }, + { "g4" , PowerPCFeatureAltivec }, + { "g4+" , PowerPCFeatureAltivec }, + { "g5" , PowerPCFeature64Bit | PowerPCFeatureAltivec | + PowerPCFeatureFSqrt | PowerPCFeatureGPUL }, + { "generic", 0 } +}; +/// Length of PowerPCSubTypeKV. +static const unsigned PowerPCSubTypeKVSize = sizeof(PowerPCSubTypeKV) + / sizeof(SubtargetFeatureKV); + +/// Sorted (by key) array of values for CPU features. +static SubtargetFeatureKV PowerPCFeatureKV[] = { + { "64bit" , PowerPCFeature64Bit }, + { "altivec", PowerPCFeatureAltivec }, + { "fsqrt" , PowerPCFeatureFSqrt }, + { "gpul" , PowerPCFeatureGPUL } + }; +/// Length of PowerPCFeatureKV. +static const unsigned PowerPCFeatureKVSize = sizeof(PowerPCFeatureKV) + / sizeof(SubtargetFeatureKV); + + #if defined(__APPLE__) #include <mach/mach.h> #include <mach/mach_host.h> #include <mach/host_info.h> #include <mach/machine.h> -static boolean_t IsGP() { +/// GetCurrentPowerPCFeatures - Returns the current CPUs features. +static const char *GetCurrentPowerPCCPU() { host_basic_info_data_t hostInfo; mach_msg_type_number_t infoCount; infoCount = HOST_BASIC_INFO_COUNT; host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); + + if (hostInfo.cpu_type != CPU_TYPE_POWERPC) return "generic"; + + switch(hostInfo.cpu_subtype) { + case CPU_SUBTYPE_POWERPC_601: return "601"; + case CPU_SUBTYPE_POWERPC_602: return "602"; + case CPU_SUBTYPE_POWERPC_603: return "603"; + case CPU_SUBTYPE_POWERPC_603e: return "603e"; + case CPU_SUBTYPE_POWERPC_603ev: return "603ev"; + case CPU_SUBTYPE_POWERPC_604: return "604"; + case CPU_SUBTYPE_POWERPC_604e: return "604e"; + case CPU_SUBTYPE_POWERPC_620: return "620"; + case CPU_SUBTYPE_POWERPC_750: return "750"; + case CPU_SUBTYPE_POWERPC_7400: return "7400"; + case CPU_SUBTYPE_POWERPC_7450: return "7450"; + case CPU_SUBTYPE_POWERPC_970: return "970"; + default: ; + } - return ((hostInfo.cpu_type == CPU_TYPE_POWERPC) && - (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970)); -} + return "generic"; +} #endif -PPCSubtarget::PPCSubtarget(const Module &M) +PPCSubtarget::PPCSubtarget(const Module &M, const std::string &FS) : StackAlignment(16), IsGigaProcessor(false), IsAIX(false), IsDarwin(false) { - // Set the boolean corresponding to the current target triple, or the default + // Determine default and user specified characteristics + std::string CPU; +#if defined(__APPLE__) + CPU = GetCurrentPowerPCCPU(); +#endif + uint32_t Bits = + SubtargetFeatures::Parse(FS, CPU, + PowerPCSubTypeKV, PowerPCSubTypeKVSize, + PowerPCFeatureKV, PowerPCFeatureKVSize); + IsGigaProcessor = (Bits & PowerPCFeatureGPUL) != 0; + + // Set the boolean corresponding to the current target triple, or the default // if one cannot be determined, to true. const std::string& TT = M.getTargetTriple(); if (TT.length() > 5) { IsDarwin = TT.find("darwin") != std::string::npos; -#if defined(__APPLE__) - IsGigaProcessor = IsGP(); -#endif } else if (TT.empty()) { #if defined(_POWER) IsAIX = true; #elif defined(__APPLE__) IsDarwin = true; - IsGigaProcessor = IsGP(); #endif } |