Skip to content

Commit

Permalink
[RISCV] Add Sched classes for vector crypto instructions (#90068)
Browse files Browse the repository at this point in the history
The vector crypto instructions may have different scheduling behavior
compared to VALU operations. Instead of using scheduling resources that
describe VALU operations, we give these instructions their own
scheduling resources. This is similar to what we did for Zb* instructions.

The sifive-p670 has vector crypto, so we model behavior for these instructions
in the P600SchedModel. The numbers are based off of measurements collected
internally. These numbers are a bit old and new measurements show that they may
not be fully accurate. It is likely that we will refine these numbers in a
follow up patch(s) based on new measurements.

This PR is stacked on #89256.
  • Loading branch information
michaelmaitland committed May 3, 2024
1 parent bab1098 commit 56b8bd7
Show file tree
Hide file tree
Showing 16 changed files with 830 additions and 375 deletions.
281 changes: 215 additions & 66 deletions llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions llvm/lib/Target/RISCV/RISCVSchedRocket.td
Original file line number Diff line number Diff line change
Expand Up @@ -262,4 +262,5 @@ defm : UnsupportedSchedZfa;
defm : UnsupportedSchedZfh;
defm : UnsupportedSchedSFB;
defm : UnsupportedSchedXsfvcp;
defm : UnsupportedSchedZvk;
}
1 change: 1 addition & 0 deletions llvm/lib/Target/RISCV/RISCVSchedSiFive7.td
Original file line number Diff line number Diff line change
Expand Up @@ -1298,4 +1298,5 @@ defm : UnsupportedSchedZbc;
defm : UnsupportedSchedZbkb;
defm : UnsupportedSchedZbkx;
defm : UnsupportedSchedZfa;
defm : UnsupportedSchedZvk;
}
1 change: 1 addition & 0 deletions llvm/lib/Target/RISCV/RISCVSchedSiFiveP400.td
Original file line number Diff line number Diff line change
Expand Up @@ -367,4 +367,5 @@ defm : UnsupportedSchedSFB;
defm : UnsupportedSchedZfa;
defm : UnsupportedSchedV;
defm : UnsupportedSchedXsfvcp;
defm : UnsupportedSchedZvk;
}
92 changes: 92 additions & 0 deletions llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,62 @@ foreach mx = SchedMxList in {
}
}

// Vector Crypto
foreach mx = SchedMxList in {
defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
// Zvbb
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
defm "" : LMULWriteResMX<"WriteVBREVV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVCLZV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVCPOPV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVCTZV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVWSLLV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVWSLLX", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVWSLLI", [SiFiveP600VectorArith], mx, IsWorstCase>;
}
// Zvbc
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
defm "" : LMULWriteResMX<"WriteVCLMULV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVCLMULX", [SiFiveP600VectorArith], mx, IsWorstCase>;
}
// Zvkb
// VANDN uses WriteVIALU[V|X|I]
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
defm "" : LMULWriteResMX<"WriteVBREV8V", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVREV8V", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVRotV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVRotX", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVRotI", [SiFiveP600VectorArith], mx, IsWorstCase>;
}
// Zvkg
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
defm "" : LMULWriteResMX<"WriteVGHSHV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVGMULV", [SiFiveP600VectorArith], mx, IsWorstCase>;
}
// ZvknhaOrZvknhb
let Latency = 3, ReleaseAtCycles = [LMulLat] in {
defm "" : LMULWriteResMX<"WriteVSHA2CHV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVSHA2CLV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVSHA2MSV", [SiFiveP600VectorArith], mx, IsWorstCase>;
}
// Zvkned
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
defm "" : LMULWriteResMX<"WriteVAESMVV", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVAESKF1V", [SiFiveP600VectorArith], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVAESKF2V", [SiFiveP600VectorArith], mx, IsWorstCase>;
}
let Latency = 1, ReleaseAtCycles = [LMulLat] in
defm "" : LMULWriteResMX<"WriteVAESZV", [SiFiveP600VectorArith], mx, IsWorstCase>;
// Zvksed
let Latency = 3, ReleaseAtCycles = [LMulLat] in {
defm "" : LMULWriteResMX<"WriteVSM4KV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVSM4RV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVSM3CV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
defm "" : LMULWriteResMX<"WriteVSM3MEV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
}
}

