PPCSubtarget.cpp revision 581a8f79bc1ac3cbe5d621f0b4a0252ab2890bc1
1//===- PowerPCSubtarget.cpp - PPC Subtarget Information ---------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Nate Begeman and is distributed under the 6// University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the PPC specific subclass of TargetSubtarget. 11// 12//===----------------------------------------------------------------------===// 13 14#include "PPCSubtarget.h" 15#include "PPC.h" 16#include "llvm/Module.h" 17#include "llvm/Support/CommandLine.h" 18#include "PPCGenSubtarget.inc" 19 20using namespace llvm; 21PPCTargetEnum llvm::PPCTarget = TargetDefault; 22 23namespace llvm { 24 cl::opt<PPCTargetEnum, true> 25 PPCTargetArg(cl::desc("Force generation of code for a specific PPC target:"), 26 cl::values( 27 clEnumValN(TargetAIX, "aix", " Enable AIX codegen"), 28 clEnumValN(TargetDarwin,"darwin", 29 " Enable Darwin codegen"), 30 clEnumValEnd), 31 cl::location(PPCTarget), cl::init(TargetDefault)); 32} 33 34#if defined(__APPLE__) 35#include <mach/mach.h> 36#include <mach/mach_host.h> 37#include <mach/host_info.h> 38#include <mach/machine.h> 39 40/// GetCurrentPowerPCFeatures - Returns the current CPUs features. 41static const char *GetCurrentPowerPCCPU() { 42 host_basic_info_data_t hostInfo; 43 mach_msg_type_number_t infoCount; 44 45 infoCount = HOST_BASIC_INFO_COUNT; 46 host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, 47 &infoCount); 48 49 if (hostInfo.cpu_type != CPU_TYPE_POWERPC) return "generic"; 50 51 switch(hostInfo.cpu_subtype) { 52 case CPU_SUBTYPE_POWERPC_601: return "601"; 53 case CPU_SUBTYPE_POWERPC_602: return "602"; 54 case CPU_SUBTYPE_POWERPC_603: return "603"; 55 case CPU_SUBTYPE_POWERPC_603e: return "603e"; 56 case CPU_SUBTYPE_POWERPC_603ev: return "603ev"; 57 case CPU_SUBTYPE_POWERPC_604: return "604"; 58 case CPU_SUBTYPE_POWERPC_604e: return "604e"; 59 case CPU_SUBTYPE_POWERPC_620: return "620"; 60 case CPU_SUBTYPE_POWERPC_750: return "750"; 61 case CPU_SUBTYPE_POWERPC_7400: return "7400"; 62 case CPU_SUBTYPE_POWERPC_7450: return "7450"; 63 case CPU_SUBTYPE_POWERPC_970: return "970"; 64 default: ; 65 } 66 67 return "generic"; 68} 69#endif 70 71 72PPCSubtarget::PPCSubtarget(const Module &M, const std::string &FS) 73 : StackAlignment(16) 74 , IsGigaProcessor(false) 75 , Is64Bit(false) 76 , Has64BitRegs(false) 77 , HasAltivec(false) 78 , HasFSQRT(false) 79 , IsAIX(false) 80 , IsDarwin(false) { 81 82 // Determine default and user specified characteristics 83 std::string CPU = "generic"; 84#if defined(__APPLE__) 85 CPU = GetCurrentPowerPCCPU(); 86#endif 87 88 // Parse features string. 89 ParseSubtargetFeatures(FS, CPU); 90 91 // Set the boolean corresponding to the current target triple, or the default 92 // if one cannot be determined, to true. 93 const std::string& TT = M.getTargetTriple(); 94 if (TT.length() > 5) { 95 IsDarwin = TT.find("darwin") != std::string::npos; 96 } else if (TT.empty()) { 97#if defined(_POWER) 98 IsAIX = true; 99#elif defined(__APPLE__) 100 IsDarwin = true; 101#endif 102 } 103} 104