Skip to content

Commit 1d4c1a8

Browse files
committed
[AArch64] Define constructive EXT_ZZZI pseudo instruction
It will get expanded into MOVPRFX_ZZ and EXT_ZZI by the AArch64ExpandPseudo pass. Note this patch only defines the pseudo, it isn't used in any ISel pattern yet.
1 parent ff616a1 commit 1d4c1a8

13 files changed

+232
-16
lines changed

llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp

Lines changed: 24 additions & 4 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::DestructiveRegRegImmUnpred:
532+
// EXT_ZZZI Zd, Zs1, Zs2, Imm ==> EXT_ZZI Zds1, Zs2, Imm
533+
std::tie(DOPIdx, SrcIdx, Src2Idx) = std::make_tuple(1, 2, 3);
534+
break;
531535
default:
532536
llvm_unreachable("Unsupported Destructive Operand type");
533537
}
@@ -538,6 +542,7 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
538542
bool DOPRegIsUnique = false;
539543
switch (DType) {
540544
case AArch64::DestructiveBinary:
545+
case AArch64::DestructiveRegRegImmUnpred:
541546
DOPRegIsUnique = DstReg != MI.getOperand(SrcIdx).getReg();
542547
break;
543548
case AArch64::DestructiveBinaryComm:
@@ -639,10 +644,20 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
639644
.addImm(0);
640645
}
641646
} else if (DstReg != MI.getOperand(DOPIdx).getReg()) {
642-
assert(DOPRegIsUnique && "The destructive operand should be unique");
643-
PRFX = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(MovPrfx))
644-
.addReg(DstReg, RegState::Define)
645-
.addReg(MI.getOperand(DOPIdx).getReg(), DOPRegState);
647+
if (DOPRegIsUnique) {
648+
PRFX = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(MovPrfx))
649+
.addReg(DstReg, RegState::Define)
650+
.addReg(MI.getOperand(DOPIdx).getReg(), DOPRegState);
651+
} else {
652+
// MOVPRFX requires unique operands: Just build a COPY (Using ORR directly
653+
// as we are past PostRAPseudo expansion).
654+
assert(DType == AArch64::DestructiveRegRegImmUnpred &&
655+
"Unexpected destructive operation type");
656+
PRFX = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::ORR_ZZZ))
657+
.addReg(DstReg, RegState::Define)
658+
.addReg(MI.getOperand(DOPIdx).getReg(), DOPRegState)
659+
.addReg(MI.getOperand(DOPIdx).getReg(), DOPRegState);
660+
}
646661
DOPIdx = 0;
647662
DOPRegState = 0;
648663
}
@@ -674,6 +689,11 @@ bool AArch64ExpandPseudo::expand_DestructiveOp(
674689
.add(MI.getOperand(SrcIdx))
675690
.add(MI.getOperand(Src2Idx));
676691
break;
692+
case AArch64::DestructiveRegRegImmUnpred:
693+
DOP.addReg(MI.getOperand(DOPIdx).getReg(), DOPRegState)
694+
.add(MI.getOperand(SrcIdx))
695+
.add(MI.getOperand(Src2Idx));
696+
break;
677697
}
678698

679699
if (PRFX) {

llvm/lib/Target/AArch64/AArch64InstrFormats.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ 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+
def DestructiveRegRegImmUnpred : DestructiveInstTypeEnum<9>;
40+
def DestructiveUnaryPassthru : DestructiveInstTypeEnum<10>;
4041

4142
class FalseLanesEnum<bits<2> val> {
4243
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+
DestructiveRegRegImmUnpred = 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_ZZZI">;
1025+
1026+
def EXT_ZZZI : UnpredRegRegImmPseudo<"EXT_ZZZI", 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_ZZZI, 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_ZZZI, 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_ZZZI, 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_ZZZI, 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_ZZZI)>;
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_ZZZI, 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)