mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-24 12:29:33 +00:00
Hexagon: Replace switch-case in isDotNewInst with TSFlags.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178281 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b52980be07
commit
810848d5b3
@ -1881,6 +1881,13 @@ bool HexagonInstrInfo::isPredicated(const MachineInstr *MI) const {
|
||||
return ((F >> HexagonII::PredicatedPos) & HexagonII::PredicatedMask);
|
||||
}
|
||||
|
||||
bool HexagonInstrInfo::isPredicatedNew(const MachineInstr *MI) const {
|
||||
const uint64_t F = MI->getDesc().TSFlags;
|
||||
|
||||
assert(isPredicated(MI));
|
||||
return ((F >> HexagonII::PredicatedNewPos) & HexagonII::PredicatedNewMask);
|
||||
}
|
||||
|
||||
bool
|
||||
HexagonInstrInfo::DefinesPredicate(MachineInstr *MI,
|
||||
std::vector<MachineOperand> &Pred) const {
|
||||
@ -2353,6 +2360,13 @@ isConditionalStore (const MachineInstr* MI) const {
|
||||
}
|
||||
}
|
||||
|
||||
// Returns true, if any one of the operands is a dot new
|
||||
// insn, whether it is predicated dot new or register dot new.
|
||||
bool HexagonInstrInfo::isDotNewInst (const MachineInstr* MI) const {
|
||||
return (isNewValueInst(MI) ||
|
||||
(isPredicated(MI) && isPredicatedNew(MI)));
|
||||
}
|
||||
|
||||
unsigned HexagonInstrInfo::getAddrMode(const MachineInstr* MI) const {
|
||||
const uint64_t F = MI->getDesc().TSFlags;
|
||||
|
||||
|
@ -127,6 +127,7 @@ public:
|
||||
const BranchProbability &Probability) const;
|
||||
|
||||
virtual bool isPredicated(const MachineInstr *MI) const;
|
||||
virtual bool isPredicatedNew(const MachineInstr *MI) const;
|
||||
virtual bool DefinesPredicate(MachineInstr *MI,
|
||||
std::vector<MachineOperand> &Pred) const;
|
||||
virtual bool
|
||||
@ -170,6 +171,7 @@ public:
|
||||
bool isConditionalLoad (const MachineInstr* MI) const;
|
||||
bool isConditionalStore(const MachineInstr* MI) const;
|
||||
bool isNewValueInst(const MachineInstr* MI) const;
|
||||
bool isDotNewInst(const MachineInstr* MI) const;
|
||||
bool isDeallocRet(const MachineInstr *MI) const;
|
||||
unsigned getInvertedPredicatedOpcode(const int Opc) const;
|
||||
bool isExtendable(const MachineInstr* MI) const;
|
||||
|
@ -508,29 +508,30 @@ def : Pat <(sext_inreg (i32 IntRegs:$src1), i16),
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Conditional combine.
|
||||
let neverHasSideEffects = 1, isPredicated = 1 in
|
||||
let neverHasSideEffects = 1, isPredicated = 1 in {
|
||||
def COMBINE_rr_cPt : ALU32_rr<(outs DoubleRegs:$dst),
|
||||
(ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
|
||||
"if ($src1) $dst = combine($src2, $src3)",
|
||||
[]>;
|
||||
|
||||
let neverHasSideEffects = 1, isPredicated = 1 in
|
||||
let isPredicatedFalse = 1 in
|
||||
def COMBINE_rr_cNotPt : ALU32_rr<(outs DoubleRegs:$dst),
|
||||
(ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
|
||||
"if (!$src1) $dst = combine($src2, $src3)",
|
||||
[]>;
|
||||
|
||||
let neverHasSideEffects = 1, isPredicated = 1 in
|
||||
let isPredicatedNew = 1 in
|
||||
def COMBINE_rr_cdnPt : ALU32_rr<(outs DoubleRegs:$dst),
|
||||
(ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
|
||||
"if ($src1.new) $dst = combine($src2, $src3)",
|
||||
[]>;
|
||||
|
||||
let neverHasSideEffects = 1, isPredicated = 1 in
|
||||
let isPredicatedNew = 1, isPredicatedFalse = 1 in
|
||||
def COMBINE_rr_cdnNotPt : ALU32_rr<(outs DoubleRegs:$dst),
|
||||
(ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
|
||||
"if (!$src1.new) $dst = combine($src2, $src3)",
|
||||
[]>;
|
||||
}
|
||||
|
||||
// Compare.
|
||||
defm CMPGTU : CMP32_rr_ri_u9<"cmp.gtu", "CMPGTU", setugt>, ImmRegRel;
|
||||
|
@ -149,7 +149,6 @@ namespace {
|
||||
bool canReserveResourcesForConstExt(MachineInstr *MI);
|
||||
void reserveResourcesForConstExt(MachineInstr* MI);
|
||||
bool isNewValueInst(MachineInstr* MI);
|
||||
bool isDotNewInst(MachineInstr* MI);
|
||||
};
|
||||
}
|
||||
|
||||
@ -2154,172 +2153,6 @@ static bool GetPredicateSense(MachineInstr* MI,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool HexagonPacketizerList::isDotNewInst(MachineInstr* MI) {
|
||||
const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
|
||||
if (QII->isNewValueInst(MI))
|
||||
return true;
|
||||
|
||||
switch (MI->getOpcode()) {
|
||||
case Hexagon::TFR_cdnNotPt:
|
||||
case Hexagon::TFR_cdnPt:
|
||||
case Hexagon::TFRI_cdnNotPt:
|
||||
case Hexagon::TFRI_cdnPt:
|
||||
case Hexagon::LDrid_cdnPt :
|
||||
case Hexagon::LDrid_cdnNotPt :
|
||||
case Hexagon::LDrid_indexed_cdnPt :
|
||||
case Hexagon::LDrid_indexed_cdnNotPt :
|
||||
case Hexagon::POST_LDrid_cdnPt_V4 :
|
||||
case Hexagon::POST_LDrid_cdnNotPt_V4 :
|
||||
case Hexagon::LDriw_cdnPt :
|
||||
case Hexagon::LDriw_cdnNotPt :
|
||||
case Hexagon::LDriw_indexed_cdnPt :
|
||||
case Hexagon::LDriw_indexed_cdnNotPt :
|
||||
case Hexagon::POST_LDriw_cdnPt_V4 :
|
||||
case Hexagon::POST_LDriw_cdnNotPt_V4 :
|
||||
case Hexagon::LDrih_cdnPt :
|
||||
case Hexagon::LDrih_cdnNotPt :
|
||||
case Hexagon::LDrih_indexed_cdnPt :
|
||||
case Hexagon::LDrih_indexed_cdnNotPt :
|
||||
case Hexagon::POST_LDrih_cdnPt_V4 :
|
||||
case Hexagon::POST_LDrih_cdnNotPt_V4 :
|
||||
case Hexagon::LDrib_cdnPt :
|
||||
case Hexagon::LDrib_cdnNotPt :
|
||||
case Hexagon::LDrib_indexed_cdnPt :
|
||||
case Hexagon::LDrib_indexed_cdnNotPt :
|
||||
case Hexagon::POST_LDrib_cdnPt_V4 :
|
||||
case Hexagon::POST_LDrib_cdnNotPt_V4 :
|
||||
case Hexagon::LDriuh_cdnPt :
|
||||
case Hexagon::LDriuh_cdnNotPt :
|
||||
case Hexagon::LDriuh_indexed_cdnPt :
|
||||
case Hexagon::LDriuh_indexed_cdnNotPt :
|
||||
case Hexagon::POST_LDriuh_cdnPt_V4 :
|
||||
case Hexagon::POST_LDriuh_cdnNotPt_V4 :
|
||||
case Hexagon::LDriub_cdnPt :
|
||||
case Hexagon::LDriub_cdnNotPt :
|
||||
case Hexagon::LDriub_indexed_cdnPt :
|
||||
case Hexagon::LDriub_indexed_cdnNotPt :
|
||||
case Hexagon::POST_LDriub_cdnPt_V4 :
|
||||
case Hexagon::POST_LDriub_cdnNotPt_V4 :
|
||||
|
||||
case Hexagon::LDrid_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::LDrid_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::LDrib_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::LDrib_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::LDriub_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::LDriub_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::LDrih_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::LDrih_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::LDriuh_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::LDriuh_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::LDriw_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::LDriw_indexed_shl_cdnNotPt_V4 :
|
||||
|
||||
// Coditional add
|
||||
case Hexagon::ADD_ri_cdnPt:
|
||||
case Hexagon::ADD_ri_cdnNotPt:
|
||||
case Hexagon::ADD_rr_cdnPt:
|
||||
case Hexagon::ADD_rr_cdnNotPt:
|
||||
|
||||
// Conditional logical operations
|
||||
case Hexagon::XOR_rr_cdnPt :
|
||||
case Hexagon::XOR_rr_cdnNotPt :
|
||||
case Hexagon::AND_rr_cdnPt :
|
||||
case Hexagon::AND_rr_cdnNotPt :
|
||||
case Hexagon::OR_rr_cdnPt :
|
||||
case Hexagon::OR_rr_cdnNotPt :
|
||||
|
||||
// Conditonal subtract
|
||||
case Hexagon::SUB_rr_cdnPt :
|
||||
case Hexagon::SUB_rr_cdnNotPt :
|
||||
|
||||
// Conditional combine
|
||||
case Hexagon::COMBINE_rr_cdnPt :
|
||||
case Hexagon::COMBINE_rr_cdnNotPt :
|
||||
|
||||
// Conditional shift operations
|
||||
case Hexagon::ASLH_cdnPt_V4:
|
||||
case Hexagon::ASLH_cdnNotPt_V4:
|
||||
case Hexagon::ASRH_cdnPt_V4:
|
||||
case Hexagon::ASRH_cdnNotPt_V4:
|
||||
case Hexagon::SXTB_cdnPt_V4:
|
||||
case Hexagon::SXTB_cdnNotPt_V4:
|
||||
case Hexagon::SXTH_cdnPt_V4:
|
||||
case Hexagon::SXTH_cdnNotPt_V4:
|
||||
case Hexagon::ZXTB_cdnPt_V4:
|
||||
case Hexagon::ZXTB_cdnNotPt_V4:
|
||||
case Hexagon::ZXTH_cdnPt_V4:
|
||||
case Hexagon::ZXTH_cdnNotPt_V4:
|
||||
|
||||
// Conditional stores
|
||||
case Hexagon::STrib_imm_cdnPt_V4 :
|
||||
case Hexagon::STrib_imm_cdnNotPt_V4 :
|
||||
case Hexagon::STrib_cdnPt_V4 :
|
||||
case Hexagon::STrib_cdnNotPt_V4 :
|
||||
case Hexagon::STrib_indexed_cdnPt_V4 :
|
||||
case Hexagon::STrib_indexed_cdnNotPt_V4 :
|
||||
case Hexagon::POST_STbri_cdnPt_V4 :
|
||||
case Hexagon::POST_STbri_cdnNotPt_V4 :
|
||||
case Hexagon::STrib_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::STrib_indexed_shl_cdnNotPt_V4 :
|
||||
|
||||
// Store doubleword conditionally
|
||||
case Hexagon::STrid_indexed_cdnPt_V4 :
|
||||
case Hexagon::STrid_indexed_cdnNotPt_V4 :
|
||||
case Hexagon::STrid_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::STrid_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::POST_STdri_cdnPt_V4 :
|
||||
case Hexagon::POST_STdri_cdnNotPt_V4 :
|
||||
|
||||
// Store halfword conditionally
|
||||
case Hexagon::STrih_cdnPt_V4 :
|
||||
case Hexagon::STrih_cdnNotPt_V4 :
|
||||
case Hexagon::STrih_indexed_cdnPt_V4 :
|
||||
case Hexagon::STrih_indexed_cdnNotPt_V4 :
|
||||
case Hexagon::STrih_imm_cdnPt_V4 :
|
||||
case Hexagon::STrih_imm_cdnNotPt_V4 :
|
||||
case Hexagon::STrih_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::STrih_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::POST_SThri_cdnPt_V4 :
|
||||
case Hexagon::POST_SThri_cdnNotPt_V4 :
|
||||
|
||||
// Store word conditionally
|
||||
case Hexagon::STriw_cdnPt_V4 :
|
||||
case Hexagon::STriw_cdnNotPt_V4 :
|
||||
case Hexagon::STriw_indexed_cdnPt_V4 :
|
||||
case Hexagon::STriw_indexed_cdnNotPt_V4 :
|
||||
case Hexagon::STriw_imm_cdnPt_V4 :
|
||||
case Hexagon::STriw_imm_cdnNotPt_V4 :
|
||||
case Hexagon::STriw_indexed_shl_cdnPt_V4 :
|
||||
case Hexagon::STriw_indexed_shl_cdnNotPt_V4 :
|
||||
case Hexagon::POST_STwri_cdnPt_V4 :
|
||||
case Hexagon::POST_STwri_cdnNotPt_V4 :
|
||||
|
||||
case Hexagon::LDd_GP_cdnPt_V4:
|
||||
case Hexagon::LDd_GP_cdnNotPt_V4:
|
||||
case Hexagon::LDb_GP_cdnPt_V4:
|
||||
case Hexagon::LDb_GP_cdnNotPt_V4:
|
||||
case Hexagon::LDub_GP_cdnPt_V4:
|
||||
case Hexagon::LDub_GP_cdnNotPt_V4:
|
||||
case Hexagon::LDh_GP_cdnPt_V4:
|
||||
case Hexagon::LDh_GP_cdnNotPt_V4:
|
||||
case Hexagon::LDuh_GP_cdnPt_V4:
|
||||
case Hexagon::LDuh_GP_cdnNotPt_V4:
|
||||
case Hexagon::LDw_GP_cdnPt_V4:
|
||||
case Hexagon::LDw_GP_cdnNotPt_V4:
|
||||
|
||||
case Hexagon::STd_GP_cdnPt_V4:
|
||||
case Hexagon::STd_GP_cdnNotPt_V4:
|
||||
case Hexagon::STb_GP_cdnPt_V4:
|
||||
case Hexagon::STb_GP_cdnNotPt_V4:
|
||||
case Hexagon::STh_GP_cdnPt_V4:
|
||||
case Hexagon::STh_GP_cdnNotPt_V4:
|
||||
case Hexagon::STw_GP_cdnPt_V4:
|
||||
case Hexagon::STw_GP_cdnNotPt_V4:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static MachineOperand& GetPostIncrementOperand(MachineInstr *MI,
|
||||
const HexagonInstrInfo *QII) {
|
||||
assert(QII->isPostIncrement(MI) && "Not a post increment operation.");
|
||||
@ -2490,7 +2323,7 @@ bool HexagonPacketizerList::CanPromoteToNewValueStore( MachineInstr *MI,
|
||||
// sense, i.e, either both should be negated or both should be none negated.
|
||||
|
||||
if (( predRegNumDst != predRegNumSrc) ||
|
||||
isDotNewInst(PacketMI) != isDotNewInst(MI) ||
|
||||
QII->isDotNewInst(PacketMI) != QII->isDotNewInst(MI) ||
|
||||
GetPredicateSense(MI, QII) != GetPredicateSense(PacketMI, QII)) {
|
||||
return false;
|
||||
}
|
||||
@ -2600,8 +2433,9 @@ bool HexagonPacketizerList::CanPromoteToDotNew( MachineInstr *MI,
|
||||
MachineBasicBlock::iterator &MII,
|
||||
const TargetRegisterClass* RC )
|
||||
{
|
||||
// already a dot new instruction
|
||||
if (isDotNewInst(MI) && !IsNewifyStore(MI))
|
||||
const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
|
||||
// Already a dot new instruction.
|
||||
if (QII->isDotNewInst(MI) && !IsNewifyStore(MI))
|
||||
return false;
|
||||
|
||||
if (!isNewifiable(MI))
|
||||
@ -2616,7 +2450,6 @@ bool HexagonPacketizerList::CanPromoteToDotNew( MachineInstr *MI,
|
||||
else {
|
||||
// Create a dot new machine instruction to see if resources can be
|
||||
// allocated. If not, bail out now.
|
||||
const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
|
||||
int NewOpcode = GetDotNewOp(MI->getOpcode());
|
||||
const MCInstrDesc &desc = QII->get(NewOpcode);
|
||||
DebugLoc dl;
|
||||
@ -2759,7 +2592,7 @@ bool HexagonPacketizerList::ArePredicatesComplements (MachineInstr* MI1,
|
||||
// !p0 is not complimentary to p0.new
|
||||
return ((MI1->getOperand(1).getReg() == MI2->getOperand(1).getReg()) &&
|
||||
(GetPredicateSense(MI1, QII) != GetPredicateSense(MI2, QII)) &&
|
||||
(isDotNewInst(MI1) == isDotNewInst(MI2)));
|
||||
(QII->isDotNewInst(MI1) == QII->isDotNewInst(MI2)));
|
||||
}
|
||||
|
||||
// initPacketizerState - Initialize packetizer flags
|
||||
|
Loading…
x
Reference in New Issue
Block a user