Skip to content
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

[AArch64] Add assembly/disassembly for multi-vector AES instructions #113307

Merged
merged 1 commit into from
Oct 24, 2024
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: 1 addition & 1 deletion llvm/lib/Target/AArch64/AArch64.td
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def SVEUnsupported : AArch64Unsupported {
SVE2Unsupported.F);
}

let F = [HasSME2p1, HasSVE2p1_or_HasSME2p1] in
let F = [HasSME2p1, HasSVE2p1_or_HasSME2p1, HasSVE2p1orSSVE_AES] in
jthackray marked this conversation as resolved.
Show resolved Hide resolved
def SME2p1Unsupported : AArch64Unsupported;

def SME2Unsupported : AArch64Unsupported {
Expand Down
13 changes: 13 additions & 0 deletions llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -3917,6 +3917,19 @@ let Predicates = [HasSVE2BitPerm] in {
defm BGRP_ZZZ : sve2_misc_bitwise<0b1110, "bgrp", int_aarch64_sve_bgrp_x>;
} // End HasSVE2BitPerm

let Predicates = [HasSVEAES2, HasSVE2p1orSSVE_AES] in {
// SVE_AES2 multi-vector instructions (x2)
def AESE_2ZZI_B : sve_crypto_binary_multi2<0b000, "aese">;
def AESD_2ZZI_B : sve_crypto_binary_multi2<0b010, "aesd">;
def AESEMC_2ZZI_B : sve_crypto_binary_multi2<0b100, "aesemc">;
def AESDMIC_2ZZI_B : sve_crypto_binary_multi2<0b110, "aesdimc">;
// SVE_AES2 multi-vector instructions (x4)
def AESE_4ZZI_B : sve_crypto_binary_multi4<0b0000, "aese">;
def AESD_4ZZI_B : sve_crypto_binary_multi4<0b0100, "aesd">;
def AESEMC_4ZZI_B : sve_crypto_binary_multi4<0b1000, "aesemc">;
def AESDMIC_4ZZI_B : sve_crypto_binary_multi4<0b1100, "aesdimc">;
} // End HasSVEAES2, HasSVE2p1orSSVE_AES

//===----------------------------------------------------------------------===//
// SME or SVE2.1 instructions
//===----------------------------------------------------------------------===//
Expand Down
48 changes: 48 additions & 0 deletions llvm/lib/Target/AArch64/SVEInstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -8698,6 +8698,54 @@ multiclass sve2_crypto_unary_op<bit opc, string asm, SDPatternOperator op> {
def : SVE_1_Op_Pat<nxv16i8, op, nxv16i8, !cast<Instruction>(NAME)>;
}

class sve_crypto_binary_multi2<bits<3> opc, string asm>
: I<(outs ZZ_b_mul_r:$Zdn),
(ins ZZ_b_mul_r:$_Zdn, ZPR128:$Zm, VectorIndexS32b_timm:$imm2),
asm,
"\t$Zdn, $_Zdn, $Zm$imm2",
"",
[]>, Sched<[]> {
bits<5> Zm;
bits<4> Zdn;
bits<2> imm2;
let Inst{31-21} = 0b01000101001;
let Inst{20-19} = imm2;
let Inst{18-17} = 0b01;
let Inst{16} = opc{2};
let Inst{15-11} = 0b11101;
let Inst{10} = opc{1};
let Inst{9-5} = Zm;
let Inst{4-1} = Zdn;
let Inst{0} = opc{0};

let Constraints = "$Zdn = $_Zdn";
let hasSideEffects = 0;
}

class sve_crypto_binary_multi4<bits<4> opc, string asm>
: I<(outs ZZZZ_b_mul_r:$Zdn),
(ins ZZZZ_b_mul_r:$_Zdn, ZPR128:$Zm, VectorIndexS32b_timm:$imm2),
asm,
"\t$Zdn, $_Zdn, $Zm$imm2",
"",
[]>, Sched<[]> {
bits<5> Zm;
bits<3> Zdn;
bits<2> imm2;
let Inst{31-21} = 0b01000101001;
let Inst{20-19} = imm2;
let Inst{18-17} = 0b11;
let Inst{16} = opc{3};
let Inst{15-11} = 0b11101;
let Inst{10} = opc{2};
let Inst{9-5} = Zm;
let Inst{4-2} = Zdn;
let Inst{1-0} = opc{1-0};

let Constraints = "$Zdn = $_Zdn";
let hasSideEffects = 0;
}

//===----------------------------------------------------------------------===//
// SVE BFloat16 Group
//===----------------------------------------------------------------------===//
Expand Down
6 changes: 6 additions & 0 deletions llvm/test/MC/AArch64/SME2p1/directive-arch-negative.s
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@ bfclamp { z0.h, z1.h }, z0.h, z0.h
bfadd za.h[w8, 3], {z20.h-z21.h}
// CHECK: error: instruction requires: sme-b16b16
// CHECK: bfadd za.h[w8, 3], {z20.h-z21.h}

.arch armv9-a+sve-aes2+ssve-aes
.arch armv9-a+nossve-aes
aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[0]
// CHECK: error: instruction requires: sve2p1 or ssve-aes sve-aes2
// CHECK: aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[0]
4 changes: 4 additions & 0 deletions llvm/test/MC/AArch64/SME2p1/directive-arch.s
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,7 @@ sqcvt z0.h, {z0.s, z1.s}
.arch armv9-a+sme2+sve-b16b16
bfclamp { z0.h, z1.h }, z0.h, z0.h
// CHECK: bfclamp { z0.h, z1.h }, z0.h, z0.h

.arch armv9-a+sve-aes2+ssve-aes
aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[0]
// CHECK: aesdimc { z0.b - z3.b }, { z0.b - z3.b }, z0.q[0]
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,11 @@ bfclamp { z0.h, z1.h }, z0.h, z0.h
.arch_extension nosme-b16b16
bfadd za.h[w8, 3], {z20.h-z21.h}
// CHECK: error: instruction requires: sme-b16b16
// CHECK: bfadd za.h[w8, 3], {z20.h-z21.h}
// CHECK: bfadd za.h[w8, 3], {z20.h-z21.h}

.arch_extension sve-aes2
.arch_extension ssve-aes
.arch_extension nossve-aes
aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[0]
// CHECK: error: instruction requires: sve2p1 or ssve-aes
// CHECK: aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[0]
7 changes: 6 additions & 1 deletion llvm/test/MC/AArch64/SME2p1/directive-arch_extension.s
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,9 @@ bfclamp { z0.h, z1.h }, z0.h, z0.h

.arch_extension sme-b16b16
bfadd za.h[w8, 3], {z20.h-z21.h}
// CHECK: bfadd za.h[w8, 3, vgx2], { z20.h, z21.h }
// CHECK: bfadd za.h[w8, 3, vgx2], { z20.h, z21.h }

.arch_extension sve-aes2
.arch_extension ssve-aes
aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[0]
// CHECK: aesdimc { z0.b - z3.b }, { z0.b - z3.b }, z0.q[0]
83 changes: 83 additions & 0 deletions llvm/test/MC/AArch64/SVE2p1/aesd-diagnostics.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve-aes2,+sve2p1 2>&1 < %s| FileCheck %s

// --------------------------------------------------------------------------//
// Invalid vector list

aesd {z0.b-z2.b}, {z0.b-z2.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesd {z0.b-z2.b}, {z0.b-z2.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z0.d-z1.d}, {z0.d-z1.d}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesd {z0.d-z1.d}, {z0.d-z1.d}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z0.s-z3.s}, {z0.s-z3.s}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesd {z0.s-z3.s}, {z0.s-z3.s}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z0.b-z0.b}, {z0.b-z0.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid number of vectors
// CHECK-NEXT: aesd {z0.b-z0.b}, {z0.b-z0.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z3.b-z7.b}, {z3.b-z7.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid number of vectors
// CHECK-NEXT: aesd {z3.b-z7.b}, {z3.b-z7.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z3.b-z4.b}, {z3.b-z4.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
// CHECK-NEXT: aesd {z3.b-z4.b}, {z3.b-z4.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z5.b-z8.b}, {z5.b-z8.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 4 consecutive SVE vectors, where the first vector is a multiple of 4 and with matching element types
// CHECK-NEXT: aesd {z5.b-z8.b}, {z5.b-z8.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Invalid second source vector width

aesd {z0.b-z1.b}, {z0.b-z1.b}, z0.d[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: aesd {z0.b-z1.b}, {z0.b-z1.b}, z0.d[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z0.b-z3.b}, {z0.b-z3.b}, z0.s[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: aesd {z0.b-z3.b}, {z0.b-z3.b}, z0.s[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Invalid immediate index

aesd {z0.b-z1.b}, {z0.b-z1.b}, z0.q[4]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
// CHECK-NEXT: aesd {z0.b-z1.b}, {z0.b-z1.b}, z0.q[4]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z0.b-z3.b}, {z0.b-z3.b}, z0.q[-1]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
// CHECK-NEXT: aesd {z0.b-z3.b}, {z0.b-z3.b}, z0.q[-1]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Source and Destination Registers must match

aesd {z0.b-z1.b}, {z2.b-z3.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must match destination register list
// CHECK-NEXT: aesd {z0.b-z1.b}, {z2.b-z3.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z0.b-z3.b}, {z4.b-z7.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must match destination register list
// CHECK-NEXT: aesd {z0.b-z3.b}, {z4.b-z7.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesd {z0.b-z3.b}, {z0.h-z3.h}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesd {z0.b-z3.b}, {z0.h-z3.h}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
53 changes: 53 additions & 0 deletions llvm/test/MC/AArch64/SVE2p1/aesd.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve-aes2,+sve2p1 < %s \
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve-aes2,+ssve-aes < %s \
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve-aes2,+sve2p1 < %s \
// RUN: | llvm-objdump -d --mattr=+sve-aes2,+sve2p1 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-INST
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve-aes2,+sve2p1 < %s \
// RUN: | llvm-objdump -d --mattr=-sme2 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-UNKNOWN
// Disassemble encoding and check the re-encoding (-show-encoding) matches.
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve-aes2,+sve2p1 < %s \
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
// RUN: | llvm-mc -triple=aarch64 -mattr=+sve-aes2,+sve2p1 -disassemble -show-encoding \
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST

// x2
aesd {z0.b-z1.b}, {z0.b-z1.b}, z0.q[0] // 01000101-00100010-11101100-00000000
// CHECK-INST: aesd { z0.b, z1.b }, { z0.b, z1.b }, z0.q[0]
// CHECK-ENCODING: [0x00,0xec,0x22,0x45]
// CHECK-ERROR: instruction requires: sve2p1 or ssve-aes sve-aes2
// CHECK-UNKNOWN: 4522ec00 <unknown>

aesd {z20.b-z21.b}, {z20.b-z21.b}, z10.q[2] // 01000101-00110010-11101101-01010100
// CHECK-INST: aesd { z20.b, z21.b }, { z20.b, z21.b }, z10.q[2]
// CHECK-ENCODING: [0x54,0xed,0x32,0x45]
// CHECK-ERROR: instruction requires: sve2p1 or ssve-aes sve-aes2
// CHECK-UNKNOWN: 4532ed54 <unknown>

aesd {z30.b-z31.b}, {z30.b-z31.b}, z31.q[3] // 01000101-00111010-11101111-11111110
// CHECK-INST: aesd { z30.b, z31.b }, { z30.b, z31.b }, z31.q[3]
// CHECK-ENCODING: [0xfe,0xef,0x3a,0x45]
// CHECK-ERROR: instruction requires: sve2p1 or ssve-aes sve-aes2
// CHECK-UNKNOWN: 453aeffe <unknown>

// x4
aesd {z0.b-z3.b}, {z0.b-z3.b}, z0.q[0] // 01000101-00100110-11101100-00000000
// CHECK-INST: aesd { z0.b - z3.b }, { z0.b - z3.b }, z0.q[0]
// CHECK-ENCODING: [0x00,0xec,0x26,0x45]
// CHECK-ERROR: instruction requires: sve2p1 or ssve-aes sve-aes2
// CHECK-UNKNOWN: 4526ec00 <unknown>

aesd {z20.b-z23.b}, {z20.b-z23.b}, z13.q[1] // 01000101-00101110-11101101-10110100
// CHECK-INST: aesd { z20.b - z23.b }, { z20.b - z23.b }, z13.q[1]
// CHECK-ENCODING: [0xb4,0xed,0x2e,0x45]
// CHECK-ERROR: instruction requires: sve2p1 or ssve-aes sve-aes2
// CHECK-UNKNOWN: 452eedb4 <unknown>

aesd {z28.b-z31.b}, {z28.b-z31.b}, z31.q[3] // 01000101-00111110-11101111-11111100
// CHECK-INST: aesd { z28.b - z31.b }, { z28.b - z31.b }, z31.q[3]
// CHECK-ENCODING: [0xfc,0xef,0x3e,0x45]
// CHECK-ERROR: instruction requires: sve2p1 or ssve-aes sve-aes2
// CHECK-UNKNOWN: 453eeffc <unknown>
83 changes: 83 additions & 0 deletions llvm/test/MC/AArch64/SVE2p1/aesdimc-diagnostics.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve-aes2,+sve2p1 2>&1 < %s| FileCheck %s

// --------------------------------------------------------------------------//
// Invalid vector list

aesdimc {z0.b-z2.b}, {z0.b-z2.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesdimc {z0.b-z2.b}, {z0.b-z2.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z0.d-z1.d}, {z0.d-z1.d}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesdimc {z0.d-z1.d}, {z0.d-z1.d}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z0.s-z3.s}, {z0.s-z3.s}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesdimc {z0.s-z3.s}, {z0.s-z3.s}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z0.b-z0.b}, {z0.b-z0.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid number of vectors
// CHECK-NEXT: aesdimc {z0.b-z0.b}, {z0.b-z0.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z3.b-z7.b}, {z3.b-z7.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid number of vectors
// CHECK-NEXT: aesdimc {z3.b-z7.b}, {z3.b-z7.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z3.b-z4.b}, {z3.b-z4.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
// CHECK-NEXT: aesdimc {z3.b-z4.b}, {z3.b-z4.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z5.b-z8.b}, {z5.b-z8.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 4 consecutive SVE vectors, where the first vector is a multiple of 4 and with matching element types
// CHECK-NEXT: aesdimc {z5.b-z8.b}, {z5.b-z8.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Invalid second source vector width

aesdimc {z0.b-z1.b}, {z0.b-z1.b}, z0.d[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: aesdimc {z0.b-z1.b}, {z0.b-z1.b}, z0.d[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.s[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
// CHECK-NEXT: aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.s[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Invalid immediate index

aesdimc {z0.b-z1.b}, {z0.b-z1.b}, z0.q[4]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
// CHECK-NEXT: aesdimc {z0.b-z1.b}, {z0.b-z1.b}, z0.q[4]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[-1]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
// CHECK-NEXT: aesdimc {z0.b-z3.b}, {z0.b-z3.b}, z0.q[-1]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Source and Destination Registers must match

aesdimc {z0.b-z1.b}, {z2.b-z3.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must match destination register list
// CHECK-NEXT: aesdimc {z0.b-z1.b}, {z2.b-z3.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z0.b-z3.b}, {z4.b-z7.b}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must match destination register list
// CHECK-NEXT: aesdimc {z0.b-z3.b}, {z4.b-z7.b}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

aesdimc {z0.b-z3.b}, {z0.h-z3.h}, z0.q[0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: aesdimc {z0.b-z3.b}, {z0.h-z3.h}, z0.q[0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
Loading
Loading