// Others
def : WriteRes<WriteCSR, [SiFiveP600SYS]>;
def : WriteRes<WriteNop, []>;
Expand Down Expand Up @@ -1032,6 +1088,42 @@ foreach mx = SchedMxList in {
def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx # "_E" # sew), 0>;
}

// Vector Crypto Extensions
// Zvbb
defm "" : LMULReadAdvance<"ReadVBREVV", 0>;
defm "" : LMULReadAdvance<"ReadVCLZV", 0>;
defm "" : LMULReadAdvance<"ReadVCPOPV", 0>;
defm "" : LMULReadAdvance<"ReadVCTZV", 0>;
defm "" : LMULReadAdvance<"ReadVWSLLV", 0>;
defm "" : LMULReadAdvance<"ReadVWSLLX", 0>;
// Zvbc
defm "" : LMULReadAdvance<"ReadVCLMULV", 0>;
defm "" : LMULReadAdvance<"ReadVCLMULX", 0>;
// Zvkb
// VANDN uses ReadVIALU[V|X|I]
defm "" : LMULReadAdvance<"ReadVBREV8V", 0>;
defm "" : LMULReadAdvance<"ReadVREV8V", 0>;
defm "" : LMULReadAdvance<"ReadVRotV", 0>;
defm "" : LMULReadAdvance<"ReadVRotX", 0>;
// Zvkg
defm "" : LMULReadAdvance<"ReadVGHSHV", 0>;
defm "" : LMULReadAdvance<"ReadVGMULV", 0>;
// Zvknha or Zvknhb
defm "" : LMULReadAdvance<"ReadVSHA2CHV", 0>;
defm "" : LMULReadAdvance<"ReadVSHA2CLV", 0>;
defm "" : LMULReadAdvance<"ReadVSHA2MSV", 0>;
// Zvkned
defm "" : LMULReadAdvance<"ReadVAESMVV", 0>;
defm "" : LMULReadAdvance<"ReadVAESKF1V", 0>;
defm "" : LMULReadAdvance<"ReadVAESKF2V", 0>;
defm "" : LMULReadAdvance<"ReadVAESZV", 0>;
// Zvksed
defm "" : LMULReadAdvance<"ReadVSM4KV", 0>;
defm "" : LMULReadAdvance<"ReadVSM4RV", 0>;
// Zbksh
defm "" : LMULReadAdvance<"ReadVSM3CV", 0>;
defm "" : LMULReadAdvance<"ReadVSM3MEV", 0>;

//===----------------------------------------------------------------------===//
// Unsupported extensions
defm : UnsupportedSchedZabha;
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR1.td
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,5 @@ defm : UnsupportedSchedZbkx;
defm : UnsupportedSchedZfa;
defm : UnsupportedSchedZfh;
defm : UnsupportedSchedXsfvcp;
defm : UnsupportedSchedZvk;
}
1 change: 1 addition & 0 deletions llvm/lib/Target/RISCV/RISCVSchedXiangShanNanHu.td
Original file line number Diff line number Diff line change
Expand Up @@ -312,4 +312,5 @@ defm : UnsupportedSchedZfh;
defm : UnsupportedSchedSFB;
defm : UnsupportedSchedZabha;
defm : UnsupportedSchedXsfvcp;
defm : UnsupportedSchedZvk;
}
1 change: 1 addition & 0 deletions llvm/lib/Target/RISCV/RISCVSchedule.td
Original file line number Diff line number Diff line change
Expand Up @@ -297,3 +297,4 @@ def : ReadAdvance<ReadAtomicHD, 0>;
include "RISCVScheduleZb.td"
include "RISCVScheduleV.td"
include "RISCVScheduleXSf.td"
include "RISCVScheduleZvk.td"
208 changes: 208 additions & 0 deletions llvm/lib/Target/RISCV/RISCVScheduleZvk.td
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
//=== RISCVScheduleZvk.td - RISC-V Scheduling Definitions Zvk -*- 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
//
//===----------------------------------------------------------------------===//

/// Define scheduler resources associated with def operands.

/// Zvbb extension
defm "" : LMULSchedWrites<"WriteVBREVV">;
defm "" : LMULSchedWrites<"WriteVCLZV">;
defm "" : LMULSchedWrites<"WriteVCPOPV">;
defm "" : LMULSchedWrites<"WriteVCTZV">;
defm "" : LMULSchedWrites<"WriteVWSLLV">;
defm "" : LMULSchedWrites<"WriteVWSLLX">;
defm "" : LMULSchedWrites<"WriteVWSLLI">;

