mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178460 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
13497b3aa7
commit
55097ff567
@ -1010,7 +1010,8 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
|
||||
let isReMaterializable = 1 in {
|
||||
def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
|
||||
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> Rn;
|
||||
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,
|
||||
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> Rn;
|
||||
bits<4> Rm;
|
||||
@ -1037,7 +1039,8 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
|
||||
def rsi : AsI1<opcod, (outs GPR:$Rd),
|
||||
(ins GPR:$Rn, so_reg_imm:$shift), DPSoRegImmFrm,
|
||||
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> Rn;
|
||||
bits<12> shift;
|
||||
@ -1052,7 +1055,8 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
|
||||
def rsr : AsI1<opcod, (outs GPR:$Rd),
|
||||
(ins GPR:$Rn, so_reg_reg:$shift), DPSoRegRegFrm,
|
||||
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> Rn;
|
||||
bits<12> shift;
|
||||
@ -1079,7 +1083,8 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
|
||||
let isReMaterializable = 1 in {
|
||||
def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
|
||||
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> Rn;
|
||||
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,
|
||||
iir, opc, "\t$Rd, $Rn, $Rm",
|
||||
[/* pattern left blank */]> {
|
||||
[/* pattern left blank */]>,
|
||||
Sched<[WriteALU, ReadALU, ReadALU]> {
|
||||
bits<4> Rd;
|
||||
bits<4> Rn;
|
||||
bits<4> Rm;
|
||||
@ -1105,7 +1111,8 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
|
||||
def rsi : AsI1<opcod, (outs GPR:$Rd),
|
||||
(ins GPR:$Rn, so_reg_imm:$shift), DPSoRegImmFrm,
|
||||
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> Rn;
|
||||
bits<12> shift;
|
||||
@ -1120,7 +1127,8 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
|
||||
def rsr : AsI1<opcod, (outs GPR:$Rd),
|
||||
(ins GPR:$Rn, so_reg_reg:$shift), DPSoRegRegFrm,
|
||||
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> Rn;
|
||||
bits<12> shift;
|
||||
@ -1145,24 +1153,28 @@ multiclass AsI1_bin_s_irs<InstrItinClass iii, InstrItinClass iir,
|
||||
bit Commutable = 0> {
|
||||
def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm, pred:$p),
|
||||
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),
|
||||
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;
|
||||
}
|
||||
def rsi : ARMPseudoInst<(outs GPR:$Rd),
|
||||
(ins GPR:$Rn, so_reg_imm:$shift, pred:$p),
|
||||
4, iis,
|
||||
[(set GPR:$Rd, CPSR, (opnode GPR:$Rn,
|
||||
so_reg_imm:$shift))]>;
|
||||
so_reg_imm:$shift))]>,
|
||||
Sched<[WriteALUsi, ReadALU]>;
|
||||
|
||||
def rsr : ARMPseudoInst<(outs GPR:$Rd),
|
||||
(ins GPR:$Rn, so_reg_reg:$shift, pred:$p),
|
||||
4, iis,
|
||||
[(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> {
|
||||
def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm, pred:$p),
|
||||
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),
|
||||
(ins GPR:$Rn, so_reg_imm:$shift, pred:$p),
|
||||
4, iis,
|
||||
[(set GPR:$Rd, CPSR, (opnode so_reg_imm:$shift,
|
||||
GPR:$Rn))]>;
|
||||
GPR:$Rn))]>,
|
||||
Sched<[WriteALUsi, ReadALU]>;
|
||||
|
||||
def rsr : ARMPseudoInst<(outs GPR:$Rd),
|
||||
(ins GPR:$Rn, so_reg_reg:$shift, pred:$p),
|
||||
4, iis,
|
||||
[(set GPR:$Rd, CPSR, (opnode so_reg_reg:$shift,
|
||||
GPR:$Rn))]>;
|
||||
GPR:$Rn))]>,
|
||||
Sched<[WriteALUSsr, ReadALUsr]>;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,13 +56,20 @@
|
||||
|
||||
// Basic ALU operation.
|
||||
def WriteALU : SchedWrite;
|
||||
def ReadAdvanceALU : SchedRead;
|
||||
def ReadALU : SchedRead;
|
||||
|
||||
// Basic ALU with shifts.
|
||||
def WriteALUsi : SchedWrite; // Shift by immediate.
|
||||
def WriteALUsr : SchedWrite; // Shift by register.
|
||||
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
|
||||
|
@ -1898,6 +1898,8 @@ def CortexA9Model : SchedMachineModel {
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Define each kind of processor resource and number available.
|
||||
|
||||
let SchedModel = CortexA9Model in {
|
||||
|
||||
def A9UnitALU : ProcResource<2>;
|
||||
def A9UnitMul : ProcResource<1> { let Super = A9UnitALU; }
|
||||
def A9UnitAGU : ProcResource<1>;
|
||||
@ -1918,11 +1920,11 @@ def A9WriteI : SchedWriteRes<[A9UnitALU]>;
|
||||
def A9WriteIsr : SchedWriteRes<[A9UnitALU]> { let Latency = 2; }
|
||||
|
||||
// Basic ALU.
|
||||
def A9WriteA : SchedWriteRes<[A9UnitALU]>;
|
||||
def : WriteRes<WriteALU, [A9UnitALU]>;
|
||||
// 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.
|
||||
def A9WriteAsr : SchedWriteRes<[A9UnitALU]> { let Latency = 3; }
|
||||
def A9WriteALUsr : SchedWriteRes<[A9UnitALU]> { let Latency = 3; }
|
||||
|
||||
// Multiplication
|
||||
def A9WriteM : SchedWriteRes<[A9UnitMul, A9UnitMul]> { let Latency = 4; }
|
||||
@ -2003,13 +2005,6 @@ foreach NumCycles = 2-8 in {
|
||||
def A9WriteCycle#NumCycles : WriteSequence<[A9WriteCycle1], 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.
|
||||
foreach NumAddr = 1-8 in {
|
||||
|
||||
@ -2254,11 +2249,11 @@ def A9WriteLMfp : SchedWriteVariant<[
|
||||
// These mov immediate writers are unconditionally expanded with
|
||||
// additive latency.
|
||||
def A9WriteI2 : WriteSequence<[A9WriteI, A9WriteI]>;
|
||||
def A9WriteI2pc : WriteSequence<[A9WriteI, A9WriteI, A9WriteA]>;
|
||||
def A9WriteI2pc : WriteSequence<[A9WriteI, A9WriteI, WriteALU]>;
|
||||
def A9WriteI2ld : WriteSequence<[A9WriteI, A9WriteI, A9WriteL]>;
|
||||
|
||||
// Some ALU operations can read loaded integer values one cycle early.
|
||||
def A9ReadA : SchedReadAdvance<1,
|
||||
def A9ReadALU : SchedReadAdvance<1,
|
||||
[A9WriteL, A9WriteLHi, A9WriteLsi, A9WriteLb, A9WriteLbsi,
|
||||
A9WriteL1, A9WriteL2, A9WriteL3, A9WriteL4,
|
||||
A9WriteL5, A9WriteL6, A9WriteL7, A9WriteL8,
|
||||
@ -2279,26 +2274,25 @@ def A9Read4 : SchedReadAdvance<3>;
|
||||
|
||||
// This table follows the ARM Cortex-A9 Technical Reference Manuals,
|
||||
// mostly in order.
|
||||
let SchedModel = CortexA9Model in {
|
||||
|
||||
def :ItinRW<[A9WriteI], [IIC_iMOVi,IIC_iMOVr,IIC_iMOVsi,
|
||||
IIC_iMVNi,IIC_iMVNsi,
|
||||
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<[A9WriteI2], [IIC_iMOVix2,IIC_iCMOVix2]>;
|
||||
def :ItinRW<[A9WriteI2pc], [IIC_iMOVix2addpc]>;
|
||||
def :ItinRW<[A9WriteI2ld], [IIC_iMOVix2ld]>;
|
||||
|
||||
def :ItinRW<[A9WriteA], [IIC_iBITi,IIC_iBITr,IIC_iUNAr,IIC_iTSTi,IIC_iTSTr]>;
|
||||
def :ItinRW<[A9WriteA, A9ReadA], [IIC_iALUi, IIC_iCMPi, IIC_iCMPsi]>;
|
||||
def :ItinRW<[A9WriteA, A9ReadA, A9ReadA],[IIC_iALUr,IIC_iCMPr]>;
|
||||
def :ItinRW<[A9WriteAsi], [IIC_iBITsi,IIC_iUNAsi,IIC_iEXTr,IIC_iTSTsi]>;
|
||||
def :ItinRW<[A9WriteAsi, A9ReadA], [IIC_iALUsi]>;
|
||||
def :ItinRW<[A9WriteAsi, ReadDefault, A9ReadA], [IIC_iALUsir]>; // RSB
|
||||
def :ItinRW<[A9WriteAsr], [IIC_iBITsr,IIC_iTSTsr,IIC_iEXTAr,IIC_iEXTAsr]>;
|
||||
def :ItinRW<[A9WriteAsr, A9ReadA], [IIC_iALUsr,IIC_iCMPsr]>;
|
||||
def :ItinRW<[WriteALU], [IIC_iBITi,IIC_iBITr,IIC_iUNAr,IIC_iTSTi,IIC_iTSTr]>;
|
||||
def :ItinRW<[WriteALU, ReadALU], [IIC_iALUi, IIC_iCMPi, IIC_iCMPsi]>;
|
||||
def :ItinRW<[WriteALU, ReadALU, ReadALU],[IIC_iALUr,IIC_iCMPr]>;
|
||||
def :ItinRW<[WriteALUsi], [IIC_iBITsi,IIC_iUNAsi,IIC_iEXTr,IIC_iTSTsi]>;
|
||||
def :ItinRW<[WriteALUsi, ReadALU], [IIC_iALUsi]>;
|
||||
def :ItinRW<[WriteALUsi, ReadDefault, ReadALU], [IIC_iALUsir]>; // RSB
|
||||
def :ItinRW<[A9WriteALUsr], [IIC_iBITsr,IIC_iTSTsr,IIC_iEXTAr,IIC_iEXTAsr]>;
|
||||
def :ItinRW<[A9WriteALUsr, ReadALU], [IIC_iALUsr,IIC_iCMPsr]>;
|
||||
|
||||
// A9WriteHi ignored for MUL32.
|
||||
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_mu]>;
|
||||
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]>;
|
||||
|
||||
@ -2486,4 +2480,11 @@ def :ItinRW<[A9WriteV9, A9Read3, A9Read2], [IIC_VMACD, IIC_VFMACD]>;
|
||||
def :ItinRW<[A9WriteV10, A9Read3, A9Read2], [IIC_VMACQ, IIC_VFMACQ]>;
|
||||
def :ItinRW<[A9WriteV9, A9Read2, A9Read2], [IIC_VRECSD]>;
|
||||
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
|
||||
|
@ -1078,8 +1078,29 @@ def SwiftModel : SchedMachineModel {
|
||||
let IssueWidth = 3; // 3 micro-ops are dispatched per cycle.
|
||||
let MinLatency = 0; // Data dependencies are allowed within dispatch groups.
|
||||
let LoadLatency = 3;
|
||||
let MispredictPenalty = 14; // A branch direction mispredict.
|
||||
|
||||
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
Block a user