diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2004-08-11 00:10:41 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-08-11 00:10:41 +0000 |
commit | c0f6420b96d88e67253a20a866236575dccbfd25 (patch) | |
tree | d3d8d724cdb8187b70221a081f1ebf090a2ebc1f /lib/Target/PowerPC/PPC64TargetMachine.cpp | |
parent | 3d9a6c2842599b9d8659ae97e19c413d435d7b34 (diff) |
Breaking up the PowerPC target into 32- and 64-bit subparts: Part II: 64-bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15635 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPC64TargetMachine.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPC64TargetMachine.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/lib/Target/PowerPC/PPC64TargetMachine.cpp b/lib/Target/PowerPC/PPC64TargetMachine.cpp new file mode 100644 index 0000000000..1f11268e93 --- /dev/null +++ b/lib/Target/PowerPC/PPC64TargetMachine.cpp @@ -0,0 +1,117 @@ +//===-- PPC64TargetMachine.cpp - Define TargetMachine for AIX/PowerPC ----===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// +//===----------------------------------------------------------------------===// + +#include "PowerPC.h" +#include "PPC64JITInfo.h" +#include "PPC64TargetMachine.h" +#include "llvm/Module.h" +#include "llvm/PassManager.h" +#include "llvm/CodeGen/IntrinsicLowering.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/Target/TargetOptions.h" +#include "llvm/Target/TargetMachineRegistry.h" +#include "llvm/Transforms/Scalar.h" +#include <iostream> +using namespace llvm; + +namespace { + const std::string PPC64 = "AIX/PowerPC"; + // Register the target + RegisterTarget<PPC64TargetMachine> + X("powerpc-aix", " AIX/PowerPC (experimental)"); +} + +/// PPC64TargetMachine ctor +/// +PPC64TargetMachine::PPC64TargetMachine(const Module &M, IntrinsicLowering *IL) + // FIXME: this is wrong! + : PowerPCTargetMachine(PPC64, IL, + TargetData(PPC64,false,8,4,4,4,4,4,2,1,4), + TargetFrameInfo(TargetFrameInfo::StackGrowsDown,16,-4), + PPC64JITInfo(*this)) {} + +/// addPassesToEmitAssembly - Add passes to the specified pass manager +/// to implement a static compiler for this target. +/// +bool PPC64TargetMachine::addPassesToEmitAssembly(PassManager &PM, + std::ostream &Out) { + // FIXME: Implement efficient support for garbage collection intrinsics. + PM.add(createLowerGCPass()); + + // FIXME: Implement the invoke/unwind instructions! + PM.add(createLowerInvokePass()); + + // FIXME: Implement the switch instruction in the instruction selector! + PM.add(createLowerSwitchPass()); + + PM.add(createLowerConstantExpressionsPass()); + + // Make sure that no unreachable blocks are instruction selected. + PM.add(createUnreachableBlockEliminationPass()); + + // FIXME: instruction selector! + //PM.add(createPPCSimpleInstructionSelector(*this)); + + if (PrintMachineCode) + PM.add(createMachineFunctionPrinterPass(&std::cerr)); + + PM.add(createRegisterAllocator()); + + if (PrintMachineCode) + PM.add(createMachineFunctionPrinterPass(&std::cerr)); + + // I want a PowerPC specific prolog/epilog code inserter so I can put the + // fills/spills in the right spots. + //PM.add(createPowerPCPEI()); + + // Must run branch selection immediately preceding the printer + //PM.add(createPPCBranchSelectionPass()); + //PM.add(createPPC32AsmPrinterPass(Out, *this)); + PM.add(createMachineCodeDeleter()); + return false; +} + +/// addPassesToJITCompile - Add passes to the specified pass manager to +/// implement a fast dynamic compiler for this target. +/// +void PPC64JITInfo::addPassesToJITCompile(FunctionPassManager &PM) { + // FIXME: Implement efficient support for garbage collection intrinsics. + PM.add(createLowerGCPass()); + + // FIXME: Implement the invoke/unwind instructions! + PM.add(createLowerInvokePass()); + + // FIXME: Implement the switch instruction in the instruction selector! + PM.add(createLowerSwitchPass()); + + PM.add(createLowerConstantExpressionsPass()); + + // Make sure that no unreachable blocks are instruction selected. + PM.add(createUnreachableBlockEliminationPass()); + + // FIXME: ISel + //PM.add(createPPCSimpleInstructionSelector(TM)); + PM.add(createRegisterAllocator()); + PM.add(createPrologEpilogCodeInserter()); +} + +unsigned PPC64TargetMachine::getModuleMatchQuality(const Module &M) { + if (M.getEndianness() == Module::BigEndian && + M.getPointerSize() == Module::Pointer64) + return 10; // Direct match + else if (M.getEndianness() != Module::AnyEndianness || + M.getPointerSize() != Module::AnyPointerSize) + return 0; // Match for some other target + + return getJITMatchQuality()/2; +} |