1// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve 2>&1 < %s| FileCheck %s 2 3// input should be a 64bit scalar register 4dup z0.d, w0 5// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 6// CHECK-NEXT: dup z0.d, w0 7// CHECK-NOT: [[@LINE-3]]:{{[0-9]+}}: 8 9// wzr is not a valid operand to dup 10dup z0.s, wzr 11// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 12// CHECK-NEXT: dup z0.s, wzr 13// CHECK-NOT: [[@LINE-3]]:{{[0-9]+}}: 14 15// xzr is not a valid operand to dup 16dup z0.d, xzr 17// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 18// CHECK-NEXT: dup z0.d, xzr 19// CHECK-NOT: [[@LINE-3]]:{{[0-9]+}}: 20 21 22// --------------------------------------------------------------------------// 23// Invalid immediates 24 25dup z0.b, #0, lsl #8 // #0, lsl #8 is not valid for .b 26// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 27// CHECK-NEXT: dup z0.b, #0, lsl #8 28// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 29 30dup z0.b, #-129 31// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 32// CHECK-NEXT: dup z0.b, #-129 33// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 34 35dup z0.b, #-1, lsl #8 36// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 37// CHECK-NEXT: dup z0.b, #-1, lsl #8 38// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 39 40dup z0.b, #256 41// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 42// CHECK-NEXT: dup z0.b, #256 43// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 44 45dup z0.b, #1, lsl #8 46// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 47// CHECK-NEXT: dup z0.b, #1, lsl #8 48// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 49 50dup z0.h, #-33024 51// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] 52// CHECK-NEXT: dup z0.h, #-33024 53// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 54 55dup z0.h, #-32769 56// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] 57// CHECK-NEXT: dup z0.h, #-32769 58// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 59 60dup z0.h, #-129, lsl #8 61// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] 62// CHECK-NEXT: dup z0.h, #-129, lsl #8 63// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 64 65dup z0.h, #65281 66// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] 67// CHECK-NEXT: dup z0.h, #65281 68// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 69 70dup z0.h, #65536 71// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] 72// CHECK-NEXT: dup z0.h, #65536 73// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 74 75dup z0.h, #256, lsl #8 76// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] 77// CHECK-NEXT: dup z0.h, #256, lsl #8 78// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 79 80dup z0.s, #-33024 81// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 82// CHECK-NEXT: dup z0.s, #-33024 83// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 84 85dup z0.s, #-32769 86// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 87// CHECK-NEXT: dup z0.s, #-32769 88// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 89 90dup z0.s, #-129, lsl #8 91// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 92// CHECK-NEXT: dup z0.s, #-129, lsl #8 93// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 94 95dup z0.s, #32513 96// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 97// CHECK-NEXT: dup z0.s, #32513 98// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 99 100dup z0.s, #32768 101// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 102// CHECK-NEXT: dup z0.s, #32768 103// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 104 105dup z0.s, #128, lsl #8 106// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 107// CHECK-NEXT: dup z0.s, #128, lsl #8 108// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 109 110dup z0.d, #-33024 111// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 112// CHECK-NEXT: dup z0.d, #-33024 113// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 114 115dup z0.d, #-32769 116// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 117// CHECK-NEXT: dup z0.d, #-32769 118// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 119 120dup z0.d, #-129, lsl #8 121// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 122// CHECK-NEXT: dup z0.d, #-129, lsl #8 123// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 124 125dup z0.d, #32513 126// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 127// CHECK-NEXT: dup z0.d, #32513 128// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 129 130dup z0.d, #32768 131// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 132// CHECK-NEXT: dup z0.d, #32768 133// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 134 135dup z0.d, #128, lsl #8 136// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 137// CHECK-NEXT: dup z0.d, #128, lsl #8 138// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 139 140 141// --------------------------------------------------------------------------// 142// Immediate not compatible with encode/decode function. 143 144dup z0.b, b0 145// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 146// CHECK-NEXT: dup z0.b, b0 147// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 148 149dup z0.h, h0 150// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 151// CHECK-NEXT: dup z0.h, h0 152// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 153 154dup z0.s, s0 155// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 156// CHECK-NEXT: dup z0.s, s0 157// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 158 159dup z0.d, d0 160// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 161// CHECK-NEXT: dup z0.d, d0 162// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 163 164dup z0.q, q0 165// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 166// CHECK-NEXT: dup z0.q, q0 167// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 168 169dup z24.b, z17.b[-1] 170// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 63]. 171// CHECK-NEXT: dup z24.b, z17.b[-1] 172// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 173 174dup z17.b, z5.b[64] 175// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 63]. 176// CHECK-NEXT: dup z17.b, z5.b[64] 177// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 178 179dup z16.h, z30.h[-1] 180// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 31]. 181// CHECK-NEXT: dup z16.h, z30.h[-1] 182// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 183 184dup z19.h, z23.h[32] 185// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 31]. 186// CHECK-NEXT: dup z19.h, z23.h[32] 187// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 188 189dup z1.s, z6.s[-1] 190// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 15]. 191// CHECK-NEXT: dup z1.s, z6.s[-1] 192// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 193 194dup z24.s, z3.s[16] 195// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 15]. 196// CHECK-NEXT: dup z24.s, z3.s[16] 197// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 198 199dup z5.d, z25.d[-1] 200// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 7]. 201// CHECK-NEXT: dup z5.d, z25.d[-1] 202// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 203 204dup z12.d, z28.d[8] 205// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 7]. 206// CHECK-NEXT: dup z12.d, z28.d[8] 207// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 208 209dup z22.q, z7.q[-1] 210// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3]. 211// CHECK-NEXT: dup z22.q, z7.q[-1] 212// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 213 214dup z24.q, z21.q[4] 215// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3]. 216// CHECK-NEXT: dup z24.q, z21.q[4] 217// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 218 219 220// --------------------------------------------------------------------------// 221// Negative tests for instructions that are incompatible with movprfx 222 223movprfx z31.b, p0/z, z6.b 224dup z31.b, wsp 225// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 226// CHECK-NEXT: dup z31.b, wsp 227// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 228 229movprfx z31, z6 230dup z31.b, wsp 231// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 232// CHECK-NEXT: dup z31.b, wsp 233// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 234 235movprfx z21.d, p0/z, z28.d 236dup z21.d, #32512 237// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 238// CHECK-NEXT: dup z21.d, #32512 239// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 240 241movprfx z21, z28 242dup z21.d, #32512 243// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 244// CHECK-NEXT: dup z21.d, #32512 245// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 246 247movprfx z31.d, p0/z, z6.d 248dup z31.d, z31.d[7] 249// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 250// CHECK-NEXT: dup z31.d, z31.d[7] 251// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 252 253movprfx z31, z6 254dup z31.d, z31.d[7] 255// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 256// CHECK-NEXT: dup z31.d, z31.d[7] 257// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 258