Skip to content

[AArch64] Separate PNR into its own Register Class #65306

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -974,6 +974,8 @@ bool AArch64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
RegClass = &AArch64::ZPRRegClass;
} else if (AArch64::PPRRegClass.contains(Reg)) {
RegClass = &AArch64::PPRRegClass;
} else if (AArch64::PNRRegClass.contains(Reg)) {
RegClass = &AArch64::PNRRegClass;
} else {
RegClass = &AArch64::FPR128RegClass;
AltName = AArch64::vreg;
Expand Down
52 changes: 52 additions & 0 deletions llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3668,6 +3668,39 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
return;
}

if (AArch64::PNRRegClass.contains(DestReg) &&
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add some tests for these COPYs?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added llvm/test/CodeGen/AArch64/PPRtoPNRCopy.mir and llvm/test/CodeGen/AArch64/PNRtoPPRCopy.mir

AArch64::PPRRegClass.contains(SrcReg)) {
assert((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) &&
"Unexpected predicate-as-counter register.");
// Copy from pX to pnX is a no-op
if ((DestReg.id() - AArch64::PN0) == (SrcReg.id() - AArch64::P0))
return;
MCRegister PPRDestReg = (DestReg - AArch64::PN0) + AArch64::P0;
BuildMI(MBB, I, DL, get(AArch64::ORR_PPzPP), PPRDestReg)
.addReg(SrcReg)
.addReg(SrcReg)
.addReg(SrcReg, getKillRegState(KillSrc))
.addDef(DestReg, RegState::Implicit);
return;
}

if (AArch64::PPRRegClass.contains(DestReg) &&
AArch64::PNRRegClass.contains(SrcReg)) {
assert((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) &&
"Unexpected predicate-as-counter register.");
// Copy from pnX to pX is a no-op
if ((DestReg.id() - AArch64::P0) == (SrcReg.id() - AArch64::PN0))
return;
MCRegister PNRDestReg = (DestReg - AArch64::P0) + AArch64::PN0;
MCRegister PPRSrcReg = (SrcReg - AArch64::PN0) + AArch64::P0;
BuildMI(MBB, I, DL, get(AArch64::ORR_PPzPP), DestReg)
.addReg(PPRSrcReg)
.addReg(PPRSrcReg)
.addReg(PPRSrcReg, getKillRegState(KillSrc))
.addDef(PNRDestReg, RegState::Implicit);
return;
}

// Copy a Z register by ORRing with itself.
if (AArch64::ZPRRegClass.contains(DestReg) &&
AArch64::ZPRRegClass.contains(SrcReg)) {
Expand Down Expand Up @@ -3961,6 +3994,7 @@ void AArch64InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
unsigned Opc = 0;
bool Offset = true;
MCRegister PNRReg = MCRegister::NoRegister;
unsigned StackID = TargetStackID::Default;
switch (TRI->getSpillSize(*RC)) {
case 1:
Expand All @@ -3975,6 +4009,12 @@ void AArch64InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
"Unexpected register store without SVE store instructions");
Opc = AArch64::STR_PXI;
StackID = TargetStackID::ScalableVector;
} else if (AArch64::PNRRegClass.hasSubClassEq(RC)) {
assert((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) &&
"Unexpected register store without SVE2p1 or SME2");
SrcReg = (SrcReg - AArch64::PN0) + AArch64::P0;
Opc = AArch64::STR_PXI;
StackID = TargetStackID::ScalableVector;
}
break;
case 4:
Expand Down Expand Up @@ -4081,6 +4121,8 @@ void AArch64InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,

if (Offset)
MI.addImm(0);
if (PNRReg.isValid())
MI.addDef(PNRReg, RegState::Implicit);
MI.addMemOperand(MMO);
}

Expand Down Expand Up @@ -4125,6 +4167,7 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
unsigned Opc = 0;
bool Offset = true;
unsigned StackID = TargetStackID::Default;
MCRegister PNRReg = MCRegister::NoRegister;
switch (TRI->getSpillSize(*RC)) {
case 1:
if (AArch64::FPR8RegClass.hasSubClassEq(RC))
Expand All @@ -4138,6 +4181,13 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
"Unexpected register load without SVE load instructions");
Opc = AArch64::LDR_PXI;
StackID = TargetStackID::ScalableVector;
} else if (AArch64::PNRRegClass.hasSubClassEq(RC)) {
assert((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) &&
"Unexpected register load without SVE2p1 or SME2");
PNRReg = DestReg;
DestReg = (DestReg - AArch64::PN0) + AArch64::P0;
Opc = AArch64::LDR_PXI;
StackID = TargetStackID::ScalableVector;
}
break;
case 4:
Expand Down Expand Up @@ -4244,6 +4294,8 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
.addFrameIndex(FI);
if (Offset)
MI.addImm(0);
if (PNRReg.isValid())
MI.addDef(PNRReg, RegState::Implicit);
MI.addMemOperand(MMO);
}

Expand Down
172 changes: 106 additions & 66 deletions llvm/lib/Target/AArch64/AArch64RegisterInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ let Namespace = "AArch64" in {
def zasubd1 : SubRegIndex<256>; // (16 x 16)/8 bytes = 256 bits
def zasubq0 : SubRegIndex<128>; // (16 x 16)/16 bytes = 128 bits
def zasubq1 : SubRegIndex<128>; // (16 x 16)/16 bytes = 128 bits

def psub : SubRegIndex<16>;
}

let Namespace = "AArch64" in {
Expand Down Expand Up @@ -763,23 +765,43 @@ def GPR64x8 : RegisterOperand<GPR64x8Class, "printGPR64x8"> {

//===----- END: v8.7a accelerator extension register operands -------------===//

// SVE predicate-as-counter registers
def PN0 : AArch64Reg<0, "pn0">, DwarfRegNum<[48]>;
def PN1 : AArch64Reg<1, "pn1">, DwarfRegNum<[49]>;
def PN2 : AArch64Reg<2, "pn2">, DwarfRegNum<[50]>;
def PN3 : AArch64Reg<3, "pn3">, DwarfRegNum<[51]>;
def PN4 : AArch64Reg<4, "pn4">, DwarfRegNum<[52]>;
def PN5 : AArch64Reg<5, "pn5">, DwarfRegNum<[53]>;
def PN6 : AArch64Reg<6, "pn6">, DwarfRegNum<[54]>;
def PN7 : AArch64Reg<7, "pn7">, DwarfRegNum<[55]>;
def PN8 : AArch64Reg<8, "pn8">, DwarfRegNum<[56]>;
def PN9 : AArch64Reg<9, "pn9">, DwarfRegNum<[57]>;
def PN10 : AArch64Reg<10, "pn10">, DwarfRegNum<[58]>;
def PN11 : AArch64Reg<11, "pn11">, DwarfRegNum<[59]>;
def PN12 : AArch64Reg<12, "pn12">, DwarfRegNum<[60]>;
def PN13 : AArch64Reg<13, "pn13">, DwarfRegNum<[61]>;
def PN14 : AArch64Reg<14, "pn14">, DwarfRegNum<[62]>;
def PN15 : AArch64Reg<15, "pn15">, DwarfRegNum<[63]>;

// SVE predicate registers
def P0 : AArch64Reg<0, "p0">, DwarfRegNum<[48]>;
def P1 : AArch64Reg<1, "p1">, DwarfRegNum<[49]>;
def P2 : AArch64Reg<2, "p2">, DwarfRegNum<[50]>;
def P3 : AArch64Reg<3, "p3">, DwarfRegNum<[51]>;
def P4 : AArch64Reg<4, "p4">, DwarfRegNum<[52]>;
def P5 : AArch64Reg<5, "p5">, DwarfRegNum<[53]>;
def P6 : AArch64Reg<6, "p6">, DwarfRegNum<[54]>;
def P7 : AArch64Reg<7, "p7">, DwarfRegNum<[55]>;
def P8 : AArch64Reg<8, "p8">, DwarfRegNum<[56]>;
def P9 : AArch64Reg<9, "p9">, DwarfRegNum<[57]>;
def P10 : AArch64Reg<10, "p10">, DwarfRegNum<[58]>;
def P11 : AArch64Reg<11, "p11">, DwarfRegNum<[59]>;
def P12 : AArch64Reg<12, "p12">, DwarfRegNum<[60]>;
def P13 : AArch64Reg<13, "p13">, DwarfRegNum<[61]>;
def P14 : AArch64Reg<14, "p14">, DwarfRegNum<[62]>;
def P15 : AArch64Reg<15, "p15">, DwarfRegNum<[63]>;
let SubRegIndices = [psub] in {
def P0 : AArch64Reg<0, "p0", [PN0]>, DwarfRegAlias<PN0>;
def P1 : AArch64Reg<1, "p1", [PN1]>, DwarfRegAlias<PN1>;
def P2 : AArch64Reg<2, "p2", [PN2]>, DwarfRegAlias<PN2>;
def P3 : AArch64Reg<3, "p3", [PN3]>, DwarfRegAlias<PN3>;
def P4 : AArch64Reg<4, "p4", [PN4]>, DwarfRegAlias<PN4>;
def P5 : AArch64Reg<5, "p5", [PN5]>, DwarfRegAlias<PN5>;
def P6 : AArch64Reg<6, "p6", [PN6]>, DwarfRegAlias<PN6>;
def P7 : AArch64Reg<7, "p7", [PN7]>, DwarfRegAlias<PN7>;
def P8 : AArch64Reg<8, "p8", [PN8]>, DwarfRegAlias<PN8>;
def P9 : AArch64Reg<9, "p9", [PN9]>, DwarfRegAlias<PN9>;
def P10 : AArch64Reg<10, "p10", [PN10]>, DwarfRegAlias<PN10>;
def P11 : AArch64Reg<11, "p11", [PN11]>, DwarfRegAlias<PN11>;
def P12 : AArch64Reg<12, "p12", [PN12]>, DwarfRegAlias<PN12>;
def P13 : AArch64Reg<13, "p13", [PN13]>, DwarfRegAlias<PN13>;
def P14 : AArch64Reg<14, "p14", [PN14]>, DwarfRegAlias<PN14>;
def P15 : AArch64Reg<15, "p15", [PN15]>, DwarfRegAlias<PN15>;
}

// SVE variable-size vector registers
let SubRegIndices = [zsub] in {
Expand Down Expand Up @@ -842,8 +864,6 @@ class SVERegOp <string Suffix, AsmOperandClass C,
let ParserMatchClass = C;
}

class PPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}
class ZPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}

Expand All @@ -852,7 +872,7 @@ class ZPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
// SVE predicate register classes.
class PPRClass<int firstreg, int lastreg> : RegisterClass<
"AArch64",
[ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1, aarch64svcount ], 16,
[ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1 ], 16,
(sequence "P%u", firstreg, lastreg)> {
let Size = 16;
}
Expand All @@ -870,69 +890,89 @@ class PPRAsmOperand <string name, string RegClass, int Width>: AsmOperandClass {
let ParserMethod = "tryParseSVEPredicateVector<RegKind::SVEPredicateVector>";
}

def PPRAsmOpAny : PPRAsmOperand<"PredicateAny", "PPR", 0>;
def PPRAsmOp8 : PPRAsmOperand<"PredicateB", "PPR", 8>;
def PPRAsmOp16 : PPRAsmOperand<"PredicateH", "PPR", 16>;
def PPRAsmOp32 : PPRAsmOperand<"PredicateS", "PPR", 32>;
def PPRAsmOp64 : PPRAsmOperand<"PredicateD", "PPR", 64>;

