Skip to content

Commit fdd2d4d

Browse files
authored
[AArch64] Define constructive EXT_ZZI pseudo instruction (#152552)
It will get expanded into MOVPRFX_ZZ and EXT_ZZI by the AArch64ExpandPseudo pass. This instruction takes a single Z register as input, as opposed to the existing destructive EXT_ZZI instruction. Note this patch only defines the pseudo, it isn't used in any ISel pattern yet. It will later be used for vector.extract.
1 parent b8d74ad commit fdd2d4d

12 files changed

+98
-12
lines changed

llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,11 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
528528
UseRev = true;
529529
}
530530
break;
531+
case AArch64::Destructive2xRegImmUnpred:
532+
// EXT_ZZI_CONSTRUCTIVE Zd, Zs, Imm
533+
// ==> MOVPRFX Zd Zs; EXT_ZZI Zd, Zd, Zs, Imm
534+
std::tie(DOPIdx, SrcIdx, Src2Idx) = std::make_tuple(1, 1, 2);
535+
break;
531536
default:
532537
llvm_unreachable("Unsupported Destructive Operand type");
533538
}
@@ -548,6 +553,7 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
548553
break;
549554
case AArch64::DestructiveUnaryPassthru:
550555
case AArch64::DestructiveBinaryImm:
556+
case AArch64::Destructive2xRegImmUnpred:
551557
DOPRegIsUnique = true;
552558
break;
553559
case AArch64::DestructiveTernaryCommWithRev:
@@ -674,6 +680,11 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
674680
.add(MI.getOperand(SrcIdx))
675681
.add(MI.getOperand(Src2Idx));
676682
break;
683+
case AArch64::Destructive2xRegImmUnpred:
684+
DOP.addReg(MI.getOperand(DOPIdx).getReg(), DOPRegState)
685+
.add(MI.getOperand(SrcIdx))
686+
.add(MI.getOperand(Src2Idx));
687+
break;
677688
}
678689

679690
if (PRFX) {

llvm/lib/Target/AArch64/AArch64InstrFormats.td

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ def DestructiveBinary : DestructiveInstTypeEnum<5>;
3636
def DestructiveBinaryComm : DestructiveInstTypeEnum<6>;
3737
def DestructiveBinaryCommWithRev : DestructiveInstTypeEnum<7>;
3838
def DestructiveTernaryCommWithRev : DestructiveInstTypeEnum<8>;
39-
def DestructiveUnaryPassthru : DestructiveInstTypeEnum<9>;
39+
40+
// 3 inputs unpredicated (reg1, reg2, imm).
41+
// Can be MOVPRFX'd iff reg1 == reg2.
42+
def Destructive2xRegImmUnpred : DestructiveInstTypeEnum<9>;
43+
44+
def DestructiveUnaryPassthru : DestructiveInstTypeEnum<10>;
4045

4146
class FalseLanesEnum<bits<2> val> {
4247
bits<2> Value = val;

llvm/lib/Target/AArch64/AArch64InstrInfo.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,8 @@ enum DestructiveInstType {
820820
DestructiveBinaryComm = TSFLAG_DESTRUCTIVE_INST_TYPE(0x6),
821821
DestructiveBinaryCommWithRev = TSFLAG_DESTRUCTIVE_INST_TYPE(0x7),
822822
DestructiveTernaryCommWithRev = TSFLAG_DESTRUCTIVE_INST_TYPE(0x8),
823-
DestructiveUnaryPassthru = TSFLAG_DESTRUCTIVE_INST_TYPE(0x9),
823+
Destructive2xRegImmUnpred = TSFLAG_DESTRUCTIVE_INST_TYPE(0x9),
824+
DestructiveUnaryPassthru = TSFLAG_DESTRUCTIVE_INST_TYPE(0xa),
824825
};
825826

826827
enum FalseLaneType {

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,9 @@ let Predicates = [HasNonStreamingSVE_or_SME2p2] in {
10211021
let Predicates = [HasSVE_or_SME] in {
10221022
defm INSR_ZR : sve_int_perm_insrs<"insr", AArch64insr>;
10231023
defm INSR_ZV : sve_int_perm_insrv<"insr", AArch64insr>;
1024-
defm EXT_ZZI : sve_int_perm_extract_i<"ext", AArch64ext>;
1024+
defm EXT_ZZI : sve_int_perm_extract_i<"ext", AArch64ext, "EXT_ZZI_CONSTRUCTIVE">;
1025+
1026+
def EXT_ZZI_CONSTRUCTIVE : UnpredRegImmPseudo<ZPR8, imm0_255>;
10251027

10261028
defm RBIT_ZPmZ : sve_int_perm_rev_rbit<"rbit", AArch64rbit_mt>;
10271029
defm REVB_ZPmZ : sve_int_perm_rev_revb<"revb", AArch64revb_mt>;

llvm/lib/Target/AArch64/AArch64SchedA320.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ def : InstRW<[CortexA320Write<3, CortexA320UnitVALU>], (instregex "^[SU]XTB_ZPmZ
847847
"^[SU]XTW_ZPmZ_[D]")>;
848848

849849
// Extract
850-
def : InstRW<[CortexA320Write<3, CortexA320UnitVALU>], (instrs EXT_ZZI, EXT_ZZI_B)>;
850+
def : InstRW<[CortexA320Write<3, CortexA320UnitVALU>], (instrs EXT_ZZI, EXT_ZZI_CONSTRUCTIVE, EXT_ZZI_B)>;
851851

852852
// Extract narrow saturating
853853
def : InstRW<[CortexA320Write<4, CortexA320UnitVALU>], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]",

llvm/lib/Target/AArch64/AArch64SchedA510.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,7 @@ def : InstRW<[CortexA510Write<3, CortexA510UnitVALU>], (instregex "^[SU]XTB_ZPmZ
825825
"^[SU]XTW_ZPmZ_[D]")>;
826826

827827
// Extract
828-
def : InstRW<[CortexA510Write<3, CortexA510UnitVALU>], (instrs EXT_ZZI, EXT_ZZI_B)>;
828+
def : InstRW<[CortexA510Write<3, CortexA510UnitVALU>], (instrs EXT_ZZI, EXT_ZZI_CONSTRUCTIVE, EXT_ZZI_B)>;
829829

830830
// Extract narrow saturating
831831
def : InstRW<[CortexA510Write<4, CortexA510UnitVALU>], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]",

llvm/lib/Target/AArch64/AArch64SchedNeoverseN2.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1785,7 +1785,7 @@ def : InstRW<[N2Write_2c_1V1], (instregex "^[SU]XTB_ZPmZ_[HSD]",
17851785
"^[SU]XTW_ZPmZ_[D]")>;
17861786

17871787
// Extract
1788-
def : InstRW<[N2Write_2c_1V], (instrs EXT_ZZI, EXT_ZZI_B)>;
1788+
def : InstRW<[N2Write_2c_1V], (instrs EXT_ZZI, EXT_ZZI_CONSTRUCTIVE, EXT_ZZI_B)>;
17891789

17901790
// Extract narrow saturating
17911791
def : InstRW<[N2Write_4c_1V1], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]$",

llvm/lib/Target/AArch64/AArch64SchedNeoverseN3.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1757,7 +1757,7 @@ def : InstRW<[N3Write_2c_1V], (instregex "^[SU]XTB_ZPmZ_[HSD]",
17571757
"^[SU]XTW_ZPmZ_[D]")>;
17581758

17591759
// Extract
1760-
def : InstRW<[N3Write_2c_1V], (instrs EXT_ZZI, EXT_ZZI_B)>;
1760+
def : InstRW<[N3Write_2c_1V], (instrs EXT_ZZI, EXT_ZZI_CONSTRUCTIVE, EXT_ZZI_B)>;
17611761

17621762
// Extract narrow saturating
17631763
def : InstRW<[N3Write_4c_1V1], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]$",

llvm/lib/Target/AArch64/AArch64SchedNeoverseV1.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1575,7 +1575,7 @@ def : InstRW<[V1Write_2c_1V1], (instregex "^[SU]XTB_ZPmZ_[HSD]",
15751575
"^[SU]XTW_ZPmZ_[D]")>;
15761576

15771577
// Extract
1578-
def : InstRW<[V1Write_2c_1V01], (instrs EXT_ZZI)>;
1578+
def : InstRW<[V1Write_2c_1V01], (instrs EXT_ZZI, EXT_ZZI_CONSTRUCTIVE)>;
15791579

15801580
// Extract/insert operation, SIMD and FP scalar form
15811581
def : InstRW<[V1Write_3c_1V1], (instregex "^LAST[AB]_VPZ_[BHSD]$",

llvm/lib/Target/AArch64/AArch64SchedNeoverseV2.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2272,7 +2272,7 @@ def : InstRW<[V2Write_2c_1V13], (instregex "^[SU]XTB_ZPmZ_[HSD]",
22722272
"^[SU]XTW_ZPmZ_[D]")>;
22732273

22742274
// Extract
2275-
def : InstRW<[V2Write_2c_1V], (instrs EXT_ZZI, EXT_ZZI_B)>;
2275+
def : InstRW<[V2Write_2c_1V], (instrs EXT_ZZI, EXT_ZZI_CONSTRUCTIVE, EXT_ZZI_B)>;
22762276

22772277
// Extract narrow saturating
22782278
def : InstRW<[V2Write_4c_1V13], (instregex "^[SU]QXTN[BT]_ZZ_[BHS]",

0 commit comments

Comments
 (0)