@@ -76,6 +76,35 @@ def : WriteRes<WriteIDiv32, [SiFive7PipeB, SiFive7IDiv]> {
76
76
let ResourceCycles = [1, 15];
77
77
}
78
78
79
+ // Bitmanip
80
+ let Latency = 3 in {
81
+ // Rotates are in the late-B ALU.
82
+ def : WriteRes<WriteRotateImm, [SiFive7PipeB]>;
83
+ def : WriteRes<WriteRotateImm32, [SiFive7PipeB]>;
84
+ def : WriteRes<WriteRotateReg, [SiFive7PipeB]>;
85
+ def : WriteRes<WriteRotateReg32, [SiFive7PipeB]>;
86
+
87
+ // clz[w]/ctz[w] are in the late-B ALU.
88
+ def : WriteRes<WriteCLZ, [SiFive7PipeB]>;
89
+ def : WriteRes<WriteCLZ32, [SiFive7PipeB]>;
90
+ def : WriteRes<WriteCTZ, [SiFive7PipeB]>;
91
+ def : WriteRes<WriteCTZ32, [SiFive7PipeB]>;
92
+
93
+ // cpop[w] look exactly like multiply.
94
+ def : WriteRes<WriteCPOP, [SiFive7PipeB]>;
95
+ def : WriteRes<WriteCPOP32, [SiFive7PipeB]>;
96
+
97
+ // orc.b is in the late-B ALU.
98
+ def : WriteRes<WriteORCB, [SiFive7PipeB]>;
99
+
100
+ // rev8 is in the late-A and late-B ALUs.
101
+ def : WriteRes<WriteREV8, [SiFive7PipeAB]>;
102
+
103
+ // shNadd[.uw] is on the early-B and late-B ALUs.
104
+ def : WriteRes<WriteSHXADD, [SiFive7PipeB]>;
105
+ def : WriteRes<WriteSHXADD32, [SiFive7PipeB]>;
106
+ }
107
+
79
108
// Memory
80
109
def : WriteRes<WriteSTB, [SiFive7PipeA]>;
81
110
def : WriteRes<WriteSTH, [SiFive7PipeA]>;
@@ -230,11 +259,188 @@ def : ReadAdvance<ReadFClass64, 0>;
230
259
231
260
def : ReadAdvance<ReadSFB, 0>;
232
261
262
+ // 6. Configuration-Setting Instructions
263
+ def : ReadAdvance<ReadVSETVLI, 2>;
264
+ def : ReadAdvance<ReadVSETVL, 2>;
265
+
266
+ // 7. Vector Loads and Stores
267
+ def : ReadAdvance<ReadVLDX, 0>;
268
+ def : ReadAdvance<ReadVSTX, 0>;
269
+ defm "" : LMULReadAdvance<"ReadVSTEV", 0>;
270
+ defm "" : LMULReadAdvance<"ReadVSTM", 0>;
271
+ def : ReadAdvance<ReadVLDSX, 0>;
272
+ def : ReadAdvance<ReadVSTSX, 0>;
273
+ defm "" : LMULReadAdvance<"ReadVSTS8V", 0>;
274
+ defm "" : LMULReadAdvance<"ReadVSTS16V", 0>;
275
+ defm "" : LMULReadAdvance<"ReadVSTS32V", 0>;
276
+ defm "" : LMULReadAdvance<"ReadVSTS64V", 0>;
277
+ defm "" : LMULReadAdvance<"ReadVLDUXV", 0>;
278
+ defm "" : LMULReadAdvance<"ReadVLDOXV", 0>;
279
+ defm "" : LMULReadAdvance<"ReadVSTUX8", 0>;
280
+ defm "" : LMULReadAdvance<"ReadVSTUX16", 0>;
281
+ defm "" : LMULReadAdvance<"ReadVSTUX32", 0>;
282
+ defm "" : LMULReadAdvance<"ReadVSTUX64", 0>;
283
+ defm "" : LMULReadAdvance<"ReadVSTUXV", 0>;
284
+ defm "" : LMULReadAdvance<"ReadVSTUX8V", 0>;
285
+ defm "" : LMULReadAdvance<"ReadVSTUX16V", 0>;
286
+ defm "" : LMULReadAdvance<"ReadVSTUX32V", 0>;
287
+ defm "" : LMULReadAdvance<"ReadVSTUX64V", 0>;
288
+ defm "" : LMULReadAdvance<"ReadVSTOX8", 0>;
289
+ defm "" : LMULReadAdvance<"ReadVSTOX16", 0>;
290
+ defm "" : LMULReadAdvance<"ReadVSTOX32", 0>;
291
+ defm "" : LMULReadAdvance<"ReadVSTOX64", 0>;
292
+ defm "" : LMULReadAdvance<"ReadVSTOXV", 0>;
293
+ defm "" : LMULReadAdvance<"ReadVSTOX8V", 0>;
294
+ defm "" : LMULReadAdvance<"ReadVSTOX16V", 0>;
295
+ defm "" : LMULReadAdvance<"ReadVSTOX32V", 0>;
296
+ defm "" : LMULReadAdvance<"ReadVSTOX64V", 0>;
297
+ // LMUL Aware
298
+ def : ReadAdvance<ReadVST1R, 0>;
299
+ def : ReadAdvance<ReadVST2R, 0>;
300
+ def : ReadAdvance<ReadVST4R, 0>;
301
+ def : ReadAdvance<ReadVST8R, 0>;
302
+
303
+ // 12. Vector Integer Arithmetic Instructions
304
+ defm : LMULReadAdvance<"ReadVIALUV", 0>;
305
+ defm : LMULReadAdvance<"ReadVIALUX", 0>;
306
+ defm : LMULReadAdvanceW<"ReadVIWALUV", 0>;
307
+ defm : LMULReadAdvanceW<"ReadVIWALUX", 0>;
308
+ defm : LMULReadAdvance<"ReadVExtV", 0>;
309
+ defm : LMULReadAdvance<"ReadVICALUV", 0>;
310
+ defm : LMULReadAdvance<"ReadVICALUX", 0>;
311
+ defm : LMULReadAdvance<"ReadVShiftV", 0>;
312
+ defm : LMULReadAdvance<"ReadVShiftX", 0>;
313
+ defm : LMULReadAdvanceW<"ReadVNShiftV", 0>;
314
+ defm : LMULReadAdvanceW<"ReadVNShiftX", 0>;
315
+ defm : LMULReadAdvance<"ReadVICmpV", 0>;
316
+ defm : LMULReadAdvance<"ReadVICmpX", 0>;
317
+ defm : LMULReadAdvance<"ReadVIMulV", 0>;
318
+ defm : LMULReadAdvance<"ReadVIMulX", 0>;
319
+ defm : LMULSEWReadAdvance<"ReadVIDivV", 0>;
320
+ defm : LMULSEWReadAdvance<"ReadVIDivX", 0>;
321
+ defm : LMULReadAdvanceW<"ReadVIWMulV", 0>;
322
+ defm : LMULReadAdvanceW<"ReadVIWMulX", 0>;
323
+ defm : LMULReadAdvance<"ReadVIMulAddV", 0>;
324
+ defm : LMULReadAdvance<"ReadVIMulAddX", 0>;
325
+ defm : LMULReadAdvanceW<"ReadVIWMulAddV", 0>;
326
+ defm : LMULReadAdvanceW<"ReadVIWMulAddX", 0>;
327
+ defm : LMULReadAdvance<"ReadVIMergeV", 0>;
328
+ defm : LMULReadAdvance<"ReadVIMergeX", 0>;
329
+ defm : LMULReadAdvance<"ReadVIMovV", 0>;
330
+ defm : LMULReadAdvance<"ReadVIMovX", 0>;
331
+
332
+ // 13. Vector Fixed-Point Arithmetic Instructions
333
+ defm "" : LMULReadAdvance<"ReadVSALUV", 0>;
334
+ defm "" : LMULReadAdvance<"ReadVSALUX", 0>;
335
+ defm "" : LMULReadAdvance<"ReadVAALUV", 0>;
336
+ defm "" : LMULReadAdvance<"ReadVAALUX", 0>;
337
+ defm "" : LMULReadAdvance<"ReadVSMulV", 0>;
338
+ defm "" : LMULReadAdvance<"ReadVSMulX", 0>;
339
+ defm "" : LMULReadAdvance<"ReadVSShiftV", 0>;
340
+ defm "" : LMULReadAdvance<"ReadVSShiftX", 0>;
341
+ defm "" : LMULReadAdvanceW<"ReadVNClipV", 0>;
342
+ defm "" : LMULReadAdvanceW<"ReadVNClipX", 0>;
343
+
344
+ // 14. Vector Floating-Point Instructions
345
+ defm "" : LMULReadAdvance<"ReadVFALUV", 0>;
346
+ defm "" : LMULReadAdvance<"ReadVFALUF", 0>;
347
+ defm "" : LMULReadAdvanceFW<"ReadVFWALUV", 0>;
348
+ defm "" : LMULReadAdvanceFW<"ReadVFWALUF", 0>;
349
+ defm "" : LMULReadAdvance<"ReadVFMulV", 0>;
350
+ defm "" : LMULReadAdvance<"ReadVFMulF", 0>;
351
+ defm "" : LMULSEWReadAdvanceF<"ReadVFDivV", 0>;
352
+ defm "" : LMULSEWReadAdvanceF<"ReadVFDivF", 0>;
353
+ defm "" : LMULReadAdvanceFW<"ReadVFWMulV", 0>;
354
+ defm "" : LMULReadAdvanceFW<"ReadVFWMulF", 0>;
355
+ defm "" : LMULReadAdvance<"ReadVFMulAddV", 0>;
356
+ defm "" : LMULReadAdvance<"ReadVFMulAddF", 0>;
357
+ defm "" : LMULReadAdvanceFW<"ReadVFWMulAddV", 0>;
358
+ defm "" : LMULReadAdvanceFW<"ReadVFWMulAddF", 0>;
359
+ defm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>;
360
+ defm "" : LMULReadAdvance<"ReadVFRecpV", 0>;
361
+ defm "" : LMULReadAdvance<"ReadVFCmpV", 0>;
362
+ defm "" : LMULReadAdvance<"ReadVFCmpF", 0>;
363
+ defm "" : LMULReadAdvance<"ReadVFSgnjV", 0>;
364
+ defm "" : LMULReadAdvance<"ReadVFSgnjF", 0>;
365
+ defm "" : LMULReadAdvance<"ReadVFClassV", 0>;
366
+ defm "" : LMULReadAdvance<"ReadVFMergeV", 0>;
367
+ defm "" : LMULReadAdvance<"ReadVFMergeF", 0>;
368
+ defm "" : LMULReadAdvance<"ReadVFMovF", 0>;
369
+ defm "" : LMULReadAdvance<"ReadVFCvtIToFV", 0>;
370
+ defm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>;
371
+ defm "" : LMULReadAdvanceW<"ReadVFWCvtIToFV", 0>;
372
+ defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>;
373
+ defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
374
+ defm "" : LMULReadAdvanceFW<"ReadVFNCvtIToFV", 0>;
375
+ defm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>;
376
+ defm "" : LMULReadAdvanceFW<"ReadVFNCvtFToFV", 0>;
377
+
378
+ // 15. Vector Reduction Operations
379
+ def : ReadAdvance<ReadVIRedV, 0>;
380
+ def : ReadAdvance<ReadVIRedV0, 0>;
381
+ def : ReadAdvance<ReadVIWRedV, 0>;
382
+ def : ReadAdvance<ReadVIWRedV0, 0>;
383
+ def : ReadAdvance<ReadVFRedV, 0>;
384
+ def : ReadAdvance<ReadVFRedV0, 0>;
385
+ def : ReadAdvance<ReadVFRedOV, 0>;
386
+ def : ReadAdvance<ReadVFRedOV0, 0>;
387
+ def : ReadAdvance<ReadVFWRedV, 0>;
388
+ def : ReadAdvance<ReadVFWRedV0, 0>;
389
+ def : ReadAdvance<ReadVFWRedOV, 0>;
390
+ def : ReadAdvance<ReadVFWRedOV0, 0>;
391
+
392
+ // 16. Vector Mask Instructions
393
+ defm "" : LMULReadAdvance<"ReadVMALUV", 0>;
394
+ defm "" : LMULReadAdvance<"ReadVMPopV", 0>;
395
+ defm "" : LMULReadAdvance<"ReadVMFFSV", 0>;
396
+ defm "" : LMULReadAdvance<"ReadVMSFSV", 0>;
397
+ defm "" : LMULReadAdvance<"ReadVMIotV", 0>;
398
+
399
+ // 17. Vector Permutation Instructions
400
+ defm "" : LMULReadAdvance<"ReadVIMovVX", 0>;
401
+ defm "" : LMULReadAdvance<"ReadVIMovXV", 0>;
402
+ defm "" : LMULReadAdvance<"ReadVIMovXX", 0>;
403
+ defm "" : LMULReadAdvance<"ReadVFMovVF", 0>;
404
+ defm "" : LMULReadAdvance<"ReadVFMovFV", 0>;
405
+ defm "" : LMULReadAdvance<"ReadVFMovFX", 0>;
406
+ defm "" : LMULReadAdvance<"ReadVISlideV", 0>;
407
+ defm "" : LMULReadAdvance<"ReadVISlideX", 0>;
408
+ defm "" : LMULReadAdvance<"ReadVFSlideV", 0>;
409
+ defm "" : LMULReadAdvance<"ReadVFSlideF", 0>;
410
+ defm "" : LMULSEWReadAdvance<"ReadVRGatherVV_data", 0>;
411
+ defm "" : LMULSEWReadAdvance<"ReadVRGatherVV_index", 0>;
412
+ defm "" : LMULReadAdvance<"ReadVRGatherVX_data", 0>;
413
+ defm "" : LMULReadAdvance<"ReadVRGatherVX_index", 0>;
414
+ defm "" : LMULReadAdvance<"ReadVRGatherVI_data", 0>;
415
+ defm "" : LMULSEWReadAdvance<"ReadVCompressV", 0>;
416
+ // LMUL Aware
417
+ def : ReadAdvance<ReadVMov1V, 0>;
418
+ def : ReadAdvance<ReadVMov2V, 0>;
419
+ def : ReadAdvance<ReadVMov4V, 0>;
420
+ def : ReadAdvance<ReadVMov8V, 0>;
421
+
422
+ // Others
423
+ def : ReadAdvance<ReadVMask, 0>;
424
+
425
+ // Bitmanip
426
+ def : ReadAdvance<ReadRotateImm, 0>;
427
+ def : ReadAdvance<ReadRotateImm32, 0>;
428
+ def : ReadAdvance<ReadRotateReg, 0>;
429
+ def : ReadAdvance<ReadRotateReg32, 0>;
430
+ def : ReadAdvance<ReadCLZ, 0>;
431
+ def : ReadAdvance<ReadCLZ32, 0>;
432
+ def : ReadAdvance<ReadCTZ, 0>;
433
+ def : ReadAdvance<ReadCTZ32, 0>;
434
+ def : ReadAdvance<ReadCPOP, 0>;
435
+ def : ReadAdvance<ReadCPOP32, 0>;
436
+ def : ReadAdvance<ReadORCB, 0>;
437
+ def : ReadAdvance<ReadREV8, 0>;
438
+ def : ReadAdvance<ReadSHXADD, 0>;
439
+ def : ReadAdvance<ReadSHXADD32, 0>;
440
+
233
441
//===----------------------------------------------------------------------===//
234
442
// Unsupported extensions
235
443
defm : UnsupportedSchedV;
236
- defm : UnsupportedSchedZba;
237
- defm : UnsupportedSchedZbb;
238
444
defm : UnsupportedSchedZbc;
239
445
defm : UnsupportedSchedZbs;
240
446
defm : UnsupportedSchedZbkb;
0 commit comments