xref: /llvm-project/llvm/test/MC/AArch64/SVE/dup-diagnostics.s (revision 3b4f706ae16bb12b7d925fbf428def7cb2a6f7db)
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