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 4 dup 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 10 dup 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 16 dup 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 25 dup 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 30 dup 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 35 dup 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 40 dup 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 45 dup 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 50 dup 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 55 dup 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 60 dup 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 65 dup 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 70 dup 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 75 dup 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 80 dup 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 85 dup 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 90 dup 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 95 dup 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 100 dup 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 105 dup 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 110 dup 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 115 dup 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 120 dup 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 125 dup 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 130 dup 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 135 dup 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 144 dup 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 149 dup 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 154 dup 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 159 dup 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 164 dup 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 169 dup 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 174 dup 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 179 dup 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 184 dup 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 189 dup 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 194 dup 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 199 dup 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 204 dup 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 209 dup 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 214 dup 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 223 movprfx z31.b, p0/z, z6.b 224 dup 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 229 movprfx z31, z6 230 dup 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 235 movprfx z21.d, p0/z, z28.d 236 dup 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 241 movprfx z21, z28 242 dup 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 247 movprfx z31.d, p0/z, z6.d 248 dup 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 253 movprfx z31, z6 254 dup 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