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