/// Zvbc extension
defm "" : LMULSchedWrites<"WriteVCLMULV">;
defm "" : LMULSchedWrites<"WriteVCLMULX">;

/// Zvkb extension
// VANDN uses WriteVIALU[V|X|I]
defm "" : LMULSchedWrites<"WriteVBREV8V">;
defm "" : LMULSchedWrites<"WriteVREV8V">;
defm "" : LMULSchedWrites<"WriteVRotV">;
defm "" : LMULSchedWrites<"WriteVRotX">;
defm "" : LMULSchedWrites<"WriteVRotI">;

/// Zvkg extension
defm "" : LMULSchedWrites<"WriteVGHSHV">;
defm "" : LMULSchedWrites<"WriteVGMULV">;

/// Zvknha or Zvknhb extensions
defm "" : LMULSchedWrites<"WriteVSHA2CHV">;
defm "" : LMULSchedWrites<"WriteVSHA2CLV">;
defm "" : LMULSchedWrites<"WriteVSHA2MSV">;

/// Zvkned extension
defm "" : LMULSchedWrites<"WriteVAESMVV">;
defm "" : LMULSchedWrites<"WriteVAESKF1V">;
defm "" : LMULSchedWrites<"WriteVAESKF2V">;
defm "" : LMULSchedWrites<"WriteVAESZV">;

/// Zvksed extension
defm "" : LMULSchedWrites<"WriteVSM4KV">;
defm "" : LMULSchedWrites<"WriteVSM4RV">;

/// Zvksh extension
defm "" : LMULSchedWrites<"WriteVSM3CV">;
defm "" : LMULSchedWrites<"WriteVSM3MEV">;

/// Define scheduler resources associated with use operands.
/// Zvbb extension
defm "" : LMULSchedReads<"ReadVBREVV">;
defm "" : LMULSchedReads<"ReadVCLZV">;
defm "" : LMULSchedReads<"ReadVCPOPV">;
defm "" : LMULSchedReads<"ReadVCTZV">;
defm "" : LMULSchedReads<"ReadVWSLLV">;
defm "" : LMULSchedReads<"ReadVWSLLX">;

/// Zvbc extension
defm "" : LMULSchedReads<"ReadVCLMULV">;
defm "" : LMULSchedReads<"ReadVCLMULX">;

/// Zvkb extension
// VANDN uses ReadVIALU[V|X|I]
defm "" : LMULSchedReads<"ReadVBREV8V">;
defm "" : LMULSchedReads<"ReadVREV8V">;
defm "" : LMULSchedReads<"ReadVRotV">;
defm "" : LMULSchedReads<"ReadVRotX">;

/// Zvkg extension
defm "" : LMULSchedReads<"ReadVGHSHV">;
defm "" : LMULSchedReads<"ReadVGMULV">;

/// Zvknha or Zvknhb extensions
defm "" : LMULSchedReads<"ReadVSHA2CHV">;
defm "" : LMULSchedReads<"ReadVSHA2CLV">;
defm "" : LMULSchedReads<"ReadVSHA2MSV">;

/// Zvkned extension
defm "" : LMULSchedReads<"ReadVAESMVV">;
defm "" : LMULSchedReads<"ReadVAESKF1V">;
defm "" : LMULSchedReads<"ReadVAESKF2V">;
defm "" : LMULSchedReads<"ReadVAESZV">;

/// Zvksed extension
defm "" : LMULSchedReads<"ReadVSM4KV">;
defm "" : LMULSchedReads<"ReadVSM4RV">;

/// Zvksh extension
defm "" : LMULSchedReads<"ReadVSM3CV">;
defm "" : LMULSchedReads<"ReadVSM3MEV">;

