Skip to content

Commit a46d60a

Browse files
authored
[NFC] [AArch64] Refactor predicate register class decode functions (#97412)
In a previous PR #81716, a new decoder function was added to llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp. During code review it was suggested that, as most of the decoder functions were very similar in structure, that they be refactored into a single, templated function. I have added the refactored function, removed the definitions of the replaced functions, and replaced the references to the replaced functions in AArch64Disassembler.cpp and llvm/lib/Target/AArch64/AArch64RegisterInfo.td. To reduce the number of duplicate references in AArch64RegisterInfo.td, I have also made a small change to llvm/utils/TableGen/DecoderEmitter.cpp.
1 parent d5f4f08 commit a46d60a

File tree

3 files changed

+298
-612
lines changed

3 files changed

+298
-612
lines changed

llvm/lib/Target/AArch64/AArch64RegisterInfo.td

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -160,25 +160,30 @@ def GPR64common : RegisterClass<"AArch64", [i64], 64,
160160
(add (sequence "X%u", 0, 28), FP, LR)> {
161161
let AltOrders = [(rotl GPR64common, 8)];
162162
let AltOrderSelect = [{ return 1; }];
163+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>";
163164
}
164165
// GPR register classes which exclude SP/WSP.
165166
def GPR32 : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WZR)> {
166167
let AltOrders = [(rotl GPR32, 8)];
167168
let AltOrderSelect = [{ return 1; }];
169+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>";
168170
}
169171
def GPR64 : RegisterClass<"AArch64", [i64], 64, (add GPR64common, XZR)> {
170172
let AltOrders = [(rotl GPR64, 8)];
171173
let AltOrderSelect = [{ return 1; }];
174+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>";
172175
}
173176

174177
// GPR register classes which include SP/WSP.
175178
def GPR32sp : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WSP)> {
176179
let AltOrders = [(rotl GPR32sp, 8)];
177180
let AltOrderSelect = [{ return 1; }];
181+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>";
178182
}
179183
def GPR64sp : RegisterClass<"AArch64", [i64], 64, (add GPR64common, SP)> {
180184
let AltOrders = [(rotl GPR64sp, 8)];
181185
let AltOrderSelect = [{ return 1; }];
186+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID,0, 32>";
182187
}
183188

184189
def GPR32sponly : RegisterClass<"AArch64", [i32], 32, (add WSP)>;
@@ -446,18 +451,24 @@ def Q31 : AArch64Reg<31, "q31", [D31], ["v31", ""]>, DwarfRegAlias<B31>;
446451

447452
def FPR8 : RegisterClass<"AArch64", [i8], 8, (sequence "B%u", 0, 31)> {
448453
let Size = 8;
454+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR8RegClassID, 0, 32>";
449455
}
450456
def FPR16 : RegisterClass<"AArch64", [f16, bf16, i16], 16, (sequence "H%u", 0, 31)> {
451457
let Size = 16;
458+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR16RegClassID, 0, 32>";
452459
}
453460

454461
def FPR16_lo : RegisterClass<"AArch64", [f16], 16, (trunc FPR16, 16)> {
455462
let Size = 16;
456463
}
457-
def FPR32 : RegisterClass<"AArch64", [f32, i32], 32,(sequence "S%u", 0, 31)>;
464+
def FPR32 : RegisterClass<"AArch64", [f32, i32], 32,(sequence "S%u", 0, 31)> {
465+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR32RegClassID, 0, 32>";
466+
}
458467
def FPR64 : RegisterClass<"AArch64", [f64, i64, v2f32, v1f64, v8i8, v4i16, v2i32,
459468
v1i64, v4f16, v4bf16],
460-
64, (sequence "D%u", 0, 31)>;
469+
64, (sequence "D%u", 0, 31)> {
470+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR64RegClassID, 0, 32>";
471+
}
461472
def FPR64_lo : RegisterClass<"AArch64",
462473
[v8i8, v4i16, v2i32, v1i64, v4f16, v4bf16, v2f32,
463474
v1f64],
@@ -469,21 +480,27 @@ def FPR64_lo : RegisterClass<"AArch64",
469480
def FPR128 : RegisterClass<"AArch64",
470481
[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, f128,
471482
v8f16, v8bf16],
472-
128, (sequence "Q%u", 0, 31)>;
483+
128, (sequence "Q%u", 0, 31)> {
484+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>";
485+
}
473486

474487
// The lower 16 vector registers. Some instructions can only take registers
475488
// in this range.
476489
def FPR128_lo : RegisterClass<"AArch64",
477490
[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, v8f16,
478491
v8bf16],
479-
128, (trunc FPR128, 16)>;
492+
128, (trunc FPR128, 16)> {
493+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 16>";
494+
}
480495

481496
// The lower 8 vector registers. Some instructions can only take registers
482497
// in this range.
483498
def FPR128_0to7 : RegisterClass<"AArch64",
484499
[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, v8f16,
485500
v8bf16],
486-
128, (trunc FPR128, 8)>;
501+
128, (trunc FPR128, 8)> {
502+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 8>";
503+
}
487504

