mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-06 04:19:10 +00:00
Add the skeleton for the Mips constant island pass.
It will only be used for Mips 16 at this time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176161 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8df7c39976
commit
d056dc0aae
@ -20,6 +20,7 @@ add_llvm_target(MipsCodeGen
|
||||
MipsAnalyzeImmediate.cpp
|
||||
MipsAsmPrinter.cpp
|
||||
MipsCodeEmitter.cpp
|
||||
MipsConstantIslandPass.cpp
|
||||
MipsDelaySlotFiller.cpp
|
||||
MipsJITInfo.cpp
|
||||
MipsInstrInfo.cpp
|
||||
|
@ -27,6 +27,7 @@ namespace llvm {
|
||||
FunctionPass *createMipsLongBranchPass(MipsTargetMachine &TM);
|
||||
FunctionPass *createMipsJITCodeEmitterPass(MipsTargetMachine &TM,
|
||||
JITCodeEmitter &JCE);
|
||||
FunctionPass *createMipsConstantIslandPass(MipsTargetMachine &tm);
|
||||
|
||||
} // end namespace llvm;
|
||||
|
||||
|
85
lib/Target/Mips/MipsConstantIslandPass.cpp
Normal file
85
lib/Target/Mips/MipsConstantIslandPass.cpp
Normal file
@ -0,0 +1,85 @@
|
||||
//===-- MipsLongBranch.cpp - Emit long branches ---------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
//
|
||||
// This pass is used to make Pc relative loads of constants.
|
||||
// For now, only Mips16 will use this. While it has the same name and
|
||||
// uses many ideas from the LLVM ARM Constant Island Pass, it's not intended
|
||||
// to reuse any of the code from the ARM version.
|
||||
//
|
||||
// Loading constants inline is expensive on Mips16 and it's in general better
|
||||
// to place the constant nearby in code space and then it can be loaded with a
|
||||
// simple 16 bit load instruction.
|
||||
//
|
||||
// The constants can be not just numbers but addresses of functions and labels.
|
||||
// This can be particularly helpful in static relocation mode for embedded
|
||||
// non linux targets.
|
||||
//
|
||||
//
|
||||
|
||||
#define DEBUG_TYPE "mips-constant-islands"
|
||||
|
||||
#include "Mips.h"
|
||||
#include "MCTargetDesc/MipsBaseInfo.h"
|
||||
#include "MipsTargetMachine.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
typedef MachineBasicBlock::iterator Iter;
|
||||
typedef MachineBasicBlock::reverse_iterator ReverseIter;
|
||||
|
||||
class MipsConstantIslands : public MachineFunctionPass {
|
||||
|
||||
public:
|
||||
static char ID;
|
||||
MipsConstantIslands(TargetMachine &tm)
|
||||
: MachineFunctionPass(ID), TM(tm),
|
||||
TII(static_cast<const MipsInstrInfo*>(tm.getInstrInfo())),
|
||||
IsPIC(TM.getRelocationModel() == Reloc::PIC_),
|
||||
ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "Mips Constant Islands";
|
||||
}
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &F);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
const TargetMachine &TM;
|
||||
const MipsInstrInfo *TII;
|
||||
bool IsPIC;
|
||||
unsigned ABI;
|
||||
|
||||
};
|
||||
|
||||
char MipsConstantIslands::ID = 0;
|
||||
} // end of anonymous namespace
|
||||
|
||||
/// createMipsLongBranchPass - Returns a pass that converts branches to long
|
||||
/// branches.
|
||||
FunctionPass *llvm::createMipsConstantIslandPass(MipsTargetMachine &tm) {
|
||||
return new MipsConstantIslands(tm);
|
||||
}
|
||||
|
||||
bool MipsConstantIslands::runOnMachineFunction(MachineFunction &F) {
|
||||
return true;
|
||||
}
|
||||
|
@ -116,6 +116,8 @@ bool MipsPassConfig::addPreEmitPass() {
|
||||
// NOTE: long branch has not been implemented for mips16.
|
||||
if (TM.getSubtarget<MipsSubtarget>().hasStandardEncoding())
|
||||
addPass(createMipsLongBranchPass(TM));
|
||||
if (TM.getSubtarget<MipsSubtarget>().inMips16Mode())
|
||||
addPass(createMipsConstantIslandPass(TM));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user