mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[Hexagon] Mark PS_jumpret as pseudo-instruction, expand it into J2_jumpr
llvm-svn: 279241
This commit is contained in:
parent
3cad3632a2
commit
53fcc0a9e4
@ -1292,8 +1292,27 @@ bool HexagonInstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
|
||||
MI.setDesc(get(Hexagon::J2_jump));
|
||||
return true;
|
||||
case Hexagon::PS_tailcall_r:
|
||||
case Hexagon::PS_jmpret:
|
||||
MI.setDesc(get(Hexagon::J2_jumpr));
|
||||
return true;
|
||||
case Hexagon::PS_jmprett:
|
||||
MI.setDesc(get(Hexagon::J2_jumprt));
|
||||
return true;
|
||||
case Hexagon::PS_jmpretf:
|
||||
MI.setDesc(get(Hexagon::J2_jumprf));
|
||||
return true;
|
||||
case Hexagon::PS_jmprettnewpt:
|
||||
MI.setDesc(get(Hexagon::J2_jumprtnewpt));
|
||||
return true;
|
||||
case Hexagon::PS_jmpretfnewpt:
|
||||
MI.setDesc(get(Hexagon::J2_jumprfnewpt));
|
||||
return true;
|
||||
case Hexagon::PS_jmprettnew:
|
||||
MI.setDesc(get(Hexagon::J2_jumprtnew));
|
||||
return true;
|
||||
case Hexagon::PS_jmpretfnew:
|
||||
MI.setDesc(get(Hexagon::J2_jumprfnew));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -1587,7 +1587,7 @@ let isTerminator = 1, hasSideEffects = 0 in {
|
||||
|
||||
defm J2_jumpr : JMPR_base<"JMPr">, PredNewRel;
|
||||
|
||||
let isReturn = 1, isCodeGenOnly = 1 in
|
||||
let isReturn = 1, isPseudo = 1, isCodeGenOnly = 1 in
|
||||
defm PS_jmpret : JMPR_base<"JMPret">, PredNewRel;
|
||||
}
|
||||
|
||||
|
@ -323,7 +323,6 @@ static bool doesModifyCalleeSavedReg(const MachineInstr &MI,
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: MI->isIndirectBranch() and IsRegisterJump(MI)
|
||||
// Returns true if an instruction can be promoted to .new predicate or
|
||||
// new-value store.
|
||||
bool HexagonPacketizerList::isNewifiable(const MachineInstr &MI,
|
||||
@ -333,7 +332,7 @@ bool HexagonPacketizerList::isNewifiable(const MachineInstr &MI,
|
||||
if (NewRC == &Hexagon::PredRegsRegClass)
|
||||
if (HII->isV60VectorInstruction(MI) && MI.mayStore())
|
||||
return false;
|
||||
return HII->isCondInst(MI) || MI.isReturn() || HII->mayBeNewStore(MI);
|
||||
return HII->isCondInst(MI) || HII->isJumpR(MI) || HII->mayBeNewStore(MI);
|
||||
}
|
||||
|
||||
// Promote an instructiont to its .cur form.
|
||||
@ -798,10 +797,8 @@ bool HexagonPacketizerList::canPromoteToDotNew(const MachineInstr &MI,
|
||||
return false;
|
||||
|
||||
// predicate .new
|
||||
// bug 5670: until that is fixed
|
||||
// TODO: MI->isIndirectBranch() and IsRegisterJump(MI)
|
||||
if (RC == &Hexagon::PredRegsRegClass)
|
||||
if (HII->isCondInst(MI) || MI.isReturn())
|
||||
if (HII->isCondInst(MI) || HII->isJumpR(MI))
|
||||
return HII->predCanBeUsedAsDotNew(PI, DepReg);
|
||||
|
||||
if (RC != &Hexagon::PredRegsRegClass && !HII->mayBeNewStore(MI))
|
||||
@ -1291,7 +1288,7 @@ bool HexagonPacketizerList::isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) {
|
||||
RC = HRI->getMinimalPhysRegClass(DepReg);
|
||||
}
|
||||
|
||||
if (I.isCall() || I.isReturn() || HII->isTailCall(I)) {
|
||||
if (I.isCall() || HII->isJumpR(I) || HII->isTailCall(I)) {
|
||||
if (!isRegDependence(DepType))
|
||||
continue;
|
||||
if (!isCallDependent(I, DepType, SUJ->Succs[i].getReg()))
|
||||
|
@ -262,25 +262,19 @@ unsigned HexagonMCInstrInfo::getDuplexCandidateGroup(MCInst const &MCI) {
|
||||
case Hexagon::EH_RETURN_JMPR:
|
||||
|
||||
case Hexagon::J2_jumpr:
|
||||
case Hexagon::PS_jmpret:
|
||||
// jumpr r31
|
||||
// Actual form JMPR %PC<imp-def>, %R31<imp-use>, %R0<imp-use,internal>.
|
||||
DstReg = MCI.getOperand(0).getReg();
|
||||
if (Hexagon::R31 == DstReg) {
|
||||
if (Hexagon::R31 == DstReg)
|
||||
return HexagonII::HSIG_L2;
|
||||
}
|
||||
break;
|
||||
|
||||
case Hexagon::J2_jumprt:
|
||||
case Hexagon::J2_jumprf:
|
||||
case Hexagon::J2_jumprtnew:
|
||||
case Hexagon::J2_jumprfnew:
|
||||
case Hexagon::PS_jmprett:
|
||||
case Hexagon::PS_jmpretf:
|
||||
case Hexagon::PS_jmprettnew:
|
||||
case Hexagon::PS_jmpretfnew:
|
||||
case Hexagon::PS_jmprettnewpt:
|
||||
case Hexagon::PS_jmpretfnewpt:
|
||||
case Hexagon::J2_jumprtnewpt:
|
||||
case Hexagon::J2_jumprfnewpt:
|
||||
DstReg = MCI.getOperand(1).getReg();
|
||||
SrcReg = MCI.getOperand(0).getReg();
|
||||
// [if ([!]p0[.new])] jumpr r31
|
||||
@ -811,25 +805,20 @@ MCInst HexagonMCInstrInfo::deriveSubInst(MCInst const &Inst) {
|
||||
break; // none SUBInst deallocframe
|
||||
case Hexagon::EH_RETURN_JMPR:
|
||||
case Hexagon::J2_jumpr:
|
||||
case Hexagon::PS_jmpret:
|
||||
Result.setOpcode(Hexagon::V4_SL2_jumpr31);
|
||||
break; // none SUBInst jumpr r31
|
||||
case Hexagon::J2_jumprf:
|
||||
case Hexagon::PS_jmpretf:
|
||||
Result.setOpcode(Hexagon::V4_SL2_jumpr31_f);
|
||||
break; // none SUBInst if (!p0) jumpr r31
|
||||
case Hexagon::J2_jumprfnew:
|
||||
case Hexagon::PS_jmpretfnewpt:
|
||||
case Hexagon::PS_jmpretfnew:
|
||||
case Hexagon::J2_jumprfnewpt:
|
||||
Result.setOpcode(Hexagon::V4_SL2_jumpr31_fnew);
|
||||
break; // none SUBInst if (!p0.new) jumpr:nt r31
|
||||
case Hexagon::J2_jumprt:
|
||||
case Hexagon::PS_jmprett:
|
||||
Result.setOpcode(Hexagon::V4_SL2_jumpr31_t);
|
||||
break; // none SUBInst if (p0) jumpr r31
|
||||
case Hexagon::J2_jumprtnew:
|
||||
case Hexagon::PS_jmprettnewpt:
|
||||
case Hexagon::PS_jmprettnew:
|
||||
case Hexagon::J2_jumprtnewpt:
|
||||
Result.setOpcode(Hexagon::V4_SL2_jumpr31_tnew);
|
||||
break; // none SUBInst if (p0.new) jumpr:nt r31
|
||||
case Hexagon::L2_loadrb_io:
|
||||
|
@ -1,9 +1,8 @@
|
||||
; RUN: llc -march=hexagon < %s | FileCheck %s
|
||||
|
||||
; Allow combine(..##JTI..):
|
||||
; CHECK: r{{[0-9]+}}{{.*}} = {{.*}}#.LJTI
|
||||
; CHECK: r{{[0-9]+}} = memw(r{{[0-9]+}}{{ *}}+{{ *}}r{{[0-9]+<<#[0-9]+}})
|
||||
; CHECK: jumpr:nt r{{[0-9]+}}
|
||||
; CHECK: .LJTI
|
||||
; CHECK-DAG: r[[REG:[0-9]+]] = memw(r{{[0-9]+}}{{ *}}+{{ *}}r{{[0-9]+<<#[0-9]+}})
|
||||
; CHECK-DAG: jumpr:nt r[[REG]]
|
||||
|
||||
define void @main() #0 {
|
||||
entry:
|
||||
|
Loading…
Reference in New Issue
Block a user