488505
// Pairs, triples, and quads of 64-bit vector registers.
489506
def DSeqPairs : RegisterTuples<[dsub0, dsub1], [(rotl FPR64, 0), (rotl FPR64, 1)]>;
@@ -495,12 +512,15 @@ def DSeqQuads : RegisterTuples<[dsub0, dsub1, dsub2, dsub3],
495512
(rotl FPR64, 2), (rotl FPR64, 3)]>;
496513
def DD : RegisterClass<"AArch64", [untyped], 64, (add DSeqPairs)> {
497514
let Size = 128;
515+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::DDRegClassID, 0, 32>";
498516
}
499517
def DDD : RegisterClass<"AArch64", [untyped], 64, (add DSeqTriples)> {
500518
let Size = 192;
519+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::DDDRegClassID, 0, 32>";
501520
}
502521
def DDDD : RegisterClass<"AArch64", [untyped], 64, (add DSeqQuads)> {
503522
let Size = 256;
523+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::DDDDRegClassID, 0, 32>";
504524
}
505525

506526
// Pairs, triples, and quads of 128-bit vector registers.
@@ -513,12 +533,15 @@ def QSeqQuads : RegisterTuples<[qsub0, qsub1, qsub2, qsub3],
513533
(rotl FPR128, 2), (rotl FPR128, 3)]>;
514534
def QQ : RegisterClass<"AArch64", [untyped], 128, (add QSeqPairs)> {
515535
let Size = 256;
536+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::QQRegClassID, 0, 32>";
516537
}
517538
def QQQ : RegisterClass<"AArch64", [untyped], 128, (add QSeqTriples)> {
518539
let Size = 384;
540+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::QQQRegClassID, 0, 32>";
519541
}
520542
def QQQQ : RegisterClass<"AArch64", [untyped], 128, (add QSeqQuads)> {
521543
let Size = 512;
544+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::QQQQRegClassID, 0, 32>";
522545
}
523546

524547

@@ -904,9 +927,15 @@ class PPRClass<int firstreg, int lastreg> : RegisterClass<
904927
let Size = 16;
905928
}
906929

907-
def PPR : PPRClass<0, 15>;
908-
def PPR_3b : PPRClass<0, 7>; // Restricted 3 bit SVE predicate register class.
909-
def PPR_p8to15 : PPRClass<8, 15>;
930+
def PPR : PPRClass<0, 15> {
931+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPRRegClassID, 0, 16>";
932+
}
933+
def PPR_3b : PPRClass<0, 7> { // Restricted 3 bit SVE predicate register class.
934+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPRRegClassID, 0, 8>";
935+
}
936+
def PPR_p8to15 : PPRClass<8, 15> {
937+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PNRRegClassID, 8, 8>";
938+
}
910939

911940
class PPRAsmOperand <string name, string RegClass, int Width>: AsmOperandClass {
912941
let Name = "SVE" # name # "Reg";
@@ -941,7 +970,9 @@ class PNRClass<int firstreg, int lastreg> : RegisterClass<
941970
let Size = 16;
942971
}
943972

944-
def PNR : PNRClass<0, 15>;
973+
def PNR : PNRClass<0, 15> {
974+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PNRRegClassID, 0, 16>";
975+
}
945976
def PNR_3b : PNRClass<0, 7>;
946977
def PNR_p8to15 : PNRClass<8, 15>;
947978

@@ -982,7 +1013,7 @@ class PNRP8to15RegOp<string Suffix, AsmOperandClass C, int Width, RegisterClass
9821013
: SVERegOp<Suffix, C, ElementSizeNone, RC> {
9831014
let PrintMethod = "printPredicateAsCounter<" # Width # ">";
9841015
let EncoderMethod = "EncodePNR_p8to15";
985-
let DecoderMethod = "DecodePNR_p8to15RegisterClass";
1016+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PNRRegClassID, 8, 8>";
9861017
}
9871018

9881019
def PNRAny_p8to15 : PNRP8to15RegOp<"", PNRAsmAny_p8to15, 0, PNR_p8to15>;
@@ -1013,7 +1044,9 @@ class PPRorPNRAsmOperand<string name, string RegClass, int Width>: AsmOperandCla
10131044
let ParserMethod = "tryParseSVEPredicateOrPredicateAsCounterVector";
10141045
}
10151046

1016-
def PPRorPNR : PPRorPNRClass;
1047+
def PPRorPNR : PPRorPNRClass {
1048+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPRorPNRRegClassID, 0, 16>";
1049+
}
10171050
def PPRorPNRAsmOp8 : PPRorPNRAsmOperand<"PPRorPNRB", "PPRorPNR", 8>;
10181051
def PPRorPNRAsmOpAny : PPRorPNRAsmOperand<"PPRorPNRAny", "PPRorPNR", 0>;
10191052
def PPRorPNRAny : PPRRegOp<"", PPRorPNRAsmOpAny, ElementSizeNone, PPRorPNR>;
@@ -1024,6 +1057,7 @@ def PSeqPairs : RegisterTuples<[psub0, psub1], [(rotl PPR, 0), (rotl PPR, 1)]>;
10241057

