diff --git a/llvm/include/llvm/Support/RISCVTargetParser.def b/llvm/include/llvm/Support/RISCVTargetParser.def index 28de6cd40132e4..e6003a4fdebb95 100644 --- a/llvm/include/llvm/Support/RISCVTargetParser.def +++ b/llvm/include/llvm/Support/RISCVTargetParser.def @@ -7,6 +7,8 @@ PROC(GENERIC_RV32, {"generic-rv32"}, FK_NONE, {""}) PROC(GENERIC_RV64, {"generic-rv64"}, FK_64BIT, {""}) PROC(ROCKET_RV32, {"rocket-rv32"}, FK_NONE, {""}) PROC(ROCKET_RV64, {"rocket-rv64"}, FK_64BIT, {""}) +PROC(BULLET_RV32, {"bullet-rv32"}, FK_NONE, {""}) +PROC(BULLET_RV64, {"bullet-rv64"}, FK_64BIT, {""}) PROC(SIFIVE_E31, {"sifive-e31"}, FK_NONE, {"rv32imac"}) PROC(SIFIVE_U54, {"sifive-u54"}, FK_64BIT, {"rv64gc"}) diff --git a/llvm/lib/Target/RISCV/RISCV.td b/llvm/lib/Target/RISCV/RISCV.td index 7b68a2c4367f8a..578b393dc879ae 100644 --- a/llvm/lib/Target/RISCV/RISCV.td +++ b/llvm/lib/Target/RISCV/RISCV.td @@ -216,6 +216,7 @@ include "RISCVCallingConv.td" include "RISCVInstrInfo.td" include "RISCVRegisterBanks.td" include "RISCVSchedRocket.td" +include "RISCVSchedBullet.td" //===----------------------------------------------------------------------===// // RISC-V processors supported. @@ -227,6 +228,9 @@ def : ProcessorModel<"generic-rv64", NoSchedModel, [Feature64Bit]>; def : ProcessorModel<"rocket-rv32", RocketModel, []>; def : ProcessorModel<"rocket-rv64", RocketModel, [Feature64Bit]>; +def : ProcessorModel<"bullet-rv32", BulletModel, []>; +def : ProcessorModel<"bullet-rv64", BulletModel, [Feature64Bit]>; + def : ProcessorModel<"sifive-e31", RocketModel, [FeatureStdExtA, FeatureStdExtC, FeatureStdExtM]>; diff --git a/llvm/lib/Target/RISCV/RISCVSchedBullet.td b/llvm/lib/Target/RISCV/RISCVSchedBullet.td new file mode 100644 index 00000000000000..32e28c25e0e17c --- /dev/null +++ b/llvm/lib/Target/RISCV/RISCVSchedBullet.td @@ -0,0 +1,224 @@ +//==- 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; +}