1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

Added a way for TargetLowering to specify what values can be used as the

scale component of the target addressing mode.

llvm-svn: 26802
This commit is contained in:
Evan Cheng 2006-03-16 21:47:42 +00:00
parent 7f5361757b
commit cad75d9f0c
4 changed files with 42 additions and 13 deletions

View File

@ -559,15 +559,6 @@ public:
/// valid for the specified target constraint letter.
virtual bool isOperandValidForConstraint(SDOperand Op, char ConstraintLetter);
//===--------------------------------------------------------------------===//
// Loop Strength Reduction hooks
//
/// isLegalAddressImmediate - Return true if the integer value or GlobalValue
/// can be used as the offset of the target addressing mode.
virtual bool isLegalAddressImmediate(int64_t V) const;
virtual bool isLegalAddressImmediate(GlobalValue *GV) const;
//===--------------------------------------------------------------------===//
// Scheduler hooks
//
@ -580,6 +571,34 @@ public:
virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI,
MachineBasicBlock *MBB);
//===--------------------------------------------------------------------===//
// Loop Strength Reduction hooks
//
/// isLegalAddressImmediate - Return true if the integer value or GlobalValue
/// can be used as the offset of the target addressing mode.
virtual bool isLegalAddressImmediate(int64_t V) const;
virtual bool isLegalAddressImmediate(GlobalValue *GV) const;
typedef std::vector<unsigned>::const_iterator legal_am_scale_iterator;
legal_am_scale_iterator legal_am_scale_begin() const {
return LegalAddressScales.begin();
}
legal_am_scale_iterator legal_am_scale_end() const {
return LegalAddressScales.end();
}
protected:
/// addLegalAddressScale - Add a integer (> 1) value which can be used as
/// scale in the target addressing mode. Note: the ordering matters so the
/// least efficient ones should be entered first.
void addLegalAddressScale(unsigned Scale) {
LegalAddressScales.push_back(Scale);
}
private:
std::vector<unsigned> LegalAddressScales;
private:
TargetMachine &TM;
const TargetData &TD;

View File

@ -84,7 +84,7 @@ bool PPCTargetMachine::addPassesToEmitFile(PassManager &PM,
if (FileType != TargetMachine::AssemblyFile) return true;
// Run loop strength reduction before anything else.
if (!Fast) PM.add(createLoopStrengthReducePass(1, &TLInfo));
if (!Fast) PM.add(createLoopStrengthReducePass(&TLInfo));
// FIXME: Implement efficient support for garbage collection intrinsics.
PM.add(createLowerGCPass());
@ -138,7 +138,7 @@ void PPCJITInfo::addPassesToJITCompile(FunctionPassManager &PM) {
TM.setRelocationModel(Reloc::DynamicNoPIC);
// Run loop strength reduction before anything else.
PM.add(createLoopStrengthReducePass(1, TM.getTargetLowering()));
PM.add(createLoopStrengthReducePass(TM.getTargetLowering()));
// FIXME: Implement efficient support for garbage collection intrinsics.
PM.add(createLowerGCPass());

View File

@ -49,6 +49,16 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM)
setSchedulingPreference(SchedulingForRegPressure);
setShiftAmountFlavor(Mask); // shl X, 32 == shl X, 0
setStackPointerRegisterToSaveRestore(X86::ESP);
// Add legal addressing mode scale values.
addLegalAddressScale(8);
addLegalAddressScale(4);
addLegalAddressScale(2);
// Enter the ones which require both scale + index last. These are more
// expensive.
addLegalAddressScale(9);
addLegalAddressScale(5);
addLegalAddressScale(3);
// Set up the register classes.
addRegisterClass(MVT::i8, X86::R8RegisterClass);

View File

@ -97,7 +97,7 @@ bool X86TargetMachine::addPassesToEmitFile(PassManager &PM, std::ostream &Out,
FileType != TargetMachine::ObjectFile) return true;
// Run loop strength reduction before anything else.
if (EnableX86LSR) PM.add(createLoopStrengthReducePass(1, &TLInfo));
if (EnableX86LSR) PM.add(createLoopStrengthReducePass(&TLInfo));
// FIXME: Implement efficient support for garbage collection intrinsics.
PM.add(createLowerGCPass());
@ -166,7 +166,7 @@ void X86JITInfo::addPassesToJITCompile(FunctionPassManager &PM) {
// Run loop strength reduction before anything else.
if (EnableX86LSR)
PM.add(createLoopStrengthReducePass(1, TM.getTargetLowering()));
PM.add(createLoopStrengthReducePass(TM.getTargetLowering()));
// FIXME: Implement efficient support for garbage collection intrinsics.
PM.add(createLowerGCPass());