347 changes: 85 additions & 262 deletions llvm/lib/Target/AArch64/SMEInstrFormats.td

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions llvm/test/MC/AArch64/SME/psel.s
Original file line number Diff line number Diff line change
Expand Up @@ -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 <unknown>

// --------------------------------------------------------------------------//
// 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 <unknown>

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 <unknown>

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 <unknown>

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 <unknown>
44 changes: 44 additions & 0 deletions llvm/test/MC/AArch64/SME2/mova-diagnostics.s
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,47 @@ mov {z0.h-z3.h}, za.d[w8, 0]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected suffix .h
// CHECK-NEXT: mov {z0.h-z3.h}, za.d[w8, 0]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:


// --------------------------------------------------------------------------//
// Tile-to-vector and vector-to-tile should not accept the VG suffix

mov za0h.b[w12, 0:1, vgx2], { z0.b, z1.b }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mov za0h.b[w12, 0:1, vgx2], { z0.b, z1.b }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

mov { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mov { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

mov za0h.b[w12, 0:3, vgx4], { z0.b - z3.b }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mov za0h.b[w12, 0:3, vgx4], { z0.b - z3.b }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

mov { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mov { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

mova za0h.b[w12, 0:1, vgx2], { z0.b, z1.b }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mova za0h.b[w12, 0:1, vgx2], { z0.b, z1.b }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

mova { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mova { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

mova za0h.b[w12, 0:3, vgx4], { z0.b - z3.b }
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mova za0h.b[w12, 0:3, vgx4], { z0.b - z3.b }
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

mova { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: mova { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
13 changes: 13 additions & 0 deletions llvm/test/MC/AArch64/SME2p1/movaz-diagnostics.s
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,16 @@ movaz z31.s, za1h.d[w15, -1]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-3]h.s or za[0-3]v.s
// CHECK-NEXT: movaz z31.s, za1h.d[w15, -1]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

// --------------------------------------------------------------------------//
// Tile-to-vector should not accept the VG suffix

movaz { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: movaz { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

movaz { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4]
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
// CHECK-NEXT: movaz { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4]
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: