forked from OSchip/llvm-project
ARM Scheduler Model: Add resources instructions, map resources in subtargets
Reapply r177968: After commit 178074 we can now have undefined scheduler variants. Move the CortexA9 resources into the CortexA9 SchedModel namespace. Define resource mappings under the CortexA9 SchedModel. Define resources and mappings for the SwiftModel. Incooperate Andrew's feedback. llvm-svn: 178460
This commit is contained in:
parent
52ceb44331
commit
6793aebb84
|
@ -1010,7 +1010,8 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
|
||||||
let isReMaterializable = 1 in {
|
let isReMaterializable = 1 in {
|
||||||
def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
|
def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
|
||||||
iii, opc, "\t$Rd, $Rn, $imm",
|
iii, opc, "\t$Rd, $Rn, $imm",
|
||||||
[(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]> {
|
[(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]>,
|
||||||
|
Sched<[WriteALU, ReadALU]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<12> imm;
|
bits<12> imm;
|
||||||
|
@ -1022,7 +1023,8 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
|
||||||
}
|
}
|
||||||
def rr : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm,
|
def rr : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm,
|
||||||
iir, opc, "\t$Rd, $Rn, $Rm",
|
iir, opc, "\t$Rd, $Rn, $Rm",
|
||||||
[(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]> {
|
[(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]>,
|
||||||
|
Sched<[WriteALU, ReadALU, ReadALU]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<4> Rm;
|
bits<4> Rm;
|
||||||
|
@ -1037,7 +1039,8 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
|
||||||
def rsi : AsI1<opcod, (outs GPR:$Rd),
|
def rsi : AsI1<opcod, (outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_imm:$shift), DPSoRegImmFrm,
|
(ins GPR:$Rn, so_reg_imm:$shift), DPSoRegImmFrm,
|
||||||
iis, opc, "\t$Rd, $Rn, $shift",
|
iis, opc, "\t$Rd, $Rn, $shift",
|
||||||
[(set GPR:$Rd, (opnode GPR:$Rn, so_reg_imm:$shift))]> {
|
[(set GPR:$Rd, (opnode GPR:$Rn, so_reg_imm:$shift))]>,
|
||||||
|
Sched<[WriteALUsi, ReadALU]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<12> shift;
|
bits<12> shift;
|
||||||
|
@ -1052,7 +1055,8 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
|
||||||
def rsr : AsI1<opcod, (outs GPR:$Rd),
|
def rsr : AsI1<opcod, (outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_reg:$shift), DPSoRegRegFrm,
|
(ins GPR:$Rn, so_reg_reg:$shift), DPSoRegRegFrm,
|
||||||
iis, opc, "\t$Rd, $Rn, $shift",
|
iis, opc, "\t$Rd, $Rn, $shift",
|
||||||
[(set GPR:$Rd, (opnode GPR:$Rn, so_reg_reg:$shift))]> {
|
[(set GPR:$Rd, (opnode GPR:$Rn, so_reg_reg:$shift))]>,
|
||||||
|
Sched<[WriteALUsr, ReadALUsr]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<12> shift;
|
bits<12> shift;
|
||||||
|
@ -1079,7 +1083,8 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
|
||||||
let isReMaterializable = 1 in {
|
let isReMaterializable = 1 in {
|
||||||
def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
|
def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
|
||||||
iii, opc, "\t$Rd, $Rn, $imm",
|
iii, opc, "\t$Rd, $Rn, $imm",
|
||||||
[(set GPR:$Rd, (opnode so_imm:$imm, GPR:$Rn))]> {
|
[(set GPR:$Rd, (opnode so_imm:$imm, GPR:$Rn))]>,
|
||||||
|
Sched<[WriteALU, ReadALU]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<12> imm;
|
bits<12> imm;
|
||||||
|
@ -1091,7 +1096,8 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
|
||||||
}
|
}
|
||||||
def rr : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm,
|
def rr : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm,
|
||||||
iir, opc, "\t$Rd, $Rn, $Rm",
|
iir, opc, "\t$Rd, $Rn, $Rm",
|
||||||
[/* pattern left blank */]> {
|
[/* pattern left blank */]>,
|
||||||
|
Sched<[WriteALU, ReadALU, ReadALU]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<4> Rm;
|
bits<4> Rm;
|
||||||
|
@ -1105,7 +1111,8 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
|
||||||
def rsi : AsI1<opcod, (outs GPR:$Rd),
|
def rsi : AsI1<opcod, (outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_imm:$shift), DPSoRegImmFrm,
|
(ins GPR:$Rn, so_reg_imm:$shift), DPSoRegImmFrm,
|
||||||
iis, opc, "\t$Rd, $Rn, $shift",
|
iis, opc, "\t$Rd, $Rn, $shift",
|
||||||
[(set GPR:$Rd, (opnode so_reg_imm:$shift, GPR:$Rn))]> {
|
[(set GPR:$Rd, (opnode so_reg_imm:$shift, GPR:$Rn))]>,
|
||||||
|
Sched<[WriteALUsi, ReadALU]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<12> shift;
|
bits<12> shift;
|
||||||
|
@ -1120,7 +1127,8 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
|
||||||
def rsr : AsI1<opcod, (outs GPR:$Rd),
|
def rsr : AsI1<opcod, (outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_reg:$shift), DPSoRegRegFrm,
|
(ins GPR:$Rn, so_reg_reg:$shift), DPSoRegRegFrm,
|
||||||
iis, opc, "\t$Rd, $Rn, $shift",
|
iis, opc, "\t$Rd, $Rn, $shift",
|
||||||
[(set GPR:$Rd, (opnode so_reg_reg:$shift, GPR:$Rn))]> {
|
[(set GPR:$Rd, (opnode so_reg_reg:$shift, GPR:$Rn))]>,
|
||||||
|
Sched<[WriteALUsr, ReadALUsr]> {
|
||||||
bits<4> Rd;
|
bits<4> Rd;
|
||||||
bits<4> Rn;
|
bits<4> Rn;
|
||||||
bits<12> shift;
|
bits<12> shift;
|
||||||
|
@ -1145,24 +1153,28 @@ multiclass AsI1_bin_s_irs<InstrItinClass iii, InstrItinClass iir,
|
||||||
bit Commutable = 0> {
|
bit Commutable = 0> {
|
||||||
def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm, pred:$p),
|
def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm, pred:$p),
|
||||||
4, iii,
|
4, iii,
|
||||||
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn, so_imm:$imm))]>;
|
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn, so_imm:$imm))]>,
|
||||||
|
Sched<[WriteALU, ReadALU]>;
|
||||||
|
|
||||||
def rr : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, pred:$p),
|
def rr : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, pred:$p),
|
||||||
4, iir,
|
4, iir,
|
||||||
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn, GPR:$Rm))]> {
|
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn, GPR:$Rm))]>,
|
||||||
|
Sched<[WriteALU, ReadALU, ReadALU]> {
|
||||||
let isCommutable = Commutable;
|
let isCommutable = Commutable;
|
||||||
}
|
}
|
||||||
def rsi : ARMPseudoInst<(outs GPR:$Rd),
|
def rsi : ARMPseudoInst<(outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_imm:$shift, pred:$p),
|
(ins GPR:$Rn, so_reg_imm:$shift, pred:$p),
|
||||||
4, iis,
|
4, iis,
|
||||||
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn,
|
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn,
|
||||||
so_reg_imm:$shift))]>;
|
so_reg_imm:$shift))]>,
|
||||||
|
Sched<[WriteALUsi, ReadALU]>;
|
||||||
|
|
||||||
def rsr : ARMPseudoInst<(outs GPR:$Rd),
|
def rsr : ARMPseudoInst<(outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_reg:$shift, pred:$p),
|
(ins GPR:$Rn, so_reg_reg:$shift, pred:$p),
|
||||||
4, iis,
|
4, iis,
|
||||||
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn,
|
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn,
|
||||||
so_reg_reg:$shift))]>;
|
so_reg_reg:$shift))]>,
|
||||||
|
Sched<[WriteALUSsr, ReadALUsr]>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1174,19 +1186,22 @@ multiclass AsI1_rbin_s_is<InstrItinClass iii, InstrItinClass iir,
|
||||||
bit Commutable = 0> {
|
bit Commutable = 0> {
|
||||||
def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm, pred:$p),
|
def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm, pred:$p),
|
||||||
4, iii,
|
4, iii,
|
||||||
[(set GPR:$Rd, CPSR, (opnode so_imm:$imm, GPR:$Rn))]>;
|
[(set GPR:$Rd, CPSR, (opnode so_imm:$imm, GPR:$Rn))]>,
|
||||||
|
Sched<[WriteALU, ReadALU]>;
|
||||||
|
|
||||||
def rsi : ARMPseudoInst<(outs GPR:$Rd),
|
def rsi : ARMPseudoInst<(outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_imm:$shift, pred:$p),
|
(ins GPR:$Rn, so_reg_imm:$shift, pred:$p),
|
||||||
4, iis,
|
4, iis,
|
||||||
[(set GPR:$Rd, CPSR, (opnode so_reg_imm:$shift,
|
[(set GPR:$Rd, CPSR, (opnode so_reg_imm:$shift,
|
||||||
GPR:$Rn))]>;
|
GPR:$Rn))]>,
|
||||||
|
Sched<[WriteALUsi, ReadALU]>;
|
||||||
|
|
||||||
def rsr : ARMPseudoInst<(outs GPR:$Rd),
|
def rsr : ARMPseudoInst<(outs GPR:$Rd),
|
||||||
(ins GPR:$Rn, so_reg_reg:$shift, pred:$p),
|
(ins GPR:$Rn, so_reg_reg:$shift, pred:$p),
|
||||||
4, iis,
|
4, iis,
|
||||||
[(set GPR:$Rd, CPSR, (opnode so_reg_reg:$shift,
|
[(set GPR:$Rd, CPSR, (opnode so_reg_reg:$shift,
|
||||||
GPR:$Rn))]>;
|
GPR:$Rn))]>,
|
||||||
|
Sched<[WriteALUSsr, ReadALUsr]>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,13 +56,20 @@
|
||||||
|
|
||||||
// Basic ALU operation.
|
// Basic ALU operation.
|
||||||
def WriteALU : SchedWrite;
|
def WriteALU : SchedWrite;
|
||||||
def ReadAdvanceALU : SchedRead;
|
def ReadALU : SchedRead;
|
||||||
|
|
||||||
// Basic ALU with shifts.
|
// Basic ALU with shifts.
|
||||||
def WriteALUsi : SchedWrite; // Shift by immediate.
|
def WriteALUsi : SchedWrite; // Shift by immediate.
|
||||||
def WriteALUsr : SchedWrite; // Shift by register.
|
def WriteALUsr : SchedWrite; // Shift by register.
|
||||||
def WriteALUSsr : SchedWrite; // Shift by register (flag setting).
|
def WriteALUSsr : SchedWrite; // Shift by register (flag setting).
|
||||||
def ReadAdvanceALUsr : SchedRead; // Some operands are read later.
|
def ReadALUsr : SchedRead; // Some operands are read later.
|
||||||
|
|
||||||
|
// Define TII for use in SchedVariant Predicates.
|
||||||
|
def : PredicateProlog<[{
|
||||||
|
const ARMBaseInstrInfo *TII =
|
||||||
|
static_cast<const ARMBaseInstrInfo*>(SchedModel->getInstrInfo());
|
||||||
|
(void)TII;
|
||||||
|
}]>;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Instruction Itinerary classes used for ARM
|
// Instruction Itinerary classes used for ARM
|
||||||
|
|
|
@ -1898,6 +1898,8 @@ def CortexA9Model : SchedMachineModel {
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Define each kind of processor resource and number available.
|
// Define each kind of processor resource and number available.
|
||||||
|
|
||||||
|
let SchedModel = CortexA9Model in {
|
||||||
|
|
||||||
def A9UnitALU : ProcResource<2>;
|
def A9UnitALU : ProcResource<2>;
|
||||||
def A9UnitMul : ProcResource<1> { let Super = A9UnitALU; }
|
def A9UnitMul : ProcResource<1> { let Super = A9UnitALU; }
|
||||||
def A9UnitAGU : ProcResource<1>;
|
def A9UnitAGU : ProcResource<1>;
|
||||||
|
@ -1918,11 +1920,11 @@ def A9WriteI : SchedWriteRes<[A9UnitALU]>;
|
||||||
def A9WriteIsr : SchedWriteRes<[A9UnitALU]> { let Latency = 2; }
|
def A9WriteIsr : SchedWriteRes<[A9UnitALU]> { let Latency = 2; }
|
||||||
|
|
||||||
// Basic ALU.
|
// Basic ALU.
|
||||||
def A9WriteA : SchedWriteRes<[A9UnitALU]>;
|
def : WriteRes<WriteALU, [A9UnitALU]>;
|
||||||
// ALU with operand shifted by immediate.
|
// ALU with operand shifted by immediate.
|
||||||
def A9WriteAsi : SchedWriteRes<[A9UnitALU]> { let Latency = 2; }
|
def : WriteRes<WriteALUsi, [A9UnitALU]> { let Latency = 2; }
|
||||||
// ALU with operand shifted by register.
|
// ALU with operand shifted by register.
|
||||||
def A9WriteAsr : SchedWriteRes<[A9UnitALU]> { let Latency = 3; }
|
def A9WriteALUsr : SchedWriteRes<[A9UnitALU]> { let Latency = 3; }
|
||||||
|
|
||||||
// Multiplication
|
// Multiplication
|
||||||
def A9WriteM : SchedWriteRes<[A9UnitMul, A9UnitMul]> { let Latency = 4; }
|
def A9WriteM : SchedWriteRes<[A9UnitMul, A9UnitMul]> { let Latency = 4; }
|
||||||
|
@ -2003,13 +2005,6 @@ foreach NumCycles = 2-8 in {
|
||||||
def A9WriteCycle#NumCycles : WriteSequence<[A9WriteCycle1], NumCycles>;
|
def A9WriteCycle#NumCycles : WriteSequence<[A9WriteCycle1], NumCycles>;
|
||||||
} // foreach NumCycles
|
} // foreach NumCycles
|
||||||
|
|
||||||
// Define TII for use in SchedVariant Predicates.
|
|
||||||
def : PredicateProlog<[{
|
|
||||||
const ARMBaseInstrInfo *TII =
|
|
||||||
static_cast<const ARMBaseInstrInfo*>(SchedModel->getInstrInfo());
|
|
||||||
(void)TII;
|
|
||||||
}]>;
|
|
||||||
|
|
||||||
// Define address generation sequences and predicates for 8 flavors of LDMs.
|
// Define address generation sequences and predicates for 8 flavors of LDMs.
|
||||||
foreach NumAddr = 1-8 in {
|
foreach NumAddr = 1-8 in {
|
||||||
|
|
||||||
|
@ -2254,11 +2249,11 @@ def A9WriteLMfp : SchedWriteVariant<[
|
||||||
// These mov immediate writers are unconditionally expanded with
|
// These mov immediate writers are unconditionally expanded with
|
||||||
// additive latency.
|
// additive latency.
|
||||||
def A9WriteI2 : WriteSequence<[A9WriteI, A9WriteI]>;
|
def A9WriteI2 : WriteSequence<[A9WriteI, A9WriteI]>;
|
||||||
def A9WriteI2pc : WriteSequence<[A9WriteI, A9WriteI, A9WriteA]>;
|
def A9WriteI2pc : WriteSequence<[A9WriteI, A9WriteI, WriteALU]>;
|
||||||
def A9WriteI2ld : WriteSequence<[A9WriteI, A9WriteI, A9WriteL]>;
|
def A9WriteI2ld : WriteSequence<[A9WriteI, A9WriteI, A9WriteL]>;
|
||||||
|
|
||||||
// Some ALU operations can read loaded integer values one cycle early.
|
// Some ALU operations can read loaded integer values one cycle early.
|
||||||
def A9ReadA : SchedReadAdvance<1,
|
def A9ReadALU : SchedReadAdvance<1,
|
||||||
[A9WriteL, A9WriteLHi, A9WriteLsi, A9WriteLb, A9WriteLbsi,
|
[A9WriteL, A9WriteLHi, A9WriteLsi, A9WriteLb, A9WriteLbsi,
|
||||||
A9WriteL1, A9WriteL2, A9WriteL3, A9WriteL4,
|
A9WriteL1, A9WriteL2, A9WriteL3, A9WriteL4,
|
||||||
A9WriteL5, A9WriteL6, A9WriteL7, A9WriteL8,
|
A9WriteL5, A9WriteL6, A9WriteL7, A9WriteL8,
|
||||||
|
@ -2279,26 +2274,25 @@ def A9Read4 : SchedReadAdvance<3>;
|
||||||
|
|
||||||
// This table follows the ARM Cortex-A9 Technical Reference Manuals,
|
// This table follows the ARM Cortex-A9 Technical Reference Manuals,
|
||||||
// mostly in order.
|
// mostly in order.
|
||||||
let SchedModel = CortexA9Model in {
|
|
||||||
|
|
||||||
def :ItinRW<[A9WriteI], [IIC_iMOVi,IIC_iMOVr,IIC_iMOVsi,
|
def :ItinRW<[A9WriteI], [IIC_iMOVi,IIC_iMOVr,IIC_iMOVsi,
|
||||||
IIC_iMVNi,IIC_iMVNsi,
|
IIC_iMVNi,IIC_iMVNsi,
|
||||||
IIC_iCMOVi,IIC_iCMOVr,IIC_iCMOVsi]>;
|
IIC_iCMOVi,IIC_iCMOVr,IIC_iCMOVsi]>;
|
||||||
def :ItinRW<[A9WriteI,A9ReadA],[IIC_iMVNr]>;
|
def :ItinRW<[A9WriteI,ReadALU],[IIC_iMVNr]>;
|
||||||
def :ItinRW<[A9WriteIsr], [IIC_iMOVsr,IIC_iMVNsr,IIC_iCMOVsr]>;
|
def :ItinRW<[A9WriteIsr], [IIC_iMOVsr,IIC_iMVNsr,IIC_iCMOVsr]>;
|
||||||
|
|
||||||
def :ItinRW<[A9WriteI2], [IIC_iMOVix2,IIC_iCMOVix2]>;
|
def :ItinRW<[A9WriteI2], [IIC_iMOVix2,IIC_iCMOVix2]>;
|
||||||
def :ItinRW<[A9WriteI2pc], [IIC_iMOVix2addpc]>;
|
def :ItinRW<[A9WriteI2pc], [IIC_iMOVix2addpc]>;
|
||||||
def :ItinRW<[A9WriteI2ld], [IIC_iMOVix2ld]>;
|
def :ItinRW<[A9WriteI2ld], [IIC_iMOVix2ld]>;
|
||||||
|
|
||||||
def :ItinRW<[A9WriteA], [IIC_iBITi,IIC_iBITr,IIC_iUNAr,IIC_iTSTi,IIC_iTSTr]>;
|
def :ItinRW<[WriteALU], [IIC_iBITi,IIC_iBITr,IIC_iUNAr,IIC_iTSTi,IIC_iTSTr]>;
|
||||||
def :ItinRW<[A9WriteA, A9ReadA], [IIC_iALUi, IIC_iCMPi, IIC_iCMPsi]>;
|
def :ItinRW<[WriteALU, ReadALU], [IIC_iALUi, IIC_iCMPi, IIC_iCMPsi]>;
|
||||||
def :ItinRW<[A9WriteA, A9ReadA, A9ReadA],[IIC_iALUr,IIC_iCMPr]>;
|
def :ItinRW<[WriteALU, ReadALU, ReadALU],[IIC_iALUr,IIC_iCMPr]>;
|
||||||
def :ItinRW<[A9WriteAsi], [IIC_iBITsi,IIC_iUNAsi,IIC_iEXTr,IIC_iTSTsi]>;
|
def :ItinRW<[WriteALUsi], [IIC_iBITsi,IIC_iUNAsi,IIC_iEXTr,IIC_iTSTsi]>;
|
||||||
def :ItinRW<[A9WriteAsi, A9ReadA], [IIC_iALUsi]>;
|
def :ItinRW<[WriteALUsi, ReadALU], [IIC_iALUsi]>;
|
||||||
def :ItinRW<[A9WriteAsi, ReadDefault, A9ReadA], [IIC_iALUsir]>; // RSB
|
def :ItinRW<[WriteALUsi, ReadDefault, ReadALU], [IIC_iALUsir]>; // RSB
|
||||||
def :ItinRW<[A9WriteAsr], [IIC_iBITsr,IIC_iTSTsr,IIC_iEXTAr,IIC_iEXTAsr]>;
|
def :ItinRW<[A9WriteALUsr], [IIC_iBITsr,IIC_iTSTsr,IIC_iEXTAr,IIC_iEXTAsr]>;
|
||||||
def :ItinRW<[A9WriteAsr, A9ReadA], [IIC_iALUsr,IIC_iCMPsr]>;
|
def :ItinRW<[A9WriteALUsr, ReadALU], [IIC_iALUsr,IIC_iCMPsr]>;
|
||||||
|
|
||||||
// A9WriteHi ignored for MUL32.
|
// A9WriteHi ignored for MUL32.
|
||||||
def :ItinRW<[A9WriteM, A9WriteMHi], [IIC_iMUL32,IIC_iMAC32,
|
def :ItinRW<[A9WriteM, A9WriteMHi], [IIC_iMUL32,IIC_iMAC32,
|
||||||
|
@ -2371,7 +2365,7 @@ def :ItinRW<[A9WriteLMAdr, A9WriteLM, A9WriteIssue], [IIC_iLoad_mu,
|
||||||
IIC_iStore_m,
|
IIC_iStore_m,
|
||||||
IIC_iStore_mu]>;
|
IIC_iStore_mu]>;
|
||||||
def :ItinRW<[A9WriteLM, A9WriteLMAdr, A9WriteB], [IIC_iLoad_mBr, IIC_iPop_Br]>;
|
def :ItinRW<[A9WriteLM, A9WriteLMAdr, A9WriteB], [IIC_iLoad_mBr, IIC_iPop_Br]>;
|
||||||
def :ItinRW<[A9WriteL, A9WriteAdr, A9WriteA], [IIC_iLoadiALU]>;
|
def :ItinRW<[A9WriteL, A9WriteAdr, WriteALU], [IIC_iLoadiALU]>;
|
||||||
|
|
||||||
def :ItinRW<[A9WriteLSfp, A9WriteAdr], [IIC_fpLoad32, IIC_fpLoad64]>;
|
def :ItinRW<[A9WriteLSfp, A9WriteAdr], [IIC_fpLoad32, IIC_fpLoad64]>;
|
||||||
|
|
||||||
|
@ -2486,4 +2480,11 @@ def :ItinRW<[A9WriteV9, A9Read3, A9Read2], [IIC_VMACD, IIC_VFMACD]>;
|
||||||
def :ItinRW<[A9WriteV10, A9Read3, A9Read2], [IIC_VMACQ, IIC_VFMACQ]>;
|
def :ItinRW<[A9WriteV10, A9Read3, A9Read2], [IIC_VMACQ, IIC_VFMACQ]>;
|
||||||
def :ItinRW<[A9WriteV9, A9Read2, A9Read2], [IIC_VRECSD]>;
|
def :ItinRW<[A9WriteV9, A9Read2, A9Read2], [IIC_VRECSD]>;
|
||||||
def :ItinRW<[A9WriteV10, A9Read2, A9Read2], [IIC_VRECSQ]>;
|
def :ItinRW<[A9WriteV10, A9Read2, A9Read2], [IIC_VRECSQ]>;
|
||||||
|
|
||||||
|
// Map SchedRWs that are identical for cortexa9 to existing resources.
|
||||||
|
def : SchedAlias<WriteALUsr, A9WriteALUsr>;
|
||||||
|
def : SchedAlias<WriteALUSsr, A9WriteALUsr>;
|
||||||
|
def : SchedAlias<ReadALU, A9ReadALU>;
|
||||||
|
def : SchedAlias<ReadALUsr, A9ReadALU>;
|
||||||
|
|
||||||
} // SchedModel = CortexA9Model
|
} // SchedModel = CortexA9Model
|
||||||
|
|
|
@ -1078,8 +1078,29 @@ def SwiftModel : SchedMachineModel {
|
||||||
let IssueWidth = 3; // 3 micro-ops are dispatched per cycle.
|
let IssueWidth = 3; // 3 micro-ops are dispatched per cycle.
|
||||||
let MinLatency = 0; // Data dependencies are allowed within dispatch groups.
|
let MinLatency = 0; // Data dependencies are allowed within dispatch groups.
|
||||||
let LoadLatency = 3;
|
let LoadLatency = 3;
|
||||||
|
let MispredictPenalty = 14; // A branch direction mispredict.
|
||||||
|
|
||||||
let Itineraries = SwiftItineraries;
|
let Itineraries = SwiftItineraries;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Add Swift processor and scheduler resources.
|
// Swift resource mapping.
|
||||||
|
let SchedModel = SwiftModel in {
|
||||||
|
// Processor resources.
|
||||||
|
def SwiftUnitP01 : ProcResource<2>; // ALU unit.
|
||||||
|
def SwiftUnitP0 : ProcResource<1> { let Super = SwiftUnitP01; } // Mul unit.
|
||||||
|
def SwiftUnitP1 : ProcResource<1> { let Super = SwiftUnitP01; } // Br unit.
|
||||||
|
def SwiftUnitP2 : ProcResource<1>; // LS unit.
|
||||||
|
def SwiftUnitDiv : ProcResource<1>;
|
||||||
|
|
||||||
|
// 4.2.4 Arithmetic and Logical.
|
||||||
|
// ADC,ADD,NEG,RSB,RSC,SBC,SUB,ADR
|
||||||
|
// AND,BIC, EOR,ORN,ORR
|
||||||
|
// CLZ,RBIT,REV,REV16,REVSH,PKH
|
||||||
|
// Single cycle.
|
||||||
|
def : WriteRes<WriteALU, [SwiftUnitP01]>;
|
||||||
|
def : WriteRes<WriteALUsi, [SwiftUnitP01]>;
|
||||||
|
def : WriteRes<WriteALUsr, [SwiftUnitP01]>;
|
||||||
|
def : WriteRes<WriteALUSsr, [SwiftUnitP01]>;
|
||||||
|
def : ReadAdvance<ReadALU, 0>;
|
||||||
|
def : ReadAdvance<ReadALUsr, 2>;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue