1// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 2>&1 < %s | FileCheck %s 2 3// --------------------------------------------------------------------------// 4// Multi-vector sequence constraints 5 6mova {z1.d-z2.d}, za.d[w12] 7// 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 8// CHECK-NEXT: mova {z1.d-z2.d}, za.d[w12] 9// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 10 11mova {z1.d-z4.d}, za.d[w12] 12// 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 13// CHECK-NEXT: mova {z1.d-z4.d}, za.d[w12] 14// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 15 16// --------------------------------------------------------------------------// 17// Invalid index offset 18 19mova {z0.s, z1.s}, za0h.s[w12, 1:2] 20// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector select offset must be an immediate range of the form <immf>:<imml>, where the first immediate is a multiple of 2 in the range [0, 2], and the second immediate is immf + 1. 21// CHECK-NEXT: mova {z0.s, z1.s}, za0h.s[w12, 1:2] 22// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 23 24mova {z0.s, z1.s}, za0h.s[w12, 3:4] 25// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector select offset must be an immediate range of the form <immf>:<imml>, where the first immediate is a multiple of 2 in the range [0, 2], and the second immediate is immf + 1. 26// CHECK-NEXT: mova {z0.s, z1.s}, za0h.s[w12, 3:4] 27// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 28 29mova {z0.s, z1.s}, za0h.s[w12, 0:2] 30// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 31// CHECK-NEXT: mova {z0.s, z1.s}, za0h.s[w12, 0:2] 32// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 33 34mova {z20.d-z21.d}, za2h.d[w14, 0:3] 35// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 36// CHECK-NEXT: mova {z20.d-z21.d}, za2h.d[w14, 0:3] 37// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 38 39mova {z16.s-z19.s}, za1h.s[w14, 0:1] 40// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 41// CHECK-NEXT: mova {z16.s-z19.s}, za1h.s[w14, 0:1] 42// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 43 44// --------------------------------------------------------------------------// 45// Invalid index (expected range) 46 47mova {z0.b-z3.b}, za0h.b[w13, 0] 48// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 49// CHECK-NEXT: mova {z0.b-z3.b}, za0h.b[w13, 0] 50// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 51 52// --------------------------------------------------------------------------// 53// Operands are not consistent 54 55mova za.h[w8, 0], {z0.s-z3.s} 56// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 57// CHECK-NEXT: mova za.h[w8, 0], {z0.s-z3.s} 58// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 59 60mov za.h[w8, 0], {z0.s-z3.s} 61// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 62// CHECK-NEXT:mov za.h[w8, 0], {z0.s-z3.s} 63// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 64 65mova {z0.s-z3.s}, za.b[w8, 0] 66// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected suffix .s 67// CHECK-NEXT: mova {z0.s-z3.s}, za.b[w8, 0] 68// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 69 70mov {z0.h-z3.h}, za.d[w8, 0] 71// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected suffix .h 72// CHECK-NEXT: mov {z0.h-z3.h}, za.d[w8, 0] 73// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 74 75 76// --------------------------------------------------------------------------// 77// Tile-to-vector and vector-to-tile should not accept the VG suffix 78 79mov za0h.b[w12, 0:1, vgx2], { z0.b, z1.b } 80// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 81// CHECK-NEXT: mov za0h.b[w12, 0:1, vgx2], { z0.b, z1.b } 82// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 83 84mov { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2] 85// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 86// CHECK-NEXT: mov { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2] 87// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 88 89mov za0h.b[w12, 0:3, vgx4], { z0.b - z3.b } 90// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 91// CHECK-NEXT: mov za0h.b[w12, 0:3, vgx4], { z0.b - z3.b } 92// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 93 94mov { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4] 95// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 96// CHECK-NEXT: mov { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4] 97// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 98 99mova za0h.b[w12, 0:1, vgx2], { z0.b, z1.b } 100// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 101// CHECK-NEXT: mova za0h.b[w12, 0:1, vgx2], { z0.b, z1.b } 102// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 103 104mova { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2] 105// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 106// CHECK-NEXT: mova { z0.b, z1.b }, za0h.b[w12, 0:1, vgx2] 107// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 108 109mova za0h.b[w12, 0:3, vgx4], { z0.b - z3.b } 110// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 111// CHECK-NEXT: mova za0h.b[w12, 0:3, vgx4], { z0.b - z3.b } 112// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 113 114mova { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4] 115// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 116// CHECK-NEXT: mova { z0.b - z3.b }, za0h.b[w12, 0:3, vgx4] 117// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 118