@@ -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
@@ -205,14 +208,21 @@ let RegAltNameIndices = [ABIRegAltName] in {
205
208
206
209
def XLenVT : ValueTypeByHwMode<[RV32, RV64],
207
210
[i32, i64]>;
211
+ def XLenPairVT : ValueTypeByHwMode<[RV32, RV64],
212
+ [i64, i128]>;
213
+
208
214
// Allow f64 in GPR for ZDINX on RV64.
209
215
def XLenFVT : ValueTypeByHwMode<[RV64],
210
216
[f64]>;
211
217
def XLenPairFVT : ValueTypeByHwMode<[RV32],
212
218
[f64]>;
219
+
213
220
def XLenRI : RegInfoByHwMode<
214
221
[RV32, RV64],
215
222
[RegInfo<32,32,32>, RegInfo<64,64,64>]>;
223
+ def XLenPairRI : RegInfoByHwMode<
224
+ [RV32, RV64],
225
+ [RegInfo<64, 64, 32>, RegInfo<128, 128, 64>]>;
216
226
217
227
class RISCVRegisterClass<list<ValueType> regTypes, int align, dag regList>
218
228
: RegisterClass<"RISCV", regTypes, align, regList> {
@@ -279,7 +289,59 @@ def SR07 : GPRRegisterClass<(add (sequence "X%u", 8, 9),
279
289
280
290
def GPRX1X5 : GPRRegisterClass<(add X1, X5)>;
281
291
282
- // Floating point registers
292
+ //===----------------------------------------------------------------------===//
293
+ // Even-Odd GPR Pairs
294
+ //===----------------------------------------------------------------------===//
295
+
296
+ // Dummy zero register for use in the register pair containing X0 (as X1 is
297
+ // not read to or written when the X0 register pair is used).
298
+ def DUMMY_REG_PAIR_WITH_X0 : RISCVReg<0, "0">;
299
+
300
+ // Must add DUMMY_REG_PAIR_WITH_X0 to a separate register class to prevent the
301
+ // register's existence from changing codegen (due to the regPressureSetLimit
302
+ // for the GPR register class being altered).
303
+ def GPRAll : GPRRegisterClass<(add GPR, DUMMY_REG_PAIR_WITH_X0)>;
304
+
305
+ let RegAltNameIndices = [ABIRegAltName] in {
306
+ def X0_Pair : RISCVRegWithSubRegs<0, X0.AsmName,
307
+ [X0, DUMMY_REG_PAIR_WITH_X0],
308
+ X0.AltNames> {
309
+ let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
310
+ let CoveredBySubRegs = 1;
311
+ }
312
+ foreach I = 1-15 in {
313
+ defvar Index = !shl(I, 1);
314
+ defvar IndexP1 = !add(Index, 1);
315
+ defvar Reg = !cast<Register>("X"#Index);
316
+ defvar RegP1 = !cast<Register>("X"#IndexP1);
317
+ def "X" # Index #"_X" # IndexP1 : RISCVRegWithSubRegs<Index,
318
+ Reg.AsmName,
319
+ [Reg, RegP1],
320
+ Reg.AltNames> {
321
+ let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
322
+ let CoveredBySubRegs = 1;
323
+ }
324
+ }
325
+ }
326
+
327
+ let RegInfos = XLenPairRI,
328
+ DecoderMethod = "DecodeGPRPairRegisterClass" in {
329
+ def GPRPair : RISCVRegisterClass<[XLenPairVT], 64, (add
330
+ X10_X11, X12_X13, X14_X15, X16_X17,
331
+ X6_X7,
332
+ X28_X29, X30_X31,
333
+ X8_X9,
334
+ X18_X19, X20_X21, X22_X23, X24_X25, X26_X27,
335
+ X0_Pair, X2_X3, X4_X5
336
+ )>;
337
+
338
+ def GPRPairNoX0 : RISCVRegisterClass<[XLenPairVT], 64, (sub GPRPair, X0_Pair)>;
339
+ } // let RegInfos = XLenPairRI, DecoderMethod = "DecodeGPRPairRegisterClass"
340
+
341
+ //===----------------------------------------------------------------------===//
342
+ // Floating Point Registers
343
+ //===----------------------------------------------------------------------===//
344
+
283
345
let RegAltNameIndices = [ABIRegAltName] in {
284
346
def F0_H : RISCVReg16<0, "f0", ["ft0"]>, DwarfRegNum<[32]>;
285
347
def F1_H : RISCVReg16<1, "f1", ["ft1"]>, DwarfRegNum<[33]>;
@@ -373,8 +435,50 @@ def FPR64C : RISCVRegisterClass<[f64], 64, (add
373
435
(sequence "F%u_D", 8, 9)
374
436
)>;
375
437
438
+ //===----------------------------------------------------------------------===//
439
+ // GPR Classes for "H/F/D in X"
440
+ //===----------------------------------------------------------------------===//
441
+
442
+ // 16-bit GPR sub-register class used by Zhinx instructions.
443
+ def GPRF16 : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 17),
444
+ (sequence "X%u_H", 5, 7),
445
+ (sequence "X%u_H", 28, 31),
446
+ (sequence "X%u_H", 8, 9),
447
+ (sequence "X%u_H", 18, 27),
448
+ (sequence "X%u_H", 0, 4))>;
449
+ def GPRF16C : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 15),
450
+ (sequence "X%u_H", 8, 9))>;
451
+
452
+ def GPRF32 : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 17),
453
+ (sequence "X%u_W", 5, 7),
454
+ (sequence "X%u_W", 28, 31),
455
+ (sequence "X%u_W", 8, 9),
456
+ (sequence "X%u_W", 18, 27),
457
+ (sequence "X%u_W", 0, 4))>;
458
+ def GPRF32C : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 15),
459
+ (sequence "X%u_W", 8, 9))>;
460
+ def GPRF32NoX0 : RISCVRegisterClass<[f32], 32, (sub GPRF32, X0_W)>;
461
+
462
+ let DecoderMethod = "DecodeGPRPairRegisterClass" in
463
+ def GPRF64_RV32 : RISCVRegisterClass<[XLenPairFVT], 64, (add
464
+ X10_X11, X12_X13, X14_X15, X16_X17,
465
+ X6_X7,
466
+ X28_X29, X30_X31,
467
+ X8_X9,
468
+ X18_X19, X20_X21, X22_X23, X24_X25, X26_X27,
469
+ X0_Pair, X2_X3, X4_X5
470
+ )>;
471
+
472
+ def GPRF64_RV32C : RISCVRegisterClass<[XLenPairFVT], 64, (add
473
+ X10_X11, X12_X13, X14_X15, X8_X9
474
+ )>;
475
+
476
+ def GPRF64_RV32NoX0 : RISCVRegisterClass<[XLenPairFVT], 64, (sub GPRF64_RV32, X0_Pair)>;
477
+
478
+ //===----------------------------------------------------------------------===//
376
479
// Vector type mapping to LLVM types.
377
- //
480
+ //===----------------------------------------------------------------------===//
481
+
378
482
// The V vector extension requires that VLEN >= 128 and <= 65536.
379
483
// Additionally, the only supported ELEN values are 32 and 64,
380
484
// thus `vscale` can be defined as VLEN/64,
@@ -534,7 +638,10 @@ class VRegList<list<dag> LIn, int start, int nf, int lmul, bit isV0> {
534
638
!foreach(i, IndexSet<start, nf, lmul, isV0>.R, "v" # i));
535
639
}
536
640
641
+ //===----------------------------------------------------------------------===//
537
642
// Vector registers
643
+ //===----------------------------------------------------------------------===//
644
+
538
645
foreach Index = !range(0, 32, 1) in {
539
646
def V#Index : RISCVReg<Index, "v"#Index>, DwarfRegNum<[!add(Index, 96)]>;
540
647
}
@@ -652,80 +759,6 @@ def VRM8NoV0 : VReg<VM8VTs, (sub VRM8, V0M8), 8>;
652
759
653
760
def VMV0 : VReg<VMaskVTs, (add V0), 1>;
654
761
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
762
// The register class is added for inline assembly for vector mask types.
730
763
def VM : VReg<VMaskVTs, (add VR), 1>;
731
764
@@ -770,7 +803,10 @@ foreach m = LMULList in {
770
803
}
771
804
}
772
805
773
- // Special registers
806
+ //===----------------------------------------------------------------------===//
807
+ // Special Registers
808
+ //===----------------------------------------------------------------------===//
809
+
774
810
def FFLAGS : RISCVReg<0, "fflags">;
775
811
def FRM : RISCVReg<0, "frm">;
776
812
0 commit comments