FunctionPass *createDarwinAsmPrinter(std::ostream &OS, TargetMachine &TM);
FunctionPass *createAIXAsmPrinter(std::ostream &OS, TargetMachine &TM);
-extern bool GPOPT;
extern bool PICEnabled;
extern PPCTargetEnum PPCTarget;
} // end namespace llvm;
#define DEBUG_TYPE "asmprinter"
#include "PowerPC.h"
#include "PowerPCTargetMachine.h"
+#include "PowerPCSubtarget.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Module.h"
}
bool DarwinAsmPrinter::doInitialization(Module &M) {
- if (GPOPT) O << "\t.machine ppc970\n";
+ if (TM.getSubtarget<PPCSubtarget>().isGigaProcessor())
+ O << "\t.machine ppc970\n";
AsmPrinter::doInitialization(M);
return false;
}
setOperationAction(ISD::SREM , MVT::f32, Expand);
// If we're enabling GP optimizations, use hardware square root
- if (!GPOPT) {
+ if (!TM.getSubtarget<PPCSubtarget>().isGigaProcessor()) {
setOperationAction(ISD::FSQRT, MVT::f64, Expand);
setOperationAction(ISD::FSQRT, MVT::f32, Expand);
}
Statistic<>Recorded("ppc-codegen", "Number of recording ops emitted");
Statistic<>FusedFP("ppc-codegen", "Number of fused fp operations");
Statistic<>FrameOff("ppc-codegen", "Number of frame idx offsets collapsed");
+
//===--------------------------------------------------------------------===//
/// ISel - PPC32 specific code to select PPC32 machine instructions for
/// SelectionDAG operations.
void ISel::MoveCRtoGPR(unsigned CCReg, bool Inv, unsigned Idx, unsigned Result){
unsigned IntCR = MakeReg(MVT::i32);
BuildMI(BB, PPC::MCRF, 1, PPC::CR7).addReg(CCReg);
- BuildMI(BB, GPOPT ? PPC::MFOCRF : PPC::MFCR, 1, IntCR).addReg(PPC::CR7);
+ bool GPOpt =
+ TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor();
+ BuildMI(BB, GPOpt ? PPC::MFOCRF : PPC::MFCR, 1, IntCR).addReg(PPC::CR7);
if (Inv) {
unsigned Tmp1 = MakeReg(MVT::i32);
BuildMI(BB, PPC::RLWINM, 4, Tmp1).addReg(IntCR).addImm(32-(3-Idx))
//===----------------------------------------------------------------------===//
#include "PowerPCSubtarget.h"
+#include "PowerPC.h"
#include "llvm/Module.h"
+#include "llvm/Support/CommandLine.h"
+using namespace llvm;
+PPCTargetEnum llvm::PPCTarget = TargetDefault;
+
+namespace llvm {
+ cl::opt<PPCTargetEnum, true>
+ PPCTargetArg(cl::desc("Force generation of code for a specific PPC target:"),
+ cl::values(
+ clEnumValN(TargetAIX, "aix", " Enable AIX codegen"),
+ clEnumValN(TargetDarwin,"darwin"," Enable Darwin codegen"),
+ clEnumValEnd),
+ cl::location(PPCTarget), cl::init(TargetDefault));
+ cl::opt<bool> EnableGPOPT("enable-gpopt", cl::Hidden,
+ cl::desc("Enable optimizations for GP cpus"));
+}
#if defined(__APPLE__)
#include <mach/mach.h>
}
#endif
-using namespace llvm;
-
PPCSubtarget::PPCSubtarget(const Module &M)
- : TargetSubtarget(), stackAlignment(16), isGigaProcessor(false), isAIX(false),
- isDarwin(false) {
- // Set the boolean corresponding to the current target triple, or the default
+ : StackAlignment(16), IsGigaProcessor(false), IsAIX(false), IsDarwin(false) {
+
+ // 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;
+ IsDarwin = TT.find("darwin") != std::string::npos;
#if defined(__APPLE__)
- isGigaProcessor = IsGP();
+ IsGigaProcessor = IsGP();
#endif
} else if (TT.empty()) {
#if defined(_POWER)
- isAIX = true;
+ IsAIX = true;
#elif defined(__APPLE__)
- isDarwin = true;
- isGigaProcessor = IsGP();
+ IsDarwin = true;
+ IsGigaProcessor = IsGP();
#endif
}
+
+ // If GP opts are forced on by the commandline, do so now.
+ if (EnableGPOPT) IsGigaProcessor = true;
}
protected:
/// stackAlignment - The minimum alignment known to hold of the stack frame on
/// entry to the function and which must be maintained by every function.
- unsigned stackAlignment;
+ unsigned StackAlignment;
/// Used by the ISel to turn in optimizations for POWER4-derived architectures
- bool isGigaProcessor;
- bool isAIX;
- bool isDarwin;
+ bool IsGigaProcessor;
+ bool IsAIX;
+ bool IsDarwin;
public:
/// This constructor initializes the data members to match that
/// of the specified module.
/// getStackAlignment - Returns the minimum alignment known to hold of the
/// stack frame on entry to the function and which must be maintained by every
/// function for this subtarget.
- unsigned getStackAlignment() const { return stackAlignment; }
+ unsigned getStackAlignment() const { return StackAlignment; }
- bool IsAIX() const { return isAIX; }
- bool IsDarwin() const { return isDarwin; }
+ bool isAIX() const { return IsAIX; }
+ bool isDarwin() const { return IsDarwin; }
+
+ bool isGigaProcessor() const { return IsGigaProcessor; }
};
} // End llvm namespace
#include <iostream>
using namespace llvm;
-bool llvm::GPOPT = false;
-PPCTargetEnum llvm::PPCTarget = TargetDefault;
-
-namespace llvm {
- cl::opt<PPCTargetEnum, true>
- PPCTargetArg(
- cl::desc("Force generation of code for a specific PPC target:"),
- cl::values(
- clEnumValN(TargetAIX, "aix", " Enable AIX codegen"),
- clEnumValN(TargetDarwin,"darwin"," Enable Darwin codegen"),
- clEnumValEnd),
- cl::location(PPCTarget), cl::init(TargetDefault));
- cl::opt<bool> EnablePPCLSR("enable-lsr-for-ppc",
- cl::desc("Enable LSR for PPC (beta)"),
- cl::Hidden);
- cl::opt<bool, true> EnableGPOPT("enable-gpopt", cl::Hidden,
- cl::location(GPOPT),
- cl::desc("Enable optimizations for GP cpus"));
-}
+static cl::opt<bool> EnablePPCLSR("enable-lsr-for-ppc", cl::Hidden,
+ cl::desc("Enable LSR for PPC (beta)"));
namespace {
const std::string PPC32ID = "PowerPC/32bit";
const PowerPCFrameInfo &TFI)
: TargetMachine(name, IL, TD), FrameInfo(TFI), Subtarget(M) {
if (TargetDefault == PPCTarget) {
- if (Subtarget.IsAIX()) PPCTarget = TargetAIX;
- if (Subtarget.IsDarwin()) PPCTarget = TargetDarwin;
+ if (Subtarget.isAIX()) PPCTarget = TargetAIX;
+ if (Subtarget.isDarwin()) PPCTarget = TargetDarwin;
}
}