Mercurial > hg > CbC > CbC_llvm
comparison clang/test/Sema/arm-mve-immediates.c @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 |
parents | |
children | 0572611fdcc8 |
comparison
equal
deleted
inserted
replaced
147:c2174574ed3a | 150:1d019706d866 |
---|---|
1 // RUN: %clang_cc1 -triple thumbv8.1m.main-arm-none-eabi -fallow-half-arguments-and-returns -target-feature +mve.fp -verify -fsyntax-only %s | |
2 | |
3 #include <arm_mve.h> | |
4 | |
5 void test_load_offsets(uint32x4_t addr32, uint64x2_t addr64) | |
6 { | |
7 // Offsets that should be a multiple of 8 times 0,1,...,127 | |
8 vldrdq_gather_base_s64(addr64, 0); | |
9 vldrdq_gather_base_s64(addr64, 8); | |
10 vldrdq_gather_base_s64(addr64, 2*8); | |
11 vldrdq_gather_base_s64(addr64, 125*8); | |
12 vldrdq_gather_base_s64(addr64, 126*8); | |
13 vldrdq_gather_base_s64(addr64, 127*8); | |
14 vldrdq_gather_base_s64(addr64, -125*8); | |
15 vldrdq_gather_base_s64(addr64, -126*8); | |
16 vldrdq_gather_base_s64(addr64, -127*8); | |
17 vldrdq_gather_base_s64(addr64, 128*8); // expected-error {{argument value 1024 is outside the valid range [-1016, 1016]}} | |
18 vldrdq_gather_base_s64(addr64, -128*8); // expected-error {{argument value -1024 is outside the valid range [-1016, 1016]}} | |
19 vldrdq_gather_base_s64(addr64, 4); // expected-error {{argument should be a multiple of 8}} | |
20 vldrdq_gather_base_s64(addr64, 1); // expected-error {{argument should be a multiple of 8}} | |
21 | |
22 // Offsets that should be a multiple of 4 times 0,1,...,127 | |
23 vldrwq_gather_base_s32(addr32, 0); | |
24 vldrwq_gather_base_s32(addr32, 4); | |
25 vldrwq_gather_base_s32(addr32, 2*4); | |
26 vldrwq_gather_base_s32(addr32, 125*4); | |
27 vldrwq_gather_base_s32(addr32, 126*4); | |
28 vldrwq_gather_base_s32(addr32, 127*4); | |
29 vldrwq_gather_base_s32(addr32, -125*4); | |
30 vldrwq_gather_base_s32(addr32, -126*4); | |
31 vldrwq_gather_base_s32(addr32, -127*4); | |
32 vldrwq_gather_base_s32(addr32, 128*4); // expected-error {{argument value 512 is outside the valid range [-508, 508]}} | |
33 vldrwq_gather_base_s32(addr32, -128*4); // expected-error {{argument value -512 is outside the valid range [-508, 508]}} | |
34 vldrwq_gather_base_s32(addr32, 2); // expected-error {{argument should be a multiple of 4}} | |
35 vldrwq_gather_base_s32(addr32, 1); // expected-error {{argument should be a multiple of 4}} | |
36 | |
37 // Show that the polymorphic store intrinsics get the right set of | |
38 // error checks after overload resolution. These ones expand to the | |
39 // 8-byte granular versions... | |
40 vstrdq_scatter_base(addr64, 0, addr64); | |
41 vstrdq_scatter_base(addr64, 8, addr64); | |
42 vstrdq_scatter_base(addr64, 2*8, addr64); | |
43 vstrdq_scatter_base(addr64, 125*8, addr64); | |
44 vstrdq_scatter_base(addr64, 126*8, addr64); | |
45 vstrdq_scatter_base(addr64, 127*8, addr64); | |
46 vstrdq_scatter_base(addr64, -125*8, addr64); | |
47 vstrdq_scatter_base(addr64, -126*8, addr64); | |
48 vstrdq_scatter_base(addr64, -127*8, addr64); | |
49 vstrdq_scatter_base(addr64, 128*8, addr64); // expected-error {{argument value 1024 is outside the valid range [-1016, 1016]}} | |
50 vstrdq_scatter_base(addr64, -128*8, addr64); // expected-error {{argument value -1024 is outside the valid range [-1016, 1016]}} | |
51 vstrdq_scatter_base(addr64, 4, addr64); // expected-error {{argument should be a multiple of 8}} | |
52 vstrdq_scatter_base(addr64, 1, addr64); // expected-error {{argument should be a multiple of 8}} | |
53 | |
54 /// ... and these ones to the 4-byte. | |
55 vstrwq_scatter_base(addr32, 0, addr32); | |
56 vstrwq_scatter_base(addr32, 4, addr32); | |
57 vstrwq_scatter_base(addr32, 2*4, addr32); | |
58 vstrwq_scatter_base(addr32, 125*4, addr32); | |
59 vstrwq_scatter_base(addr32, 126*4, addr32); | |
60 vstrwq_scatter_base(addr32, 127*4, addr32); | |
61 vstrwq_scatter_base(addr32, -125*4, addr32); | |
62 vstrwq_scatter_base(addr32, -126*4, addr32); | |
63 vstrwq_scatter_base(addr32, -127*4, addr32); | |
64 vstrwq_scatter_base(addr32, 128*4, addr32); // expected-error {{argument value 512 is outside the valid range [-508, 508]}} | |
65 vstrwq_scatter_base(addr32, -128*4, addr32); // expected-error {{argument value -512 is outside the valid range [-508, 508]}} | |
66 vstrwq_scatter_base(addr32, 2, addr32); // expected-error {{argument should be a multiple of 4}} | |
67 vstrwq_scatter_base(addr32, 1, addr32); // expected-error {{argument should be a multiple of 4}} | |
68 } | |
69 | |
70 void test_lane_indices(uint8x16_t v16, uint16x8_t v8, | |
71 uint32x4_t v4, uint64x2_t v2) | |
72 { | |
73 vgetq_lane_u8(v16, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} | |
74 vgetq_lane_u8(v16, 0); | |
75 vgetq_lane_u8(v16, 15); | |
76 vgetq_lane_u8(v16, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} | |
77 | |
78 vgetq_lane_u16(v8, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} | |
79 vgetq_lane_u16(v8, 0); | |
80 vgetq_lane_u16(v8, 7); | |
81 vgetq_lane_u16(v8, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} | |
82 | |
83 vgetq_lane_u32(v4, -1); // expected-error {{argument value -1 is outside the valid range [0, 3]}} | |
84 vgetq_lane_u32(v4, 0); | |
85 vgetq_lane_u32(v4, 3); | |
86 vgetq_lane_u32(v4, 4); // expected-error {{argument value 4 is outside the valid range [0, 3]}} | |
87 | |
88 vgetq_lane_u64(v2, -1); // expected-error {{argument value -1 is outside the valid range [0, 1]}} | |
89 vgetq_lane_u64(v2, 0); | |
90 vgetq_lane_u64(v2, 1); | |
91 vgetq_lane_u64(v2, 2); // expected-error {{argument value 2 is outside the valid range [0, 1]}} | |
92 | |
93 vsetq_lane_u8(23, v16, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} | |
94 vsetq_lane_u8(23, v16, 0); | |
95 vsetq_lane_u8(23, v16, 15); | |
96 vsetq_lane_u8(23, v16, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} | |
97 | |
98 vsetq_lane_u16(23, v8, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} | |
99 vsetq_lane_u16(23, v8, 0); | |
100 vsetq_lane_u16(23, v8, 7); | |
101 vsetq_lane_u16(23, v8, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} | |
102 | |
103 vsetq_lane_u32(23, v4, -1); // expected-error {{argument value -1 is outside the valid range [0, 3]}} | |
104 vsetq_lane_u32(23, v4, 0); | |
105 vsetq_lane_u32(23, v4, 3); | |
106 vsetq_lane_u32(23, v4, 4); // expected-error {{argument value 4 is outside the valid range [0, 3]}} | |
107 | |
108 vsetq_lane_u64(23, v2, -1); // expected-error {{argument value -1 is outside the valid range [0, 1]}} | |
109 vsetq_lane_u64(23, v2, 0); | |
110 vsetq_lane_u64(23, v2, 1); | |
111 vsetq_lane_u64(23, v2, 2); // expected-error {{argument value 2 is outside the valid range [0, 1]}} | |
112 } | |
113 | |
114 void test_immediate_shifts(uint8x16_t vb, uint16x8_t vh, uint32x4_t vw) | |
115 { | |
116 vshlq_n(vb, 0); | |
117 vshlq_n(vb, 7); | |
118 vshlq_n(vh, 0); | |
119 vshlq_n(vh, 15); | |
120 vshlq_n(vw, 0); | |
121 vshlq_n(vw, 31); | |
122 | |
123 vshlq_n(vb, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} | |
124 vshlq_n(vb, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} | |
125 vshlq_n(vh, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} | |
126 vshlq_n(vh, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} | |
127 vshlq_n(vw, -1); // expected-error {{argument value -1 is outside the valid range [0, 31]}} | |
128 vshlq_n(vw, 32); // expected-error {{argument value 32 is outside the valid range [0, 31]}} | |
129 | |
130 vqshlq_n(vb, 0); | |
131 vqshlq_n(vb, 7); | |
132 vqshlq_n(vh, 0); | |
133 vqshlq_n(vh, 15); | |
134 vqshlq_n(vw, 0); | |
135 vqshlq_n(vw, 31); | |
136 | |
137 vqshlq_n(vb, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} | |
138 vqshlq_n(vb, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} | |
139 vqshlq_n(vh, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} | |
140 vqshlq_n(vh, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} | |
141 vqshlq_n(vw, -1); // expected-error {{argument value -1 is outside the valid range [0, 31]}} | |
142 vqshlq_n(vw, 32); // expected-error {{argument value 32 is outside the valid range [0, 31]}} | |
143 | |
144 vsliq(vb, vb, 0); | |
145 vsliq(vb, vb, 7); | |
146 vsliq(vh, vh, 0); | |
147 vsliq(vh, vh, 15); | |
148 vsliq(vw, vw, 0); | |
149 vsliq(vw, vw, 31); | |
150 | |
151 vsliq(vb, vb, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} | |
152 vsliq(vb, vb, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} | |
153 vsliq(vh, vh, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} | |
154 vsliq(vh, vh, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} | |
155 vsliq(vw, vw, -1); // expected-error {{argument value -1 is outside the valid range [0, 31]}} | |
156 vsliq(vw, vw, 32); // expected-error {{argument value 32 is outside the valid range [0, 31]}} | |
157 | |
158 vshllbq(vb, 1); | |
159 vshllbq(vb, 8); | |
160 vshllbq(vh, 1); | |
161 vshllbq(vh, 16); | |
162 | |
163 vshllbq(vb, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} | |
164 vshllbq(vb, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} | |
165 vshllbq(vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} | |
166 vshllbq(vh, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} | |
167 | |
168 vshrq(vb, 1); | |
169 vshrq(vb, 8); | |
170 vshrq(vh, 1); | |
171 vshrq(vh, 16); | |
172 vshrq(vw, 1); | |
173 vshrq(vw, 32); | |
174 | |
175 vshrq(vb, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} | |
176 vshrq(vb, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} | |
177 vshrq(vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} | |
178 vshrq(vh, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} | |
179 vshrq(vw, 0); // expected-error {{argument value 0 is outside the valid range [1, 32]}} | |
180 vshrq(vw, 33); // expected-error {{argument value 33 is outside the valid range [1, 32]}} | |
181 | |
182 vshrntq(vb, vh, 1); | |
183 vshrntq(vb, vh, 8); | |
184 vshrntq(vh, vw, 1); | |
185 vshrntq(vh, vw, 16); | |
186 | |
187 vshrntq(vb, vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} | |
188 vshrntq(vb, vh, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} | |
189 vshrntq(vh, vw, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} | |
190 vshrntq(vh, vw, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} | |
191 | |
192 vsriq(vb, vb, 1); | |
193 vsriq(vb, vb, 8); | |
194 vsriq(vh, vh, 1); | |
195 vsriq(vh, vh, 16); | |
196 vsriq(vw, vw, 1); | |
197 vsriq(vw, vw, 32); | |
198 | |
199 vsriq(vb, vb, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} | |
200 vsriq(vb, vb, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} | |
201 vsriq(vh, vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} | |
202 vsriq(vh, vh, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} | |
203 vsriq(vw, vw, 0); // expected-error {{argument value 0 is outside the valid range [1, 32]}} | |
204 vsriq(vw, vw, 33); // expected-error {{argument value 33 is outside the valid range [1, 32]}} | |
205 } | |
206 | |
207 void test_simd_bic_orr(int16x8_t h, int32x4_t w) | |
208 { | |
209 h = vbicq(h, 0x0000); | |
210 h = vbicq(h, 0x0001); | |
211 h = vbicq(h, 0x00FF); | |
212 h = vbicq(h, 0x0100); | |
213 h = vbicq(h, 0x0101); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
214 h = vbicq(h, 0x01FF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
215 h = vbicq(h, 0xFF00); | |
216 | |
217 w = vbicq(w, 0x00000000); | |
218 w = vbicq(w, 0x00000001); | |
219 w = vbicq(w, 0x000000FF); | |
220 w = vbicq(w, 0x00000100); | |
221 w = vbicq(w, 0x0000FF00); | |
222 w = vbicq(w, 0x00010000); | |
223 w = vbicq(w, 0x00FF0000); | |
224 w = vbicq(w, 0x01000000); | |
225 w = vbicq(w, 0xFF000000); | |
226 w = vbicq(w, 0x01000001); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
227 w = vbicq(w, 0x01FFFFFF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
228 | |
229 h = vorrq(h, 0x0000); | |
230 h = vorrq(h, 0x0001); | |
231 h = vorrq(h, 0x00FF); | |
232 h = vorrq(h, 0x0100); | |
233 h = vorrq(h, 0x0101); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
234 h = vorrq(h, 0x01FF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
235 h = vorrq(h, 0xFF00); | |
236 | |
237 w = vorrq(w, 0x00000000); | |
238 w = vorrq(w, 0x00000001); | |
239 w = vorrq(w, 0x000000FF); | |
240 w = vorrq(w, 0x00000100); | |
241 w = vorrq(w, 0x0000FF00); | |
242 w = vorrq(w, 0x00010000); | |
243 w = vorrq(w, 0x00FF0000); | |
244 w = vorrq(w, 0x01000000); | |
245 w = vorrq(w, 0xFF000000); | |
246 w = vorrq(w, 0x01000001); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
247 w = vorrq(w, 0x01FFFFFF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} | |
248 } | |
249 | |
250 void test_simd_vmvn(void) | |
251 { | |
252 uint16x8_t h; | |
253 h = vmvnq_n_u16(0x0000); | |
254 h = vmvnq_n_u16(0x0001); | |
255 h = vmvnq_n_u16(0x00FF); | |
256 h = vmvnq_n_u16(0x0100); | |
257 h = vmvnq_n_u16(0x0101); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} | |
258 h = vmvnq_n_u16(0x01FF); | |
259 h = vmvnq_n_u16(0xFF00); | |
260 | |
261 uint32x4_t w; | |
262 w = vmvnq_n_u32(0x00000000); | |
263 w = vmvnq_n_u32(0x00000001); | |
264 w = vmvnq_n_u32(0x000000FF); | |
265 w = vmvnq_n_u32(0x00000100); | |
266 w = vmvnq_n_u32(0x0000FF00); | |
267 w = vmvnq_n_u32(0x00010000); | |
268 w = vmvnq_n_u32(0x00FF0000); | |
269 w = vmvnq_n_u32(0x01000000); | |
270 w = vmvnq_n_u32(0xFF000000); | |
271 w = vmvnq_n_u32(0x01000001); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} | |
272 w = vmvnq_n_u32(0x01FFFFFF); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} | |
273 w = vmvnq_n_u32(0x0001FFFF); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} | |
274 w = vmvnq_n_u32(0x000001FF); | |
275 } | |
276 | |
277 void test_vidup(void) | |
278 { | |
279 vidupq_n_u16(0x12345678, 1); | |
280 vidupq_n_u16(0x12345678, 2); | |
281 vidupq_n_u16(0x12345678, 4); | |
282 vidupq_n_u16(0x12345678, 8); | |
283 | |
284 vidupq_n_u16(0x12345678, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} | |
285 vidupq_n_u16(0x12345678, 16); // expected-error {{argument value 16 is outside the valid range [1, 8]}} | |
286 vidupq_n_u16(0x12345678, -1); // expected-error {{argument value -1 is outside the valid range [1, 8]}} | |
287 vidupq_n_u16(0x12345678, -2); // expected-error {{argument value -2 is outside the valid range [1, 8]}} | |
288 vidupq_n_u16(0x12345678, -4); // expected-error {{argument value -4 is outside the valid range [1, 8]}} | |
289 vidupq_n_u16(0x12345678, -8); // expected-error {{argument value -8 is outside the valid range [1, 8]}} | |
290 vidupq_n_u16(0x12345678, 3); // expected-error {{argument should be a power of 2}} | |
291 vidupq_n_u16(0x12345678, 7); // expected-error {{argument should be a power of 2}} | |
292 } | |
293 | |
294 void test_vcvtq(void) | |
295 { | |
296 uint16x8_t vec_u16; | |
297 float16x8_t vec_f16; | |
298 vcvtq_n_f16_u16(vec_u16, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} | |
299 vcvtq_n_f16_u16(vec_u16, 1); | |
300 vcvtq_n_f16_u16(vec_u16, 16); | |
301 vcvtq_n_f16_u16(vec_u16, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} | |
302 | |
303 int32x4_t vec_s32; | |
304 float32x4_t vec_f32; | |
305 vcvtq_n_s32_f32(vec_s32, -1); // expected-error {{argument value -1 is outside the valid range [1, 32]}} | |
306 vcvtq_n_s32_f32(vec_s32, 1); | |
307 vcvtq_n_s32_f32(vec_s32, 32); | |
308 vcvtq_n_s32_f32(vec_s32, 33); // expected-error {{argument value 33 is outside the valid range [1, 32]}} | |
309 } |