Skip to content

Commit 76b3377

Browse files
committed
[AArch64] Define constructive EXT_ZZI pseudo instruction
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 8de85e7 commit 76b3377

12 files changed

+97
-12
lines changed

llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,10 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
528528
UseRev = true;
529529
}
530530
break;
531+
case AArch64::Destructive2xRegImmUnpred:
532+
// EXT_ZZI_CONSTRUCTIVE Zd, Zs, Imm ==> EXT_ZZI Zds, Zds, Zds, Imm
533+
std::tie(DOPIdx, SrcIdx, Src2Idx) = std::make_tuple(1, 1, 2);
534+
break;
531535
default:
532536
llvm_unreachable("Unsupported Destructive Operand type");
533537
}
@@ -548,6 +552,7 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
548552
break;
549553
case AArch64::DestructiveUnaryPassthru:
550554
case AArch64::DestructiveBinaryImm:
555+
case AArch64::Destructive2xRegImmUnpred:
551556
DOPRegIsUnique = true;
552557
break;
553558
case AArch64::DestructiveTernaryCommWithRev:
@@ -674,6 +679,11 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
674679
.add(MI.getOperand(SrcIdx))
675680
.add(MI.getOperand(Src2Idx));
676681
break;
682+
case AArch64::Destructive2xRegImmUnpred:
683+
DOP.addReg(MI.getOperand(DOPIdx).getReg(), DOPRegState)
684+
.add(MI.getOperand(SrcIdx))
685+
.add(MI.getOperand(Src2Idx));
686+
break;
677687
}
678688

679689
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<"EXT_ZZI_CONSTRUCTIVE", 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)