mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-11 11:34:02 +00:00
Add an AddOptionalDefs method and use it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111489 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1ca8559de5
commit
456144eb14
@ -14,6 +14,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "ARM.h"
|
#include "ARM.h"
|
||||||
|
#include "ARMBaseInstrInfo.h"
|
||||||
#include "ARMRegisterInfo.h"
|
#include "ARMRegisterInfo.h"
|
||||||
#include "ARMTargetMachine.h"
|
#include "ARMTargetMachine.h"
|
||||||
#include "ARMSubtarget.h"
|
#include "ARMSubtarget.h"
|
||||||
@ -98,18 +99,60 @@ class ARMFastISel : public FastISel {
|
|||||||
|
|
||||||
#include "ARMGenFastISel.inc"
|
#include "ARMGenFastISel.inc"
|
||||||
|
|
||||||
};
|
private:
|
||||||
|
bool DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR);
|
||||||
|
const MachineInstrBuilder &AddOptionalDefs(const MachineInstrBuilder &MIB);
|
||||||
|
};
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
||||||
// #include "ARMGenCallingConv.inc"
|
// #include "ARMGenCallingConv.inc"
|
||||||
|
|
||||||
|
// DefinesOptionalPredicate - This is different from DefinesPredicate in that
|
||||||
|
// we don't care about implicit defs here, just places we'll need to add a
|
||||||
|
// default CCReg argument. Sets CPSR if we're setting CPSR instead of CCR.
|
||||||
|
bool ARMFastISel::DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR) {
|
||||||
|
const TargetInstrDesc &TID = MI->getDesc();
|
||||||
|
if (!TID.hasOptionalDef())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Look to see if our OptionalDef is defining CPSR or CCR.
|
||||||
|
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||||
|
const MachineOperand &MO = MI->getOperand(i);
|
||||||
|
if (MO.isDef() && MO.isReg() && MO.getReg() == ARM::CPSR)
|
||||||
|
*CPSR = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the machine is predicable go ahead and add the predicate operands, if
|
||||||
|
// it needs default CC operands add those.
|
||||||
|
const MachineInstrBuilder &
|
||||||
|
ARMFastISel::AddOptionalDefs(const MachineInstrBuilder &MIB) {
|
||||||
|
MachineInstr *MI = &*MIB;
|
||||||
|
|
||||||
|
// Do we use a predicate?
|
||||||
|
if (TII.isPredicable(MI))
|
||||||
|
AddDefaultPred(MIB);
|
||||||
|
|
||||||
|
// Do we optionally set a predicate? Preds is size > 0 iff the predicate
|
||||||
|
// defines CPSR. All other OptionalDefines in ARM are the CCR register.
|
||||||
|
bool CPSR;
|
||||||
|
if (DefinesOptionalPredicate(MI, &CPSR)) {
|
||||||
|
if (CPSR)
|
||||||
|
AddDefaultT1CC(MIB);
|
||||||
|
else
|
||||||
|
AddDefaultCC(MIB);
|
||||||
|
}
|
||||||
|
return MIB;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned ARMFastISel::FastEmitInst_(unsigned MachineInstOpcode,
|
unsigned ARMFastISel::FastEmitInst_(unsigned MachineInstOpcode,
|
||||||
const TargetRegisterClass* RC) {
|
const TargetRegisterClass* RC) {
|
||||||
unsigned ResultReg = createResultReg(RC);
|
unsigned ResultReg = createResultReg(RC);
|
||||||
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
||||||
|
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg));
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg));
|
||||||
return ResultReg;
|
return ResultReg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,12 +163,12 @@ unsigned ARMFastISel::FastEmitInst_r(unsigned MachineInstOpcode,
|
|||||||
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
||||||
|
|
||||||
if (II.getNumDefs() >= 1)
|
if (II.getNumDefs() >= 1)
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill));
|
.addReg(Op0, Op0IsKill * RegState::Kill));
|
||||||
else {
|
else {
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill));
|
.addReg(Op0, Op0IsKill * RegState::Kill));
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||||
TII.get(TargetOpcode::COPY), ResultReg)
|
TII.get(TargetOpcode::COPY), ResultReg)
|
||||||
.addReg(II.ImplicitDefs[0]));
|
.addReg(II.ImplicitDefs[0]));
|
||||||
}
|
}
|
||||||
@ -140,14 +183,14 @@ unsigned ARMFastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
|
|||||||
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
||||||
|
|
||||||
if (II.getNumDefs() >= 1)
|
if (II.getNumDefs() >= 1)
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addReg(Op1, Op1IsKill * RegState::Kill));
|
.addReg(Op1, Op1IsKill * RegState::Kill));
|
||||||
else {
|
else {
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addReg(Op1, Op1IsKill * RegState::Kill));
|
.addReg(Op1, Op1IsKill * RegState::Kill));
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||||
TII.get(TargetOpcode::COPY), ResultReg)
|
TII.get(TargetOpcode::COPY), ResultReg)
|
||||||
.addReg(II.ImplicitDefs[0]));
|
.addReg(II.ImplicitDefs[0]));
|
||||||
}
|
}
|
||||||
@ -162,14 +205,14 @@ unsigned ARMFastISel::FastEmitInst_ri(unsigned MachineInstOpcode,
|
|||||||
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
||||||
|
|
||||||
if (II.getNumDefs() >= 1)
|
if (II.getNumDefs() >= 1)
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addImm(Imm));
|
.addImm(Imm));
|
||||||
else {
|
else {
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addImm(Imm));
|
.addImm(Imm));
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||||
TII.get(TargetOpcode::COPY), ResultReg)
|
TII.get(TargetOpcode::COPY), ResultReg)
|
||||||
.addReg(II.ImplicitDefs[0]));
|
.addReg(II.ImplicitDefs[0]));
|
||||||
}
|
}
|
||||||
@ -184,14 +227,14 @@ unsigned ARMFastISel::FastEmitInst_rf(unsigned MachineInstOpcode,
|
|||||||
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
||||||
|
|
||||||
if (II.getNumDefs() >= 1)
|
if (II.getNumDefs() >= 1)
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addFPImm(FPImm));
|
.addFPImm(FPImm));
|
||||||
else {
|
else {
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addFPImm(FPImm));
|
.addFPImm(FPImm));
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||||
TII.get(TargetOpcode::COPY), ResultReg)
|
TII.get(TargetOpcode::COPY), ResultReg)
|
||||||
.addReg(II.ImplicitDefs[0]));
|
.addReg(II.ImplicitDefs[0]));
|
||||||
}
|
}
|
||||||
@ -207,16 +250,16 @@ unsigned ARMFastISel::FastEmitInst_rri(unsigned MachineInstOpcode,
|
|||||||
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
||||||
|
|
||||||
if (II.getNumDefs() >= 1)
|
if (II.getNumDefs() >= 1)
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addReg(Op1, Op1IsKill * RegState::Kill)
|
.addReg(Op1, Op1IsKill * RegState::Kill)
|
||||||
.addImm(Imm));
|
.addImm(Imm));
|
||||||
else {
|
else {
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
||||||
.addReg(Op0, Op0IsKill * RegState::Kill)
|
.addReg(Op0, Op0IsKill * RegState::Kill)
|
||||||
.addReg(Op1, Op1IsKill * RegState::Kill)
|
.addReg(Op1, Op1IsKill * RegState::Kill)
|
||||||
.addImm(Imm));
|
.addImm(Imm));
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||||
TII.get(TargetOpcode::COPY), ResultReg)
|
TII.get(TargetOpcode::COPY), ResultReg)
|
||||||
.addReg(II.ImplicitDefs[0]));
|
.addReg(II.ImplicitDefs[0]));
|
||||||
}
|
}
|
||||||
@ -230,12 +273,12 @@ unsigned ARMFastISel::FastEmitInst_i(unsigned MachineInstOpcode,
|
|||||||
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
const TargetInstrDesc &II = TII.get(MachineInstOpcode);
|
||||||
|
|
||||||
if (II.getNumDefs() >= 1)
|
if (II.getNumDefs() >= 1)
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
|
||||||
.addImm(Imm));
|
.addImm(Imm));
|
||||||
else {
|
else {
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
|
||||||
.addImm(Imm));
|
.addImm(Imm));
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||||
TII.get(TargetOpcode::COPY), ResultReg)
|
TII.get(TargetOpcode::COPY), ResultReg)
|
||||||
.addReg(II.ImplicitDefs[0]));
|
.addReg(II.ImplicitDefs[0]));
|
||||||
}
|
}
|
||||||
@ -248,7 +291,7 @@ unsigned ARMFastISel::FastEmitInst_extractsubreg(MVT RetVT,
|
|||||||
unsigned ResultReg = createResultReg(TLI.getRegClassFor(RetVT));
|
unsigned ResultReg = createResultReg(TLI.getRegClassFor(RetVT));
|
||||||
assert(TargetRegisterInfo::isVirtualRegister(Op0) &&
|
assert(TargetRegisterInfo::isVirtualRegister(Op0) &&
|
||||||
"Cannot yet extract from physregs");
|
"Cannot yet extract from physregs");
|
||||||
AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
|
||||||
DL, TII.get(TargetOpcode::COPY), ResultReg)
|
DL, TII.get(TargetOpcode::COPY), ResultReg)
|
||||||
.addReg(Op0, getKillRegState(Op0IsKill), Idx));
|
.addReg(Op0, getKillRegState(Op0IsKill), Idx));
|
||||||
return ResultReg;
|
return ResultReg;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user