diff --git a/llvm/lib/Target/AArch64/AArch64RegisterInfo.td b/llvm/lib/Target/AArch64/AArch64RegisterInfo.td index fa135eb0c74098..358f7f6c165631 100644 --- a/llvm/lib/Target/AArch64/AArch64RegisterInfo.td +++ b/llvm/lib/Target/AArch64/AArch64RegisterInfo.td @@ -941,11 +941,13 @@ class PNRRegOp let PrintMethod = "printPredicateAsCounter<" # EltSize # ">"; } +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>; diff --git a/llvm/lib/Target/AArch64/SMEInstrFormats.td b/llvm/lib/Target/AArch64/SMEInstrFormats.td index 57cc69f2e91458..cc05c7ca94274e 100644 --- a/llvm/lib/Target/AArch64/SMEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SMEInstrFormats.td @@ -1272,6 +1272,19 @@ multiclass sve2_int_perm_sel_p { let Inst{20-18} = 0b000; } + def : InstAlias(NAME # _B) PNRAny:$Pd, + PNRAny:$Pn, PPR8:$Pm, MatrixIndexGPR32Op12_15:$Rv, sme_elm_idx0_15:$imm), 0>; + def : InstAlias(NAME # _H) PNRAny:$Pd, + PNRAny:$Pn, PPR16:$Pm, MatrixIndexGPR32Op12_15:$Rv, sme_elm_idx0_7:$imm), 0>; + def : InstAlias(NAME # _S) PNRAny:$Pd, + PNRAny:$Pn, PPR32:$Pm, MatrixIndexGPR32Op12_15:$Rv, sme_elm_idx0_3:$imm), 0>; + def : InstAlias(NAME # _D) PNRAny:$Pd, + PNRAny:$Pn, PPR64:$Pm, MatrixIndexGPR32Op12_15:$Rv, sme_elm_idx0_1:$imm), 0>; + def : Pat<(nxv16i1 (op (nxv16i1 PPRAny:$Pn), (nxv16i1 PPRAny:$Pm), MatrixIndexGPR32Op12_15:$idx)), (!cast(NAME # _B) $Pn, $Pm, $idx, 0)>; diff --git a/llvm/test/MC/AArch64/SME/psel.s b/llvm/test/MC/AArch64/SME/psel.s index 6db22abf64652b..eb0c32c3981338 100644 --- a/llvm/test/MC/AArch64/SME/psel.s +++ b/llvm/test/MC/AArch64/SME/psel.s @@ -119,3 +119,30 @@ psel p15, p15, p15.d[w15, 1] // CHECK-ENCODING: [0xef,0x7d,0xe3,0x25] // CHECK-ERROR: instruction requires: sme // CHECK-UNKNOWN: 25e37def + +// --------------------------------------------------------------------------// +// Also support with predicate-as-counter + +psel pn15, pn15, p15.b[w15, 15] +// CHECK-INST: psel p15, p15, p15.b[w15, 15] +// CHECK-ENCODING: [0xef,0x7d,0xff,0x25] +// CHECK-ERROR: instruction requires: sme +// CHECK-UNKNOWN: 25ff7def + +psel pn15, pn15, p15.h[w15, 7] +// CHECK-INST: psel p15, p15, p15.h[w15, 7] +// CHECK-ENCODING: [0xef,0x7d,0xfb,0x25] +// CHECK-ERROR: instruction requires: sme +// CHECK-UNKNOWN: 25fb7def + +psel pn15, pn15, p15.s[w15, 3] +// CHECK-INST: psel p15, p15, p15.s[w15, 3] +// CHECK-ENCODING: [0xef,0x7d,0xf3,0x25] +// CHECK-ERROR: instruction requires: sme +// CHECK-UNKNOWN: 25f37def + +psel pn15, pn15, p15.d[w15, 1] +// CHECK-INST: psel p15, p15, p15.d[w15, 1] +// CHECK-ENCODING: [0xef,0x7d,0xe3,0x25] +// CHECK-ERROR: instruction requires: sme +// CHECK-UNKNOWN: 25e37def