10251058
def PPR2 : RegisterClass<"AArch64", [untyped], 16, (add PSeqPairs)> {
10261059
let Size = 32;
1060+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPR2RegClassID, 0, 16>";
10271061
}
10281062

10291063
class PPRVectorList<int ElementWidth, int NumRegs> : AsmOperandClass {
@@ -1097,9 +1131,15 @@ class ZPRClass<int lastreg> : RegisterClass<"AArch64",
10971131
let Size = 128;
10981132
}
10991133

1100-
def ZPR : ZPRClass<31>;
1101-
def ZPR_4b : ZPRClass<15>; // Restricted 4 bit SVE vector register class.
1102-
def ZPR_3b : ZPRClass<7>; // Restricted 3 bit SVE vector register class.
1134+
def ZPR : ZPRClass<31> {
1135+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 32>";
1136+
}
1137+
def ZPR_4b : ZPRClass<15> { // Restricted 4 bit SVE vector register class.
1138+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 16>";
1139+
}
1140+
def ZPR_3b : ZPRClass<7> { // Restricted 3 bit SVE vector register class.
1141+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 8>";
1142+
}
11031143

11041144
class ZPRAsmOperand<string name, int Width, string RegClassSuffix = "">
11051145
: AsmOperandClass {
@@ -1176,12 +1216,15 @@ def ZSeqQuads : RegisterTuples<[zsub0, zsub1, zsub2, zsub3], [(rotl ZPR, 0), (
11761216

11771217
def ZPR2 : RegisterClass<"AArch64", [untyped], 128, (add ZSeqPairs)> {
11781218
let Size = 256;
1219+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR2RegClassID, 0, 32>";
11791220
}
11801221
def ZPR3 : RegisterClass<"AArch64", [untyped], 128, (add ZSeqTriples)> {
11811222
let Size = 384;
1223+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR3RegClassID, 0, 32>";
11821224
}
11831225
def ZPR4 : RegisterClass<"AArch64", [untyped], 128, (add ZSeqQuads)> {
11841226
let Size = 512;
1227+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR4RegClassID, 0, 32>";
11851228
}
11861229

11871230
class ZPRVectorList<int ElementWidth, int NumRegs> : AsmOperandClass {
@@ -1379,10 +1422,12 @@ def ZStridedQuadsHi : RegisterTuples<[zsub0, zsub1, zsub2, zsub3], [
13791422
def ZPR2Strided : RegisterClass<"AArch64", [untyped], 128,
13801423
(add ZStridedPairsLo, ZStridedPairsHi)> {
13811424
let Size = 256;
1425+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR2StridedRegClassID, 0, 16>";
13821426
}
13831427
def ZPR4Strided : RegisterClass<"AArch64", [untyped], 128,
13841428
(add ZStridedQuadsLo, ZStridedQuadsHi)> {
13851429
let Size = 512;
1430+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR4StridedRegClassID, 0, 8>";
13861431
}
13871432

13881433
def ZPR2StridedOrContiguous : RegisterClass<"AArch64", [untyped], 128,
@@ -1401,7 +1446,7 @@ class ZPRVectorListStrided<int ElementWidth, int NumRegs, int Stride>
14011446
}
14021447

14031448
let EncoderMethod = "EncodeZPR2StridedRegisterClass",
1404-
DecoderMethod = "DecodeZPR2StridedRegisterClass" in {
1449+
DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR2StridedRegClassID, 0, 16>" in {
14051450
def ZZ_b_strided
14061451
: RegisterOperand<ZPR2Strided, "printTypedVectorList<0, 'b'>"> {
14071452
let ParserMatchClass = ZPRVectorListStrided<8, 2, 8>;
@@ -1439,7 +1484,7 @@ def ZPR4StridedOrContiguous : RegisterClass<"AArch64", [untyped], 128,
14391484
}
14401485

14411486
let EncoderMethod = "EncodeZPR4StridedRegisterClass",
1442-
DecoderMethod = "DecodeZPR4StridedRegisterClass" in {
1487+
DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR4StridedRegClassID, 0, 16>" in {
14431488
def ZZZZ_b_strided
14441489
: RegisterOperand<ZPR4Strided, "printTypedVectorList<0,'b'>"> {
14451490
let ParserMatchClass = ZPRVectorListStrided<8, 4, 4>;
@@ -1774,9 +1819,11 @@ def MatrixTileList : MatrixTileListOperand<>;
17741819

17751820
def MatrixIndexGPR32_8_11 : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 8, 11)> {
17761821
let DiagnosticType = "InvalidMatrixIndexGPR32_8_11";
1822+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::MatrixIndexGPR32_8_11RegClassID, 0, 4>";
17771823
}
17781824
def MatrixIndexGPR32_12_15 : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 12, 15)> {
17791825
let DiagnosticType = "InvalidMatrixIndexGPR32_12_15";
1826+
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::MatrixIndexGPR32_12_15RegClassID, 0, 4>";
17801827
}
17811828
def MatrixIndexGPR32Op8_11 : RegisterOperand<MatrixIndexGPR32_8_11> {
17821829
let EncoderMethod = "encodeMatrixIndexGPR32<AArch64::W8>";

0 commit comments

Comments
 (0)