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, #-1, lsl #8 31// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 32// CHECK-NEXT: dup z0.b, #-1, lsl #8 33// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 34 35dup z0.b, #256 36// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 37// CHECK-NEXT: dup z0.b, #256 38// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 39 40dup z0.b, #1, lsl #8 41// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 255] 42// CHECK-NEXT: dup z0.b, #1, lsl #8 43// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 44 45dup z0.h, #-32769 46// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] 47// CHECK-NEXT: dup z0.h, #-32769 48// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 49 50dup z0.h, #65281 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, #65281 53// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 54 55dup z0.h, #65536 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, #65536 58// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 59 60dup z0.h, #256, 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, #256, lsl #8 63// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 64 65dup z0.s, #-33024 66// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 67// CHECK-NEXT: dup z0.s, #-33024 68// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 69 70dup z0.s, #-32769 71// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] 72// CHECK-NEXT: dup z0.s, #-32769 73// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 74 75dup z0.s, #-129, 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, 32512] 77// CHECK-NEXT: dup z0.s, #-129, lsl #8 78// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 79 80dup z0.s, #32513 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, #32513 83// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 84 85dup z0.s, #32768 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, #32768 88// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 89 90dup z0.s, #128, 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, #128, lsl #8 93// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 94 95dup z0.d, #-33024 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.d, #-33024 98// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 99 100dup z0.d, #-32769 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.d, #-32769 103// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 104 105dup z0.d, #-129, 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.d, #-129, lsl #8 108// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 109 110dup z0.d, #32513 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, #32513 113// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 114 115dup z0.d, #32768 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, #32768 118// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 119 120dup z0.d, #128, 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, #128, lsl #8 123// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 124 125 126// --------------------------------------------------------------------------// 127// Immediate not compatible with encode/decode function. 128 129dup z0.b, b0 130// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 131// CHECK-NEXT: dup z0.b, b0 132// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 133 134dup z0.h, h0 135// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 136// CHECK-NEXT: dup z0.h, h0 137// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 138 139dup z0.s, s0 140// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 141// CHECK-NEXT: dup z0.s, s0 142// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 143 144dup z0.d, d0 145// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 146// CHECK-NEXT: dup z0.d, d0 147// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 148 149dup z0.q, q0 150// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction 151// CHECK-NEXT: dup z0.q, q0 152// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 153 154dup z24.b, z17.b[-1] 155// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 63]. 156// CHECK-NEXT: dup z24.b, z17.b[-1] 157// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 158 159dup z17.b, z5.b[64] 160// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 63]. 161// CHECK-NEXT: dup z17.b, z5.b[64] 162// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 163 164dup z16.h, z30.h[-1] 165// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 31]. 166// CHECK-NEXT: dup z16.h, z30.h[-1] 167// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 168 169dup z19.h, z23.h[32] 170// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 31]. 171// CHECK-NEXT: dup z19.h, z23.h[32] 172// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 173 174dup z1.s, z6.s[-1] 175// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 15]. 176// CHECK-NEXT: dup z1.s, z6.s[-1] 177// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 178 179dup z24.s, z3.s[16] 180// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 15]. 181// CHECK-NEXT: dup z24.s, z3.s[16] 182// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 183 184dup z5.d, z25.d[-1] 185// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 7]. 186// CHECK-NEXT: dup z5.d, z25.d[-1] 187// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 188 189dup z12.d, z28.d[8] 190// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 7]. 191// CHECK-NEXT: dup z12.d, z28.d[8] 192// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 193 194dup z22.q, z7.q[-1] 195// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3]. 196// CHECK-NEXT: dup z22.q, z7.q[-1] 197// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 198 199dup z24.q, z21.q[4] 200// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3]. 201// CHECK-NEXT: dup z24.q, z21.q[4] 202// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 203 204 205// --------------------------------------------------------------------------// 206// Negative tests for instructions that are incompatible with movprfx 207 208movprfx z31.b, p0/z, z6.b 209dup z31.b, wsp 210// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 211// CHECK-NEXT: dup z31.b, wsp 212// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 213 214movprfx z31, z6 215dup z31.b, wsp 216// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 217// CHECK-NEXT: dup z31.b, wsp 218// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 219 220movprfx z21.d, p0/z, z28.d 221dup z21.d, #32512 222// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 223// CHECK-NEXT: dup z21.d, #32512 224// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 225 226movprfx z21, z28 227dup z21.d, #32512 228// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 229// CHECK-NEXT: dup z21.d, #32512 230// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 231 232movprfx z31.d, p0/z, z6.d 233dup z31.d, z31.d[7] 234// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 235// CHECK-NEXT: dup z31.d, z31.d[7] 236// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 237 238movprfx z31, z6 239dup z31.d, z31.d[7] 240// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov 241// CHECK-NEXT: dup z31.d, z31.d[7] 242// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: 243