mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[Hexagon] Handle J2_jumptpt and J2_jumpfpt in HexagonInstrInfo
llvm-svn: 302033
This commit is contained in:
parent
12eadb6d09
commit
d25fb36bf5
@ -3061,12 +3061,14 @@ bool HexagonInstrInfo::predCanBeUsedAsDotNew(const MachineInstr &MI,
|
||||
}
|
||||
|
||||
bool HexagonInstrInfo::PredOpcodeHasJMP_c(unsigned Opcode) const {
|
||||
return (Opcode == Hexagon::J2_jumpt) ||
|
||||
(Opcode == Hexagon::J2_jumpf) ||
|
||||
(Opcode == Hexagon::J2_jumptnew) ||
|
||||
(Opcode == Hexagon::J2_jumpfnew) ||
|
||||
(Opcode == Hexagon::J2_jumptnewpt) ||
|
||||
(Opcode == Hexagon::J2_jumpfnewpt);
|
||||
return Opcode == Hexagon::J2_jumpt ||
|
||||
Opcode == Hexagon::J2_jumptpt ||
|
||||
Opcode == Hexagon::J2_jumpf ||
|
||||
Opcode == Hexagon::J2_jumpfpt ||
|
||||
Opcode == Hexagon::J2_jumptnew ||
|
||||
Opcode == Hexagon::J2_jumpfnew ||
|
||||
Opcode == Hexagon::J2_jumptnewpt ||
|
||||
Opcode == Hexagon::J2_jumpfnewpt;
|
||||
}
|
||||
|
||||
bool HexagonInstrInfo::predOpcodeHasNot(ArrayRef<MachineOperand> Cond) const {
|
||||
@ -3613,11 +3615,11 @@ int HexagonInstrInfo::getDotNewPredOp(const MachineInstr &MI,
|
||||
}
|
||||
|
||||
int HexagonInstrInfo::getDotOldOp(const MachineInstr &MI) const {
|
||||
const MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const HexagonSubtarget &HST = MF.getSubtarget<HexagonSubtarget>();
|
||||
int NewOp = MI.getOpcode();
|
||||
if (isPredicated(NewOp) && isPredicatedNew(NewOp)) { // Get predicate old form
|
||||
NewOp = Hexagon::getPredOldOpcode(NewOp);
|
||||
const MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const HexagonSubtarget &HST = MF.getSubtarget<HexagonSubtarget>();
|
||||
// All Hexagon architectures have prediction bits on dot-new branches,
|
||||
// but only Hexagon V60+ has prediction bits on dot-old ones. Make sure
|
||||
// to pick the right opcode when converting back to dot-old.
|
||||
@ -3645,6 +3647,21 @@ int HexagonInstrInfo::getDotOldOp(const MachineInstr &MI) const {
|
||||
NewOp = Hexagon::getNonNVStore(NewOp);
|
||||
assert(NewOp >= 0 && "Couldn't change new-value store to its old form.");
|
||||
}
|
||||
|
||||
if (HST.hasV60TOps())
|
||||
return NewOp;
|
||||
|
||||
// Subtargets prior to V60 didn't support 'taken' forms of predicated jumps.
|
||||
switch (NewOp) {
|
||||
case Hexagon::J2_jumpfpt:
|
||||
return Hexagon::J2_jumpf;
|
||||
case Hexagon::J2_jumptpt:
|
||||
return Hexagon::J2_jumpt;
|
||||
case Hexagon::J2_jumprfpt:
|
||||
return Hexagon::J2_jumprf;
|
||||
case Hexagon::J2_jumprtpt:
|
||||
return Hexagon::J2_jumprt;
|
||||
}
|
||||
return NewOp;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user