Skip to content

Commit 56b8bd7

Browse files
[RISCV] Add Sched classes for vector crypto instructions (#90068)
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.
1 parent bab1098 commit 56b8bd7

16 files changed

+830
-375
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td

Lines changed: 215 additions & 66 deletions
Large diffs are not rendered by default.

llvm/lib/Target/RISCV/RISCVSchedRocket.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,4 +262,5 @@ defm : UnsupportedSchedZfa;
262262
defm : UnsupportedSchedZfh;
263263
defm : UnsupportedSchedSFB;
264264
defm : UnsupportedSchedXsfvcp;
265+
defm : UnsupportedSchedZvk;
265266
}

llvm/lib/Target/RISCV/RISCVSchedSiFive7.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,4 +1298,5 @@ defm : UnsupportedSchedZbc;
12981298
defm : UnsupportedSchedZbkb;
12991299
defm : UnsupportedSchedZbkx;
13001300
defm : UnsupportedSchedZfa;
1301+
defm : UnsupportedSchedZvk;
13011302
}

llvm/lib/Target/RISCV/RISCVSchedSiFiveP400.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,4 +367,5 @@ defm : UnsupportedSchedSFB;
367367
defm : UnsupportedSchedZfa;
368368
defm : UnsupportedSchedV;
369369
defm : UnsupportedSchedXsfvcp;
370+
defm : UnsupportedSchedZvk;
370371
}

llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,62 @@ foreach mx = SchedMxList in {
748748
}
749749
}
750750