multiclass UnsupportedSchedZvbb {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVBREVV", []>;
defm "" : LMULWriteRes<"WriteVCLZV", []>;
defm "" : LMULWriteRes<"WriteVCPOPV", []>;
defm "" : LMULWriteRes<"WriteVCTZV", []>;
defm "" : LMULWriteRes<"WriteVWSLLV", []>;
defm "" : LMULWriteRes<"WriteVWSLLX", []>;
defm "" : LMULWriteRes<"WriteVWSLLI", []>;

defm "" : LMULReadAdvance<"ReadVBREVV", 0>;
defm "" : LMULReadAdvance<"ReadVCLZV", 0>;
defm "" : LMULReadAdvance<"ReadVCPOPV", 0>;
defm "" : LMULReadAdvance<"ReadVCTZV", 0>;
defm "" : LMULReadAdvance<"ReadVWSLLV", 0>;
defm "" : LMULReadAdvance<"ReadVWSLLX", 0>;
}
}

multiclass UnsupportedSchedZvbc {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVCLMULV", []>;
defm "" : LMULWriteRes<"WriteVCLMULX", []>;

defm "" : LMULReadAdvance<"ReadVCLMULV", 0>;
defm "" : LMULReadAdvance<"ReadVCLMULX", 0>;
}
}

multiclass UnsupportedSchedZvkb {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVBREV8V", []>;
defm "" : LMULWriteRes<"WriteVREV8V", []>;
defm "" : LMULWriteRes<"WriteVRotV", []>;
defm "" : LMULWriteRes<"WriteVRotX", []>;
defm "" : LMULWriteRes<"WriteVRotI", []>;

defm "" : LMULReadAdvance<"ReadVBREV8V", 0>;
defm "" : LMULReadAdvance<"ReadVREV8V", 0>;
defm "" : LMULReadAdvance<"ReadVRotV", 0>;
defm "" : LMULReadAdvance<"ReadVRotX", 0>;
}
}

multiclass UnsupportedSchedZvkg {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVGHSHV", []>;
defm "" : LMULWriteRes<"WriteVGMULV", []>;

defm "" : LMULReadAdvance<"ReadVGHSHV", 0>;
defm "" : LMULReadAdvance<"ReadVGMULV", 0>;
}
}

multiclass UnsupportedSchedZvknhaOrZvknhb {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVSHA2CHV", []>;
defm "" : LMULWriteRes<"WriteVSHA2CLV", []>;
defm "" : LMULWriteRes<"WriteVSHA2MSV", []>;

defm "" : LMULReadAdvance<"ReadVSHA2CHV", 0>;
defm "" : LMULReadAdvance<"ReadVSHA2CLV", 0>;
defm "" : LMULReadAdvance<"ReadVSHA2MSV", 0>;
}
}

multiclass UnsupportedSchedZvkned {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVAESMVV", []>;
defm "" : LMULWriteRes<"WriteVAESKF1V", []>;
defm "" : LMULWriteRes<"WriteVAESKF2V", []>;
defm "" : LMULWriteRes<"WriteVAESZV", []>;

defm "" : LMULReadAdvance<"ReadVAESMVV", 0>;
defm "" : LMULReadAdvance<"ReadVAESKF1V", 0>;
defm "" : LMULReadAdvance<"ReadVAESKF2V", 0>;
defm "" : LMULReadAdvance<"ReadVAESZV", 0>;
}
}

multiclass UnsupportedSchedZvksed {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVSM4KV", []>;
defm "" : LMULWriteRes<"WriteVSM4RV", []>;

defm "" : LMULReadAdvance<"ReadVSM4KV", 0>;
defm "" : LMULReadAdvance<"ReadVSM4RV", 0>;
}
}

multiclass UnsupportedSchedZvksh {
let Unsupported = true in {
defm "" : LMULWriteRes<"WriteVSM3CV", []>;
defm "" : LMULWriteRes<"WriteVSM3MEV", []>;

defm "" : LMULReadAdvance<"ReadVSM3CV", 0>;
defm "" : LMULReadAdvance<"ReadVSM3MEV", 0>;
}
}

// Helper class to define all RISC-V Vector Crypto extensions as unsupported
multiclass UnsupportedSchedZvk {
defm "" : UnsupportedSchedZvbb;
defm "" : UnsupportedSchedZvbc;
defm "" : UnsupportedSchedZvkb;
defm "" : UnsupportedSchedZvkg;
defm "" : UnsupportedSchedZvknhaOrZvknhb;
defm "" : UnsupportedSchedZvkned;
defm "" : UnsupportedSchedZvksed;
defm "" : UnsupportedSchedZvksh;
}
Loading

0 comments on commit 56b8bd7

Please sign in to comment.