def PPRAny : PPRRegOp<"", PPRAsmOpAny, ElementSizeNone, PPR>;
def PPR8 : PPRRegOp<"b", PPRAsmOp8, ElementSizeB, PPR>;
def PPR16 : PPRRegOp<"h", PPRAsmOp16, ElementSizeH, PPR>;
def PPR32 : PPRRegOp<"s", PPRAsmOp32, ElementSizeS, PPR>;
def PPR64 : PPRRegOp<"d", PPRAsmOp64, ElementSizeD, PPR>;

def PPRAsmOpAny : PPRAsmOperand<"PredicateAny", "PPR", 0>;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment is for line 921: def PPR_p8to15 : PPRClass<8, 15>;

Is this register class still used somewhere? I thought we added this for instructions that take predicate-as-counter registers (which are passed in pn8-pn15).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sort of, It was used in c52d950 because there was no alternative PNR class to use at the time. It's probably not very useful now, unless you still want to be able to constrain the upper end of normal predicate when writing asm? Maybe its useful with some of the SVE2p1/SME2 strided/contiguous load instructions

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, if it's not used at the moment, please remove it from this patch. If it's needed in the future we can always add it later.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, just ignore my comment above. The code is already in and used in getPredicateRegisterClass for inline-asm constraints. I'm not sure if anyone will ever use this for mask-predicates, but I guess there's no need to remove that functionality.

def PPRAsmOp8 : PPRAsmOperand<"PredicateB", "PPR", 8>;
def PPRAsmOp16 : PPRAsmOperand<"PredicateH", "PPR", 16>;
def PPRAsmOp32 : PPRAsmOperand<"PredicateS", "PPR", 32>;
def PPRAsmOp64 : PPRAsmOperand<"PredicateD", "PPR", 64>;
def PPRAsmOp3bAny : PPRAsmOperand<"Predicate3bAny", "PPR_3b", 0>;

class PPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}

def PPRAny : PPRRegOp<"", PPRAsmOpAny, ElementSizeNone, PPR>;
def PPR8 : PPRRegOp<"b", PPRAsmOp8, ElementSizeB, PPR>;
def PPR16 : PPRRegOp<"h", PPRAsmOp16, ElementSizeH, PPR>;
def PPR32 : PPRRegOp<"s", PPRAsmOp32, ElementSizeS, PPR>;
def PPR64 : PPRRegOp<"d", PPRAsmOp64, ElementSizeD, PPR>;
def PPR3bAny : PPRRegOp<"", PPRAsmOp3bAny, ElementSizeNone, PPR_3b>;

class PNRClass<int firstreg, int lastreg> : RegisterClass<
"AArch64",
[ aarch64svcount ], 16,
(sequence "PN%u", firstreg, lastreg)> {
let Size = 16;
}

def PNR : PNRClass<0, 15>;
def PNR_p8to15 : PNRClass<8, 15>;

// SVE predicate-as-counter operand
class PNRAsmOperand<string name, string RegClass, int Width>
: PPRAsmOperand<name, RegClass, Width> {
class PNRAsmOperand<string name, string RegClass, int Width>: AsmOperandClass {
let Name = "SVE" # name # "Reg";
let PredicateMethod = "isSVEPredicateAsCounterRegOfWidth<"
# Width # ", " # "AArch64::"
# RegClass # "RegClassID>";
let DiagnosticType = "InvalidSVE" # name # "Reg";
let RenderMethod = "addRegOperands";
let ParserMethod = "tryParseSVEPredicateVector<RegKind::SVEPredicateAsCounter>";
}

class PNRRegOp<string Suffix, AsmOperandClass C, int EltSize, RegisterClass RC>
: PPRRegOp<Suffix, C, ElementSizeNone, RC> {
let PrintMethod = "printPredicateAsCounter<" # EltSize # ">";
let RenderMethod = "addPNRasPPRRegOperands" in {
def PNRasPPROpAny : PNRAsmOperand<"PNRasPPRPredicateAny", "PNR", 0>;
def PNRasPPROp8 : PNRAsmOperand<"PNRasPPRPredicateB", "PNR", 8>;
}

def PNRAsmOpAny: PNRAsmOperand<"PNPredicateAny", "PPR", 0>;
def PNRAsmOp8 : PNRAsmOperand<"PNPredicateB", "PPR", 8>;
def PNRAsmOp16 : PNRAsmOperand<"PNPredicateH", "PPR", 16>;
def PNRAsmOp32 : PNRAsmOperand<"PNPredicateS", "PPR", 32>;
def PNRAsmOp64 : PNRAsmOperand<"PNPredicateD", "PPR", 64>;

def PNRAny : PNRRegOp<"", PNRAsmOpAny, 0, PPR>;
def PNR8 : PNRRegOp<"b", PNRAsmOp8, 8, PPR>;
def PNR16 : PNRRegOp<"h", PNRAsmOp16, 16, PPR>;
def PNR32 : PNRRegOp<"s", PNRAsmOp32, 32, PPR>;
def PNR64 : PNRRegOp<"d", PNRAsmOp64, 64, PPR>;

class PNRP8to15RegOp<string Suffix, AsmOperandClass C, int EltSize, RegisterClass RC>
: PPRRegOp<Suffix, C, ElementSizeNone, RC> {
let PrintMethod = "printPredicateAsCounter<" # EltSize # ">";
let EncoderMethod = "EncodePPR_p8to15";
let DecoderMethod = "DecodePPR_p8to15RegisterClass";
}

def PNRAsmAny_p8to15 : PNRAsmOperand<"PNPredicateAny_p8to15", "PPR_p8to15", 0>;
def PNRAsmOp8_p8to15 : PNRAsmOperand<"PNPredicateB_p8to15", "PPR_p8to15", 8>;
def PNRAsmOp16_p8to15 : PNRAsmOperand<"PNPredicateH_p8to15", "PPR_p8to15", 16>;
def PNRAsmOp32_p8to15 : PNRAsmOperand<"PNPredicateS_p8to15", "PPR_p8to15", 32>;
def PNRAsmOp64_p8to15 : PNRAsmOperand<"PNPredicateD_p8to15", "PPR_p8to15", 64>;

def PNRAny_p8to15 : PNRP8to15RegOp<"", PNRAsmAny_p8to15, 0, PPR_p8to15>;
def PNR8_p8to15 : PNRP8to15RegOp<"b", PNRAsmOp8_p8to15, 8, PPR_p8to15>;
def PNR16_p8to15 : PNRP8to15RegOp<"h", PNRAsmOp16_p8to15, 16, PPR_p8to15>;
def PNR32_p8to15 : PNRP8to15RegOp<"s", PNRAsmOp32_p8to15, 32, PPR_p8to15>;
def PNR64_p8to15 : PNRP8to15RegOp<"d", PNRAsmOp64_p8to15, 64, PPR_p8to15>;
class PNRasPPRRegOp<string Suffix, AsmOperandClass C, ElementSizeEnum Size,
RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}

def PNRasPPRAny : PNRasPPRRegOp<"", PNRasPPROpAny, ElementSizeNone, PPR>;
def PNRasPPR8 : PNRasPPRRegOp<"b", PNRasPPROp8, ElementSizeB, PPR>;

def PNRAsmOpAny: PNRAsmOperand<"PNPredicateAny", "PNR", 0>;
def PNRAsmOp8 : PNRAsmOperand<"PNPredicateB", "PNR", 8>;
def PNRAsmOp16 : PNRAsmOperand<"PNPredicateH", "PNR", 16>;
def PNRAsmOp32 : PNRAsmOperand<"PNPredicateS", "PNR", 32>;
def PNRAsmOp64 : PNRAsmOperand<"PNPredicateD", "PNR", 64>;

class PNRRegOp<string Suffix, AsmOperandClass C, int Size, RegisterClass RC>
: SVERegOp<Suffix, C, ElementSizeNone, RC> {
let PrintMethod = "printPredicateAsCounter<" # Size # ">";
}
def PNRAny : PNRRegOp<"", PNRAsmOpAny, 0, PNR>;
def PNR8 : PNRRegOp<"b", PNRAsmOp8, 8, PNR>;
def PNR16 : PNRRegOp<"h", PNRAsmOp16, 16, PNR>;
def PNR32 : PNRRegOp<"s", PNRAsmOp32, 32, PNR>;
def PNR64 : PNRRegOp<"d", PNRAsmOp64, 64, PNR>;

def PNRAsmAny_p8to15 : PNRAsmOperand<"PNPredicateAny_p8to15", "PNR_p8to15", 0>;
def PNRAsmOp8_p8to15 : PNRAsmOperand<"PNPredicateB_p8to15", "PNR_p8to15", 8>;
def PNRAsmOp16_p8to15 : PNRAsmOperand<"PNPredicateH_p8to15", "PNR_p8to15", 16>;
def PNRAsmOp32_p8to15 : PNRAsmOperand<"PNPredicateS_p8to15", "PNR_p8to15", 32>;
def PNRAsmOp64_p8to15 : PNRAsmOperand<"PNPredicateD_p8to15", "PNR_p8to15", 64>;

class PNRP8to15RegOp<string Suffix, AsmOperandClass C, int Width, RegisterClass RC>
: SVERegOp<Suffix, C, ElementSizeNone, RC> {
let PrintMethod = "printPredicateAsCounter<" # Width # ">";
let EncoderMethod = "EncodePNR_p8to15";
let DecoderMethod = "DecodePNR_p8to15RegisterClass";
}

def PNRAny_p8to15 : PNRP8to15RegOp<"", PNRAsmAny_p8to15, 0, PNR_p8to15>;
def PNR8_p8to15 : PNRP8to15RegOp<"b", PNRAsmOp8_p8to15, 8, PNR_p8to15>;
def PNR16_p8to15 : PNRP8to15RegOp<"h", PNRAsmOp16_p8to15, 16, PNR_p8to15>;
def PNR32_p8to15 : PNRP8to15RegOp<"s", PNRAsmOp32_p8to15, 32, PNR_p8to15>;
def PNR64_p8to15 : PNRP8to15RegOp<"d", PNRAsmOp64_p8to15, 64, PNR_p8to15>;

let Namespace = "AArch64" in {
def psub0 : SubRegIndex<16, -1>;
Expand Down
24 changes: 12 additions & 12 deletions llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -2544,8 +2544,8 @@ let Predicates = [HasSVEorSME] in {
def : Pat<(nxv4f32 (bitconvert (nxv8bf16 ZPR:$src))), (nxv4f32 ZPR:$src)>;
def : Pat<(nxv2f64 (bitconvert (nxv8bf16 ZPR:$src))), (nxv2f64 ZPR:$src)>;

def : Pat<(nxv16i1 (bitconvert (aarch64svcount PPR:$src))), (nxv16i1 PPR:$src)>;
def : Pat<(aarch64svcount (bitconvert (nxv16i1 PPR:$src))), (aarch64svcount PPR:$src)>;
def : Pat<(nxv16i1 (bitconvert (aarch64svcount PNR:$src))), (nxv16i1 PPR:$src)>;
def : Pat<(aarch64svcount (bitconvert (nxv16i1 PPR:$src))), (aarch64svcount PNR:$src)>;
}

// These allow casting from/to unpacked predicate types.
Expand Down Expand Up @@ -3852,9 +3852,9 @@ defm STNT1D_4Z_IMM : sve2p1_mem_cst_si_4z<"stnt1d", 0b11, 0b1, ZZZZ_d_mul_r>;
multiclass store_pn_x2<ValueType Ty, SDPatternOperator Store,
Instruction RegImmInst> {
def : Pat<(Store (Ty ZPR:$vec0), (Ty ZPR:$vec1),
(aarch64svcount PPR:$PNg), GPR64:$base),
(aarch64svcount PNR:$PNg), GPR64:$base),
(RegImmInst (REG_SEQUENCE ZPR2Mul2, Ty:$vec0, zsub0, Ty:$vec1, zsub1),
PPR:$PNg, GPR64:$base, (i64 0))>;
PNR:$PNg, GPR64:$base, (i64 0))>;
}

// Stores of 2 consecutive vectors
Expand All @@ -3878,10 +3878,10 @@ defm : store_pn_x2<nxv2f64, int_aarch64_sve_stnt1_pn_x2, STNT1D_2Z_IMM>;
multiclass store_pn_x4<ValueType Ty, SDPatternOperator Store,
Instruction RegImmInst> {
def : Pat<(Store (Ty ZPR:$vec0), (Ty ZPR:$vec1), (Ty ZPR:$vec2), (Ty ZPR:$vec3),
(aarch64svcount PPR:$PNg), GPR64:$base),
(aarch64svcount PNR:$PNg), GPR64:$base),
(RegImmInst (REG_SEQUENCE ZPR4Mul4, Ty:$vec0, zsub0, Ty:$vec1, zsub1,
Ty:$vec2, zsub2, Ty:$vec3, zsub3),
PPR:$PNg, GPR64:$base, (i64 0))>;
PNR:$PNg, GPR64:$base, (i64 0))>;
}

// Stores of 4 consecutive vectors
Expand Down Expand Up @@ -3923,19 +3923,19 @@ defm WHILELS_CXX : sve2p1_int_while_rr_pn<"whilels", 0b111>;
// Aliases for existing SVE instructions for which predicate-as-counter are
// accepted as an operand to the instruction
def : InstAlias<"ldr $Pt, [$Rn, $imm9, mul vl]",
(LDR_PXI PNRAny:$Pt, GPR64sp:$Rn, simm9:$imm9), 0>;
(LDR_PXI PNRasPPRAny:$Pt, GPR64sp:$Rn, simm9:$imm9), 0>;
def : InstAlias<"ldr $Pt, [$Rn]",
(LDR_PXI PNRAny:$Pt, GPR64sp:$Rn, 0), 0>;
(LDR_PXI PNRasPPRAny:$Pt, GPR64sp:$Rn, 0), 0>;

def : InstAlias<"str $Pt, [$Rn, $imm9, mul vl]",
(STR_PXI PNRAny:$Pt, GPR64sp:$Rn, simm9:$imm9), 0>;
(STR_PXI PNRasPPRAny:$Pt, GPR64sp:$Rn, simm9:$imm9), 0>;
def : InstAlias<"str $Pt, [$Rn]",
(STR_PXI PNRAny:$Pt, GPR64sp:$Rn, 0), 0>;
(STR_PXI PNRasPPRAny:$Pt, GPR64sp:$Rn, 0), 0>;

def : InstAlias<"mov $Pd, $Pn",
(ORR_PPzPP PNR8:$Pd, PNR8:$Pn, PNR8:$Pn, PNR8:$Pn), 0>;
(ORR_PPzPP PNRasPPR8:$Pd, PNRasPPR8:$Pn, PNRasPPR8:$Pn, PNRasPPR8:$Pn), 0>;

def : InstAlias<"pfalse\t$Pd", (PFALSE PNR8:$Pd), 0>;
def : InstAlias<"pfalse\t$Pd", (PFALSE PNRasPPR8:$Pd), 0>;

} // End HasSVE2p1_or_HasSME2

Expand Down
Loading