751+
// Vector Crypto
752+
foreach mx = SchedMxList in {
753+
defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
754+
defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxList>.c;
755+
// Zvbb
756+
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
757+
defm "" : LMULWriteResMX<"WriteVBREVV", [SiFiveP600VectorArith], mx, IsWorstCase>;
758+
defm "" : LMULWriteResMX<"WriteVCLZV", [SiFiveP600VectorArith], mx, IsWorstCase>;
759+
defm "" : LMULWriteResMX<"WriteVCPOPV", [SiFiveP600VectorArith], mx, IsWorstCase>;
760+
defm "" : LMULWriteResMX<"WriteVCTZV", [SiFiveP600VectorArith], mx, IsWorstCase>;
761+
defm "" : LMULWriteResMX<"WriteVWSLLV", [SiFiveP600VectorArith], mx, IsWorstCase>;
762+
defm "" : LMULWriteResMX<"WriteVWSLLX", [SiFiveP600VectorArith], mx, IsWorstCase>;
763+
defm "" : LMULWriteResMX<"WriteVWSLLI", [SiFiveP600VectorArith], mx, IsWorstCase>;
764+
}
765+
// Zvbc
766+
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
767+
defm "" : LMULWriteResMX<"WriteVCLMULV", [SiFiveP600VectorArith], mx, IsWorstCase>;
768+
defm "" : LMULWriteResMX<"WriteVCLMULX", [SiFiveP600VectorArith], mx, IsWorstCase>;
769+
}
770+
// Zvkb
771+
// VANDN uses WriteVIALU[V|X|I]
772+
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
773+
defm "" : LMULWriteResMX<"WriteVBREV8V", [SiFiveP600VectorArith], mx, IsWorstCase>;
774+
defm "" : LMULWriteResMX<"WriteVREV8V", [SiFiveP600VectorArith], mx, IsWorstCase>;
775+
defm "" : LMULWriteResMX<"WriteVRotV", [SiFiveP600VectorArith], mx, IsWorstCase>;
776+
defm "" : LMULWriteResMX<"WriteVRotX", [SiFiveP600VectorArith], mx, IsWorstCase>;
777+
defm "" : LMULWriteResMX<"WriteVRotI", [SiFiveP600VectorArith], mx, IsWorstCase>;
778+
}
779+
// Zvkg
780+
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
781+
defm "" : LMULWriteResMX<"WriteVGHSHV", [SiFiveP600VectorArith], mx, IsWorstCase>;
782+
defm "" : LMULWriteResMX<"WriteVGMULV", [SiFiveP600VectorArith], mx, IsWorstCase>;
783+
}
784+
// ZvknhaOrZvknhb
785+
let Latency = 3, ReleaseAtCycles = [LMulLat] in {
786+
defm "" : LMULWriteResMX<"WriteVSHA2CHV", [SiFiveP600VectorArith], mx, IsWorstCase>;
787+
defm "" : LMULWriteResMX<"WriteVSHA2CLV", [SiFiveP600VectorArith], mx, IsWorstCase>;
788+
defm "" : LMULWriteResMX<"WriteVSHA2MSV", [SiFiveP600VectorArith], mx, IsWorstCase>;
789+
}
790+
// Zvkned
791+
let Latency = 2, ReleaseAtCycles = [LMulLat] in {
792+
defm "" : LMULWriteResMX<"WriteVAESMVV", [SiFiveP600VectorArith], mx, IsWorstCase>;
793+
defm "" : LMULWriteResMX<"WriteVAESKF1V", [SiFiveP600VectorArith], mx, IsWorstCase>;
794+
defm "" : LMULWriteResMX<"WriteVAESKF2V", [SiFiveP600VectorArith], mx, IsWorstCase>;
795+
}
796+
let Latency = 1, ReleaseAtCycles = [LMulLat] in
797+
defm "" : LMULWriteResMX<"WriteVAESZV", [SiFiveP600VectorArith], mx, IsWorstCase>;
798+
// Zvksed
799+
let Latency = 3, ReleaseAtCycles = [LMulLat] in {
800+
defm "" : LMULWriteResMX<"WriteVSM4KV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
801+
defm "" : LMULWriteResMX<"WriteVSM4RV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
802+
defm "" : LMULWriteResMX<"WriteVSM3CV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
803+
defm "" : LMULWriteResMX<"WriteVSM3MEV", [SiFiveP600VEXQ0], mx, IsWorstCase>;
804+
}
805+
}
806+
751807
// Others
752808
def : WriteRes<WriteCSR, [SiFiveP600SYS]>;
753809
def : WriteRes<WriteNop, []>;
@@ -1032,6 +1088,42 @@ foreach mx = SchedMxList in {
10321088
def : ReadAdvance<!cast<SchedRead>("ReadVMergeOp_" # mx # "_E" # sew), 0>;
10331089
}
10341090

1091+
// Vector Crypto Extensions
1092+
// Zvbb
1093+
defm "" : LMULReadAdvance<"ReadVBREVV", 0>;
1094+
defm "" : LMULReadAdvance<"ReadVCLZV", 0>;
1095+
defm "" : LMULReadAdvance<"ReadVCPOPV", 0>;
1096+
defm "" : LMULReadAdvance<"ReadVCTZV", 0>;
1097+
defm "" : LMULReadAdvance<"ReadVWSLLV", 0>;
1098+
defm "" : LMULReadAdvance<"ReadVWSLLX", 0>;
1099+
// Zvbc
1100+
defm "" : LMULReadAdvance<"ReadVCLMULV", 0>;
1101+
defm "" : LMULReadAdvance<"ReadVCLMULX", 0>;
1102+
// Zvkb
1103+
// VANDN uses ReadVIALU[V|X|I]
1104+
defm "" : LMULReadAdvance<"ReadVBREV8V", 0>;
1105+
defm "" : LMULReadAdvance<"ReadVREV8V", 0>;
1106+
defm "" : LMULReadAdvance<"ReadVRotV", 0>;
1107+
defm "" : LMULReadAdvance<"ReadVRotX", 0>;
1108+
// Zvkg
1109+
defm "" : LMULReadAdvance<"ReadVGHSHV", 0>;
1110+
defm "" : LMULReadAdvance<"ReadVGMULV", 0>;
1111+
// Zvknha or Zvknhb
1112+
defm "" : LMULReadAdvance<"ReadVSHA2CHV", 0>;
1113+
defm "" : LMULReadAdvance<"ReadVSHA2CLV", 0>;
1114+
defm "" : LMULReadAdvance<"ReadVSHA2MSV", 0>;
1115+
// Zvkned
1116+
defm "" : LMULReadAdvance<"ReadVAESMVV", 0>;
1117+
defm "" : LMULReadAdvance<"ReadVAESKF1V", 0>;
1118+
defm "" : LMULReadAdvance<"ReadVAESKF2V", 0>;
1119+
defm "" : LMULReadAdvance<"ReadVAESZV", 0>;
1120+
// Zvksed
1121+
defm "" : LMULReadAdvance<"ReadVSM4KV", 0>;
1122+
defm "" : LMULReadAdvance<"ReadVSM4RV", 0>;
1123+
// Zbksh
1124+
defm "" : LMULReadAdvance<"ReadVSM3CV", 0>;
1125+
defm "" : LMULReadAdvance<"ReadVSM3MEV", 0>;
1126+
10351127
//===----------------------------------------------------------------------===//
10361128
// Unsupported extensions
10371129
defm : UnsupportedSchedZabha;

llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR1.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,5 @@ defm : UnsupportedSchedZbkx;
213213
defm : UnsupportedSchedZfa;
214214
defm : UnsupportedSchedZfh;
215215
defm : UnsupportedSchedXsfvcp;
216+
defm : UnsupportedSchedZvk;
216217
}

