forked from OSchip/llvm-project
[AArch64] Refactor the scheduling predicates (3/3) (NFC)
Refactor the scheduling predicates based on `MCInstPredicate`. In this case, `AArch64InstrInfo::hasExtendedReg()`. Differential revision: https://reviews.llvm.org/D54822 llvm-svn: 347599
This commit is contained in:
parent
56368c6fa5
commit
6a38a5effe
|
@ -1740,33 +1740,6 @@ bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if this is this instruction has a non-zero immediate
|
|
||||||
bool AArch64InstrInfo::hasExtendedReg(const MachineInstr &MI) {
|
|
||||||
switch (MI.getOpcode()) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case AArch64::ADDSWrx:
|
|
||||||
case AArch64::ADDSXrx:
|
|
||||||
case AArch64::ADDSXrx64:
|
|
||||||
case AArch64::ADDWrx:
|
|
||||||
case AArch64::ADDXrx:
|
|
||||||
case AArch64::ADDXrx64:
|
|
||||||
case AArch64::SUBSWrx:
|
|
||||||
case AArch64::SUBSXrx:
|
|
||||||
case AArch64::SUBSXrx64:
|
|
||||||
case AArch64::SUBWrx:
|
|
||||||
case AArch64::SUBXrx:
|
|
||||||
case AArch64::SUBXrx64:
|
|
||||||
if (MI.getOperand(3).isImm()) {
|
|
||||||
unsigned val = MI.getOperand(3).getImm();
|
|
||||||
return (val != 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return true if this instruction simply sets its single destination register
|
// Return true if this instruction simply sets its single destination register
|
||||||
// to zero. This is equivalent to a register rename of the zero-register.
|
// to zero. This is equivalent to a register rename of the zero-register.
|
||||||
bool AArch64InstrInfo::isGPRZero(const MachineInstr &MI) {
|
bool AArch64InstrInfo::isGPRZero(const MachineInstr &MI) {
|
||||||
|
|
|
@ -62,10 +62,6 @@ public:
|
||||||
unsigned isStoreToStackSlot(const MachineInstr &MI,
|
unsigned isStoreToStackSlot(const MachineInstr &MI,
|
||||||
int &FrameIndex) const override;
|
int &FrameIndex) const override;
|
||||||
|
|
||||||
/// Returns true if there is an extendable register and that the extending
|
|
||||||
/// value is non-zero.
|
|
||||||
static bool hasExtendedReg(const MachineInstr &MI);
|
|
||||||
|
|
||||||
/// Does this instruction set its full destination register to zero?
|
/// Does this instruction set its full destination register to zero?
|
||||||
static bool isGPRZero(const MachineInstr &MI);
|
static bool isGPRZero(const MachineInstr &MI);
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,10 @@ def CheckMemScaled : CheckImmOperandSimple<3>;
|
||||||
|
|
||||||
// Generic predicates.
|
// Generic predicates.
|
||||||
|
|
||||||
|
// Identify arithmetic instructions with extend.
|
||||||
|
def IsArithExtPred : CheckOpcode<[ADDWrx, ADDXrx, ADDXrx64, ADDSWrx, ADDSXrx, ADDSXrx64,
|
||||||
|
SUBWrx, SUBXrx, SUBXrx64, SUBSWrx, SUBSXrx, SUBSXrx64]>;
|
||||||
|
|
||||||
// Identify arithmetic instructions with shift.
|
// Identify arithmetic instructions with shift.
|
||||||
def IsArithShiftPred : CheckOpcode<[ADDWrs, ADDXrs, ADDSWrs, ADDSXrs,
|
def IsArithShiftPred : CheckOpcode<[ADDWrs, ADDXrs, ADDSWrs, ADDSXrs,
|
||||||
SUBWrs, SUBXrs, SUBSWrs, SUBSXrs]>;
|
SUBWrs, SUBXrs, SUBSWrs, SUBSXrs]>;
|
||||||
|
@ -71,6 +75,15 @@ def IsStoreRegOffsetPred : CheckOpcode<[STRBBroW, STRBBroX,
|
||||||
|
|
||||||
// Target predicates.
|
// Target predicates.
|
||||||
|
|
||||||
|
// Identify arithmetic instructions with an extended register.
|
||||||
|
def RegExtendedFn : TIIPredicate<"hasExtendedReg",
|
||||||
|
MCOpcodeSwitchStatement<
|
||||||
|
[MCOpcodeSwitchCase<
|
||||||
|
IsArithExtPred.ValidOpcodes,
|
||||||
|
MCReturnStatement<CheckNot<CheckZeroOperand<3>>>>],
|
||||||
|
MCReturnStatement<FalsePred>>>;
|
||||||
|
def RegExtendedPred : MCSchedPredicate<RegExtendedFn>;
|
||||||
|
|
||||||
// Identify arithmetic and logic instructions with a shifted register.
|
// Identify arithmetic and logic instructions with a shifted register.
|
||||||
def RegShiftedFn : TIIPredicate<"hasShiftedReg",
|
def RegShiftedFn : TIIPredicate<"hasShiftedReg",
|
||||||
MCOpcodeSwitchStatement<
|
MCOpcodeSwitchStatement<
|
||||||
|
|
|
@ -50,9 +50,6 @@ def WriteLDIdx : SchedWrite; // Load from a register index (maybe scaled).
|
||||||
def WriteSTIdx : SchedWrite; // Store to a register index (maybe scaled).
|
def WriteSTIdx : SchedWrite; // Store to a register index (maybe scaled).
|
||||||
def ReadAdrBase : SchedRead; // Read the base resister of a reg-offset LD/ST.
|
def ReadAdrBase : SchedRead; // Read the base resister of a reg-offset LD/ST.
|
||||||
|
|
||||||
// Predicate for determining when a extendedable register is extended.
|
|
||||||
def RegExtendedPred : SchedPredicate<[{TII->hasExtendedReg(*MI)}]>;
|
|
||||||
|
|
||||||
// Serialized two-level address load.
|
// Serialized two-level address load.
|
||||||
// EXAMPLE: LOADGot
|
// EXAMPLE: LOADGot
|
||||||
def WriteLDAdr : WriteSequence<[WriteAdr, WriteLD]>;
|
def WriteLDAdr : WriteSequence<[WriteAdr, WriteLD]>;
|
||||||
|
|
Loading…
Reference in New Issue