/// 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
//
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;
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());
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());
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);
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());
// 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());