llvm/lib/Target/RISCV/RISCVSchedXiangShanNanHu.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,5 @@ defm : UnsupportedSchedZfh;
312312
defm : UnsupportedSchedSFB;
313313
defm : UnsupportedSchedZabha;
314314
defm : UnsupportedSchedXsfvcp;
315+
defm : UnsupportedSchedZvk;
315316
}

llvm/lib/Target/RISCV/RISCVSchedule.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,4 @@ def : ReadAdvance<ReadAtomicHD, 0>;
297297
include "RISCVScheduleZb.td"
298298
include "RISCVScheduleV.td"
299299
include "RISCVScheduleXSf.td"
300+
include "RISCVScheduleZvk.td"
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
//=== RISCVScheduleZvk.td - RISC-V Scheduling Definitions Zvk -*- tablegen ===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
/// Define scheduler resources associated with def operands.
10+
11+
/// Zvbb extension
12+
defm "" : LMULSchedWrites<"WriteVBREVV">;
13+
defm "" : LMULSchedWrites<"WriteVCLZV">;
14+
defm "" : LMULSchedWrites<"WriteVCPOPV">;
15+
defm "" : LMULSchedWrites<"WriteVCTZV">;
16+
defm "" : LMULSchedWrites<"WriteVWSLLV">;
17+
defm "" : LMULSchedWrites<"WriteVWSLLX">;
18+
defm "" : LMULSchedWrites<"WriteVWSLLI">;
19+
20+
/// Zvbc extension
21+
defm "" : LMULSchedWrites<"WriteVCLMULV">;
22+
defm "" : LMULSchedWrites<"WriteVCLMULX">;
23+
24+
/// Zvkb extension
25+
// VANDN uses WriteVIALU[V|X|I]
26+
defm "" : LMULSchedWrites<"WriteVBREV8V">;
27+
defm "" : LMULSchedWrites<"WriteVREV8V">;
28+
defm "" : LMULSchedWrites<"WriteVRotV">;
29+
defm "" : LMULSchedWrites<"WriteVRotX">;
30+
defm "" : LMULSchedWrites<"WriteVRotI">;
31+
32+
/// Zvkg extension
33+
defm "" : LMULSchedWrites<"WriteVGHSHV">;
34+
defm "" : LMULSchedWrites<"WriteVGMULV">;
35+
36+
/// Zvknha or Zvknhb extensions
37+
defm "" : LMULSchedWrites<"WriteVSHA2CHV">;
38+
defm "" : LMULSchedWrites<"WriteVSHA2CLV">;
39+
defm "" : LMULSchedWrites<"WriteVSHA2MSV">;
40+
41+
/// Zvkned extension
42+
defm "" : LMULSchedWrites<"WriteVAESMVV">;
43+
defm "" : LMULSchedWrites<"WriteVAESKF1V">;
44+
defm "" : LMULSchedWrites<"WriteVAESKF2V">;
45+
defm "" : LMULSchedWrites<"WriteVAESZV">;
46+
47+
/// Zvksed extension
48+
defm "" : LMULSchedWrites<"WriteVSM4KV">;
49+
defm "" : LMULSchedWrites<"WriteVSM4RV">;
50+
51+
/// Zvksh extension
52+
defm "" : LMULSchedWrites<"WriteVSM3CV">;
53+
defm "" : LMULSchedWrites<"WriteVSM3MEV">;
54+
55+
/// Define scheduler resources associated with use operands.
56+
/// Zvbb extension
57+
defm "" : LMULSchedReads<"ReadVBREVV">;
58+
defm "" : LMULSchedReads<"ReadVCLZV">;
59+
defm "" : LMULSchedReads<"ReadVCPOPV">;
60+
defm "" : LMULSchedReads<"ReadVCTZV">;
61+
defm "" : LMULSchedReads<"ReadVWSLLV">;
62+
defm "" : LMULSchedReads<"ReadVWSLLX">;
63+
64+
/// Zvbc extension
65+
defm "" : LMULSchedReads<"ReadVCLMULV">;
66+
defm "" : LMULSchedReads<"ReadVCLMULX">;
67+
68+
/// Zvkb extension
69+
// VANDN uses ReadVIALU[V|X|I]
70+
defm "" : LMULSchedReads<"ReadVBREV8V">;
71+
defm "" : LMULSchedReads<"ReadVREV8V">;
72+
defm "" : LMULSchedReads<"ReadVRotV">;
73+
defm "" : LMULSchedReads<"ReadVRotX">;
74+
75+
/// Zvkg extension
76+
defm "" : LMULSchedReads<"ReadVGHSHV">;
77+
defm "" : LMULSchedReads<"ReadVGMULV">;
78+
79+
/// Zvknha or Zvknhb extensions
80+
defm "" : LMULSchedReads<"ReadVSHA2CHV">;
81+
defm "" : LMULSchedReads<"ReadVSHA2CLV">;
82+
defm "" : LMULSchedReads<"ReadVSHA2MSV">;
83+
84+
/// Zvkned extension
85+
defm "" : LMULSchedReads<"ReadVAESMVV">;
86+
defm "" : LMULSchedReads<"ReadVAESKF1V">;
87+
defm "" : LMULSchedReads<"ReadVAESKF2V">;
88+
defm "" : LMULSchedReads<"ReadVAESZV">;
89+
90+
/// Zvksed extension
91+
defm "" : LMULSchedReads<"ReadVSM4KV">;
92+
defm "" : LMULSchedReads<"ReadVSM4RV">;
93+
94+
/// Zvksh extension
95+
defm "" : LMULSchedReads<"ReadVSM3CV">;
96+
defm "" : LMULSchedReads<"ReadVSM3MEV">;
97+
98+
multiclass UnsupportedSchedZvbb {
99+
let Unsupported = true in {
100+
defm "" : LMULWriteRes<"WriteVBREVV", []>;
101+
defm "" : LMULWriteRes<"WriteVCLZV", []>;
102+
defm "" : LMULWriteRes<"WriteVCPOPV", []>;
103+
defm "" : LMULWriteRes<"WriteVCTZV", []>;
104+
defm "" : LMULWriteRes<"WriteVWSLLV", []>;
105+
defm "" : LMULWriteRes<"WriteVWSLLX", []>;
106+
defm "" : LMULWriteRes<"WriteVWSLLI", []>;
107+
108+
defm "" : LMULReadAdvance<"ReadVBREVV", 0>;
109+
defm "" : LMULReadAdvance<"ReadVCLZV", 0>;
110+
defm "" : LMULReadAdvance<"ReadVCPOPV", 0>;
111+
defm "" : LMULReadAdvance<"ReadVCTZV", 0>;
112+
defm "" : LMULReadAdvance<"ReadVWSLLV", 0>;
113+
defm "" : LMULReadAdvance<"ReadVWSLLX", 0>;
114+
}
115+
}
116+
117+
multiclass UnsupportedSchedZvbc {
118+
let Unsupported = true in {
119+
defm "" : LMULWriteRes<"WriteVCLMULV", []>;
120+
defm "" : LMULWriteRes<"WriteVCLMULX", []>;
121+
122+
defm "" : LMULReadAdvance<"ReadVCLMULV", 0>;
123+
defm "" : LMULReadAdvance<"ReadVCLMULX", 0>;
124+
}
125+
}
126+
127+
multiclass UnsupportedSchedZvkb {
128+
let Unsupported = true in {
129+
defm "" : LMULWriteRes<"WriteVBREV8V", []>;
130+
defm "" : LMULWriteRes<"WriteVREV8V", []>;
131+
defm "" : LMULWriteRes<"WriteVRotV", []>;
132+
defm "" : LMULWriteRes<"WriteVRotX", []>;
133+
defm "" : LMULWriteRes<"WriteVRotI", []>;
134+
135+
defm "" : LMULReadAdvance<"ReadVBREV8V", 0>;
136+
defm "" : LMULReadAdvance<"ReadVREV8V", 0>;
137+
defm "" : LMULReadAdvance<"ReadVRotV", 0>;
138+
defm "" : LMULReadAdvance<"ReadVRotX", 0>;
139+
}
140+
}
141+
142+
multiclass UnsupportedSchedZvkg {
143+
let Unsupported = true in {
144+
defm "" : LMULWriteRes<"WriteVGHSHV", []>;
145+
defm "" : LMULWriteRes<"WriteVGMULV", []>;
146+
147+
defm "" : LMULReadAdvance<"ReadVGHSHV", 0>;
148+
defm "" : LMULReadAdvance<"ReadVGMULV", 0>;
149+
}
150+
}
151+
152+
multiclass UnsupportedSchedZvknhaOrZvknhb {
153+
let Unsupported = true in {
154+
defm "" : LMULWriteRes<"WriteVSHA2CHV", []>;
155+
defm "" : LMULWriteRes<"WriteVSHA2CLV", []>;
156+
defm "" : LMULWriteRes<"WriteVSHA2MSV", []>;
157+
158+
defm "" : LMULReadAdvance<"ReadVSHA2CHV", 0>;
159+
defm "" : LMULReadAdvance<"ReadVSHA2CLV", 0>;
160+
defm "" : LMULReadAdvance<"ReadVSHA2MSV", 0>;
161+
}
162+
}
163+
164+
multiclass UnsupportedSchedZvkned {
165+
let Unsupported = true in {
166+
defm "" : LMULWriteRes<"WriteVAESMVV", []>;
167+
defm "" : LMULWriteRes<"WriteVAESKF1V", []>;
168+
defm "" : LMULWriteRes<"WriteVAESKF2V", []>;
169+
defm "" : LMULWriteRes<"WriteVAESZV", []>;
170+
171+
defm "" : LMULReadAdvance<"ReadVAESMVV", 0>;
172+
defm "" : LMULReadAdvance<"ReadVAESKF1V", 0>;
173+
defm "" : LMULReadAdvance<"ReadVAESKF2V", 0>;
174+
defm "" : LMULReadAdvance<"ReadVAESZV", 0>;
175+
}
176+
}
177+
178+
multiclass UnsupportedSchedZvksed {
179+
let Unsupported = true in {
180+
defm "" : LMULWriteRes<"WriteVSM4KV", []>;
181+
defm "" : LMULWriteRes<"WriteVSM4RV", []>;
182+
183+
defm "" : LMULReadAdvance<"ReadVSM4KV", 0>;
184+
defm "" : LMULReadAdvance<"ReadVSM4RV", 0>;
185+
}
186+
}
187+
188+
multiclass UnsupportedSchedZvksh {
189+
let Unsupported = true in {
190+
defm "" : LMULWriteRes<"WriteVSM3CV", []>;
191+
defm "" : LMULWriteRes<"WriteVSM3MEV", []>;
192+
193+
defm "" : LMULReadAdvance<"ReadVSM3CV", 0>;
194+
defm "" : LMULReadAdvance<"ReadVSM3MEV", 0>;
195+
}
196+
}
197+
198+
// Helper class to define all RISC-V Vector Crypto extensions as unsupported
199+
multiclass UnsupportedSchedZvk {
200+
defm "" : UnsupportedSchedZvbb;
201+
defm "" : UnsupportedSchedZvbc;
202+
defm "" : UnsupportedSchedZvkb;
203+
defm "" : UnsupportedSchedZvkg;
204+
defm "" : UnsupportedSchedZvknhaOrZvknhb;
205+
defm "" : UnsupportedSchedZvkned;
206+
defm "" : UnsupportedSchedZvksed;
207+
defm "" : UnsupportedSchedZvksh;
208+
}

0 commit comments

Comments
 (0)