@@ -74,7 +74,10 @@ def sub_gpr_odd : SubRegIndex<32, 32> {
74
74
}
75
75
} // Namespace = "RISCV"
76
76
77
- // Integer registers
77
+ //===----------------------------------------------------------------------===//
78
+ // General Purpose Registers (aka Integer Registers)
79
+ //===----------------------------------------------------------------------===//
80
+
78
81
// CostPerUse is set higher for registers that may not be compressible as they
79
82
// are not part of GPRC, the most restrictive register class used by the
80
83
// compressed instruction set. This will influence the greedy register
@@ -279,7 +282,68 @@ def SR07 : GPRRegisterClass<(add (sequence "X%u", 8, 9),
279
282
280
283
def GPRX1X5 : GPRRegisterClass<(add X1, X5)>;
281
284
282
- // Floating point registers
285
+ //===----------------------------------------------------------------------===//
286
+ // Even-Odd GPR Pairs
287
+ //===----------------------------------------------------------------------===//
288
+
289
+ def XLenPairRI : RegInfoByHwMode<
290
+ [RV32, RV64],
291
+ [RegInfo<64, 64, 32>, RegInfo<128, 128, 64>]>;
292
+
293
+ // Dummy zero register for use in the register pair containing X0 (as X1 is
294
+ // not read to or written when the X0 register pair is used).
295
+ def DUMMY_REG_PAIR_WITH_X0 : RISCVReg<0, "0">;
296
+
297
+ // Must add DUMMY_REG_PAIR_WITH_X0 to a separate register class to prevent the
298
+ // register's existence from changing codegen (due to the regPressureSetLimit
299
+ // for the GPR register class being altered).
300
+ def GPRAll : GPRRegisterClass<(add GPR, DUMMY_REG_PAIR_WITH_X0)>;
301
+
302
+ let RegAltNameIndices = [ABIRegAltName] in {
303
+ def X0_Pair : RISCVRegWithSubRegs<0, X0.AsmName,
304
+ [X0, DUMMY_REG_PAIR_WITH_X0],
305
+ X0.AltNames> {
306
+ let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
307
+ let CoveredBySubRegs = 1;
308
+ }
309
+ foreach I = 1-15 in {
310
+ defvar Index = !shl(I, 1);
311
+ defvar IndexP1 = !add(Index, 1);
312
+ defvar Reg = !cast<Register>("X"#Index);
313
+ defvar RegP1 = !cast<Register>("X"#IndexP1);
314
+ def "X" # Index #"_X" # IndexP1 : RISCVRegWithSubRegs<Index,
315
+ Reg.AsmName,
316
+ [Reg, RegP1],
317
+ Reg.AltNames> {
318
+ let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
319
+ let CoveredBySubRegs = 1;
320
+ }
321
+ }
322
+ }
323
+
324
+ let RegInfos = XLenPairRI,
325
+ DecoderMethod = "DecodeGPRPairRegisterClass" in {
326
+ def GPRPair : RISCVRegisterClass<[XLenPairFVT], 64, (add
327
+ X10_X11, X12_X13, X14_X15, X16_X17,
328
+ X6_X7,
329
+ X28_X29, X30_X31,
330
+ X8_X9,
331
+ X18_X19, X20_X21, X22_X23, X24_X25, X26_X27,
332
+ X0_Pair, X2_X3, X4_X5
333
+ )>;
334
+
335
+ def GPRPairNoX0 : RISCVRegisterClass<[XLenPairFVT], 64, (sub GPRPair, X0_Pair)>;
336
+ } // let RegInfos = XLenPairRI, DecoderMethod = "DecodeGPRPairRegisterClass"
337
+
338
+ let RegInfos = XLenPairRI in
339
+ def GPRPairC : RISCVRegisterClass<[XLenPairFVT], 64, (add
340
+ X10_X11, X12_X13, X14_X15, X8_X9
341
+ )>;
342
+
343
+ //===----------------------------------------------------------------------===//
344
+ // Floating Point registers
345
+ //===----------------------------------------------------------------------===//
346
+
283
347
let RegAltNameIndices = [ABIRegAltName] in {
284
348
def F0_H : RISCVReg16<0, "f0", ["ft0"]>, DwarfRegNum<[32]>;
285
349
def F1_H : RISCVReg16<1, "f1", ["ft1"]>, DwarfRegNum<[33]>;
@@ -373,8 +437,36 @@ def FPR64C : RISCVRegisterClass<[f64], 64, (add
373
437
(sequence "F%u_D", 8, 9)
374
438
)>;
375
439
440
+ //===----------------------------------------------------------------------===//
441
+ // GPR Classes for "H/F/D in X"
442
+ //===----------------------------------------------------------------------===//
443
+
444
+ // 16-bit GPR sub-register class used by Zhinx instructions.
445
+ def GPRF16 : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 17),
446
+ (sequence "X%u_H", 5, 7),
447
+ (sequence "X%u_H", 28, 31),
448
+ (sequence "X%u_H", 8, 9),
449
+ (sequence "X%u_H", 18, 27),
450
+ (sequence "X%u_H", 0, 4))>;
451
+ def GPRF16C : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 15),
452
+ (sequence "X%u_H", 8, 9))>;
453
+ def GPRF16NoX0 : RISCVRegisterClass<[f16], 16, (sub GPRF16, X0_H)>;
454
+
455
+ def GPRF32 : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 17),
456
+ (sequence "X%u_W", 5, 7),
457
+ (sequence "X%u_W", 28, 31),
458
+ (sequence "X%u_W", 8, 9),
459
+ (sequence "X%u_W", 18, 27),
460
+ (sequence "X%u_W", 0, 4))>;
461
+ def GPRF32C : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 15),
462
+ (sequence "X%u_W", 8, 9))>;
463
+ def GPRF32NoX0 : RISCVRegisterClass<[f32], 32, (sub GPRF32, X0_W)>;
464
+
465
+
466
+ //===----------------------------------------------------------------------===//
376
467
// Vector type mapping to LLVM types.
377
- //
468
+ //===----------------------------------------------------------------------===//
469
+
378
470
// The V vector extension requires that VLEN >= 128 and <= 65536.
379
471
// Additionally, the only supported ELEN values are 32 and 64,
380
472
// thus `vscale` can be defined as VLEN/64,
@@ -534,7 +626,10 @@ class VRegList<list<dag> LIn, int start, int nf, int lmul, bit isV0> {
534
626
!foreach(i, IndexSet<start, nf, lmul, isV0>.R, "v" # i));
535
627
}
536
628
629
+ //===----------------------------------------------------------------------===//
537
630
// Vector registers
631
+ //===----------------------------------------------------------------------===//
632
+
538
633
foreach Index = !range(0, 32, 1) in {
539
634
def V#Index : RISCVReg<Index, "v"#Index>, DwarfRegNum<[!add(Index, 96)]>;
540
635
}
@@ -652,80 +747,6 @@ def VRM8NoV0 : VReg<VM8VTs, (sub VRM8, V0M8), 8>;
652
747
653
748
def VMV0 : VReg<VMaskVTs, (add V0), 1>;
654
749
655
- // 16-bit GPR sub-register class used by Zhinx instructions.
656
- def GPRF16 : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 17),
657
- (sequence "X%u_H", 5, 7),
658
- (sequence "X%u_H", 28, 31),
659
- (sequence "X%u_H", 8, 9),
660
- (sequence "X%u_H", 18, 27),
661
- (sequence "X%u_H", 0, 4))>;
662
- def GPRF16C : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 15),
663
- (sequence "X%u_H", 8, 9))>;
664
- def GPRF16NoX0 : RISCVRegisterClass<[f16], 16, (sub GPRF16, X0_H)>;
665
-
666
- def GPRF32 : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 17),
667
- (sequence "X%u_W", 5, 7),
668
- (sequence "X%u_W", 28, 31),
669
- (sequence "X%u_W", 8, 9),
670
- (sequence "X%u_W", 18, 27),
671
- (sequence "X%u_W", 0, 4))>;
672
- def GPRF32C : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 15),
673
- (sequence "X%u_W", 8, 9))>;
674
- def GPRF32NoX0 : RISCVRegisterClass<[f32], 32, (sub GPRF32, X0_W)>;
675
-
676
- def XLenPairRI : RegInfoByHwMode<
677
- [RV32, RV64],
678
- [RegInfo<64, 64, 32>, RegInfo<128, 128, 64>]>;
679
-
680
- // Dummy zero register for use in the register pair containing X0 (as X1 is
681
- // not read to or written when the X0 register pair is used).
682
- def DUMMY_REG_PAIR_WITH_X0 : RISCVReg<0, "0">;
683
-
684
- // Must add DUMMY_REG_PAIR_WITH_X0 to a separate register class to prevent the
685
- // register's existence from changing codegen (due to the regPressureSetLimit
686
- // for the GPR register class being altered).
687
- def GPRAll : GPRRegisterClass<(add GPR, DUMMY_REG_PAIR_WITH_X0)>;
688
-
689
- let RegAltNameIndices = [ABIRegAltName] in {
690
- def X0_Pair : RISCVRegWithSubRegs<0, X0.AsmName,
691
- [X0, DUMMY_REG_PAIR_WITH_X0],
692
- X0.AltNames> {
693
- let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
694
- let CoveredBySubRegs = 1;
695
- }
696
- foreach I = 1-15 in {
697
- defvar Index = !shl(I, 1);
698
- defvar IndexP1 = !add(Index, 1);
699
- defvar Reg = !cast<Register>("X"#Index);
700
- defvar RegP1 = !cast<Register>("X"#IndexP1);
701
- def "X" # Index #"_X" # IndexP1 : RISCVRegWithSubRegs<Index,
702
- Reg.AsmName,
703
- [Reg, RegP1],
704
- Reg.AltNames> {
705
- let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
706
- let CoveredBySubRegs = 1;
707
- }
708
- }
709
- }
710
-
711
- let RegInfos = XLenPairRI,
712
- DecoderMethod = "DecodeGPRPairRegisterClass" in {
713
- def GPRPair : RISCVRegisterClass<[XLenPairFVT], 64, (add
714
- X10_X11, X12_X13, X14_X15, X16_X17,
715
- X6_X7,
716
- X28_X29, X30_X31,
717
- X8_X9,
718
- X18_X19, X20_X21, X22_X23, X24_X25, X26_X27,
719
- X0_Pair, X2_X3, X4_X5
720
- )>;
721
-
722
- def GPRPairC : RISCVRegisterClass<[XLenPairFVT], 64, (add
723
- X10_X11, X12_X13, X14_X15, X8_X9
724
- )>;
725
-
726
- def GPRPairNoX0 : RISCVRegisterClass<[XLenPairFVT], 64, (sub GPRPair, X0_Pair)>;
727
- } // let RegInfos = XLenPairRI, DecoderMethod = "DecodeGPRPairRegisterClass"
728
-
729
750
// The register class is added for inline assembly for vector mask types.
730
751
def VM : VReg<VMaskVTs, (add VR), 1>;
731
752
@@ -770,7 +791,10 @@ foreach m = LMULList in {
770
791
}
771
792
}
772
793
794
+ //===----------------------------------------------------------------------===//
773
795
// Special registers
796
+ //===----------------------------------------------------------------------===//
797
+
774
798
def FFLAGS : RISCVReg<0, "fflags">;
775
799
def FRM : RISCVReg<0, "frm">;
776
800
0 commit comments