From 809a4483be000de293d9f1661e56ca685a5e9496 Mon Sep 17 00:00:00 2001 From: Evandro Menezes Date: Thu, 8 Oct 2020 16:20:24 -0500 Subject: [PATCH] [RISCV] Use the commercial name for scheduling model (NFC) Use the commercial name for the scheduling model for the SiFive 7 Series. --- lib/Target/RISCV/RISCV.td | 26 +-- lib/Target/RISCV/RISCVSchedBullet.td | 224 -------------------------- lib/Target/RISCV/RISCVSchedSiFive7.td | 222 +++++++++++++++++++++++++ 3 files changed, 235 insertions(+), 237 deletions(-) delete mode 100644 lib/Target/RISCV/RISCVSchedBullet.td create mode 100644 lib/Target/RISCV/RISCVSchedSiFive7.td diff --git a/lib/Target/RISCV/RISCV.td b/lib/Target/RISCV/RISCV.td index 1b2c471faac..3d942815f20 100644 --- a/lib/Target/RISCV/RISCV.td +++ b/lib/Target/RISCV/RISCV.td @@ -216,7 +216,7 @@ include "RISCVCallingConv.td" include "RISCVInstrInfo.td" include "RISCVRegisterBanks.td" include "RISCVSchedRocket.td" -include "RISCVSchedBullet.td" +include "RISCVSchedSiFive7.td" //===----------------------------------------------------------------------===// // RISC-V processors supported. @@ -228,8 +228,8 @@ def : ProcessorModel<"generic-rv64", NoSchedModel, [Feature64Bit]>; def : ProcessorModel<"rocket-rv32", RocketModel, []>; def : ProcessorModel<"rocket-rv64", RocketModel, [Feature64Bit]>; -def : ProcessorModel<"sifive-7-rv32", BulletModel, []>; -def : ProcessorModel<"sifive-7-rv64", BulletModel, [Feature64Bit]>; +def : ProcessorModel<"sifive-7-rv32", SiFive7Model, []>; +def : ProcessorModel<"sifive-7-rv64", SiFive7Model, [Feature64Bit]>; def : ProcessorModel<"sifive-e31", RocketModel, [FeatureStdExtM, FeatureStdExtA, @@ -242,17 +242,17 @@ def : ProcessorModel<"sifive-u54", RocketModel, [Feature64Bit, FeatureStdExtD, FeatureStdExtC]>; -def : ProcessorModel<"sifive-e76", BulletModel, [FeatureStdExtM, - FeatureStdExtA, - FeatureStdExtF, - FeatureStdExtC]>; +def : ProcessorModel<"sifive-e76", SiFive7Model, [FeatureStdExtM, + FeatureStdExtA, + FeatureStdExtF, + FeatureStdExtC]>; -def : ProcessorModel<"sifive-u74", BulletModel, [Feature64Bit, - FeatureStdExtM, - FeatureStdExtA, - FeatureStdExtF, - FeatureStdExtD, - FeatureStdExtC]>; +def : ProcessorModel<"sifive-u74", SiFive7Model, [Feature64Bit, + FeatureStdExtM, + FeatureStdExtA, + FeatureStdExtF, + FeatureStdExtD, + FeatureStdExtC]>; //===----------------------------------------------------------------------===// // Define the RISC-V target. diff --git a/lib/Target/RISCV/RISCVSchedBullet.td b/lib/Target/RISCV/RISCVSchedBullet.td deleted file mode 100644 index 32e28c25e0e..00000000000 --- a/lib/Target/RISCV/RISCVSchedBullet.td +++ /dev/null @@ -1,224 +0,0 @@ -//==- RISCVSchedBullet.td - Bullet Scheduling Definitions ----*- tablegen -*-=// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -// The following definitions describe the simpler per-operand machine model. -// This works with MachineScheduler. See MCSchedule.h for details. - -// Bullet machine model for scheduling and other instruction cost heuristics. -def BulletModel : SchedMachineModel { - let MicroOpBufferSize = 0; // Explicitly set to zero since Bullet is in-order. - let IssueWidth = 2; // 2 micro-ops are dispatched per cycle. - let LoadLatency = 3; - let MispredictPenalty = 3; - let CompleteModel = 0; - let UnsupportedFeatures = [HasStdExtV, HasStdExtZvamo, HasStdExtZvlsseg]; -} - -// The Bullet microarchitecure has two pipelines: A and B. -// Pipe A can handle memory, integer alu and vector operations. -// Pipe B can handle integer alu, control flow, integer multiply and divide, -// and floating point computation. -let SchedModel = BulletModel in { -let BufferSize = 0 in { -def BulletPipeA : ProcResource<1>; -def BulletPipeB : ProcResource<1>; -} - -let BufferSize = 1 in { -def BulletIDiv : ProcResource<1> { let Super = BulletPipeB; } // Int Division -def BulletFDiv : ProcResource<1> { let Super = BulletPipeB; } // FP Division/Sqrt -} - -def BulletPipeAB : ProcResGroup<[BulletPipeA, BulletPipeB]>; - -// Branching -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; - -// Integer arithmetic and logic -let Latency = 3 in { -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -} - -// Integer multiplication -let Latency = 3 in { -def : WriteRes; -def : WriteRes; -} - -// Integer division -def : WriteRes { - let Latency = 16; - let ResourceCycles = [1, 15]; -} -def : WriteRes { - let Latency = 16; - let ResourceCycles = [1, 15]; -} - -// Memory -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; - -let Latency = 3 in { -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -} - -let Latency = 2 in { -def : WriteRes; -def : WriteRes; -} - -// Atomic memory -def : WriteRes; -def : WriteRes; - -let Latency = 3 in { -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -} - -// Single precision. -let Latency = 5 in { -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -} -let Latency = 3 in { -def : WriteRes; -def : WriteRes; -} - -def : WriteRes { let Latency = 27; - let ResourceCycles = [1, 26]; } -def : WriteRes { let Latency = 27; - let ResourceCycles = [1, 26]; } - -// Double precision -let Latency = 7 in { -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -} -let Latency = 3 in { -def : WriteRes; -def : WriteRes; -} - -def : WriteRes { let Latency = 56; - let ResourceCycles = [1, 55]; } -def : WriteRes { let Latency = 56; - let ResourceCycles = [1, 55]; } - -// Conversions -let Latency = 3 in { -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; - -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -} - -// Others -def : WriteRes; -def : WriteRes; - -def : InstRW<[WriteIALU], (instrs COPY)>; - - -//===----------------------------------------------------------------------===// -// Bypass and advance -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -} diff --git a/lib/Target/RISCV/RISCVSchedSiFive7.td b/lib/Target/RISCV/RISCVSchedSiFive7.td new file mode 100644 index 00000000000..e57ba4f61b9 --- /dev/null +++ b/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -0,0 +1,222 @@ +//==- RISCVSchedSiFive7.td - SiFive7 Scheduling Definitions --*- tablegen -*-=// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// + +// SiFive7 machine model for scheduling and other instruction cost heuristics. +def SiFive7Model : SchedMachineModel { + let MicroOpBufferSize = 0; // Explicitly set to zero since SiFive7 is in-order. + let IssueWidth = 2; // 2 micro-ops are dispatched per cycle. + let LoadLatency = 3; + let MispredictPenalty = 3; + let CompleteModel = 0; + let UnsupportedFeatures = [HasStdExtV, HasStdExtZvamo, HasStdExtZvlsseg]; +} + +// The SiFive7 microarchitecure has two pipelines: A and B. +// Pipe A can handle memory, integer alu and vector operations. +// Pipe B can handle integer alu, control flow, integer multiply and divide, +// and floating point computation. +let SchedModel = SiFive7Model in { +let BufferSize = 0 in { +def SiFive7PipeA : ProcResource<1>; +def SiFive7PipeB : ProcResource<1>; +} + +let BufferSize = 1 in { +def SiFive7IDiv : ProcResource<1> { let Super = SiFive7PipeB; } // Int Division +def SiFive7FDiv : ProcResource<1> { let Super = SiFive7PipeB; } // FP Division/Sqrt +} + +def SiFive7PipeAB : ProcResGroup<[SiFive7PipeA, SiFive7PipeB]>; + +// Branching +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; + +// Integer arithmetic and logic +let Latency = 3 in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +} + +// Integer multiplication +let Latency = 3 in { +def : WriteRes; +def : WriteRes; +} + +// Integer division +def : WriteRes { + let Latency = 16; + let ResourceCycles = [1, 15]; +} +def : WriteRes { + let Latency = 16; + let ResourceCycles = [1, 15]; +} + +// Memory +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; + +let Latency = 3 in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +} + +let Latency = 2 in { +def : WriteRes; +def : WriteRes; +} + +// Atomic memory +def : WriteRes; +def : WriteRes; + +let Latency = 3 in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +} + +// Single precision. +let Latency = 5 in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +} +let Latency = 3 in { +def : WriteRes; +def : WriteRes; +} + +def : WriteRes { let Latency = 27; + let ResourceCycles = [1, 26]; } +def : WriteRes { let Latency = 27; + let ResourceCycles = [1, 26]; } + +// Double precision +let Latency = 7 in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +} +let Latency = 3 in { +def : WriteRes; +def : WriteRes; +} + +def : WriteRes { let Latency = 56; + let ResourceCycles = [1, 55]; } +def : WriteRes { let Latency = 56; + let ResourceCycles = [1, 55]; } + +// Conversions +let Latency = 3 in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; + +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +} + +// Others +def : WriteRes; +def : WriteRes; + +def : InstRW<[WriteIALU], (instrs COPY)>; + + +//===----------------------------------------------------------------------===// +// Bypass and advance +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +}