]> git.proxmox.com Git - rustc.git/blob - src/test/assembly/asm/arm-types.rs
Merge branch 'debian/experimental' into debian/sid
[rustc.git] / src / test / assembly / asm / arm-types.rs
1 // no-system-llvm
2 // assembly-output: emit-asm
3 // compile-flags: --target armv7-unknown-linux-gnueabihf
4 // compile-flags: -C target-feature=+neon
5
6 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
7 #![crate_type = "rlib"]
8 #![no_core]
9 #![allow(asm_sub_register, non_camel_case_types)]
10
11 #[rustc_builtin_macro]
12 macro_rules! asm {
13 () => {};
14 }
15 #[rustc_builtin_macro]
16 macro_rules! concat {
17 () => {};
18 }
19 #[rustc_builtin_macro]
20 macro_rules! stringify {
21 () => {};
22 }
23
24 #[lang = "sized"]
25 trait Sized {}
26 #[lang = "copy"]
27 trait Copy {}
28
29 type ptr = *mut u8;
30
31 #[repr(simd)]
32 pub struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
33 #[repr(simd)]
34 pub struct i16x4(i16, i16, i16, i16);
35 #[repr(simd)]
36 pub struct i32x2(i32, i32);
37 #[repr(simd)]
38 pub struct i64x1(i64);
39 #[repr(simd)]
40 pub struct f32x2(f32, f32);
41 #[repr(simd)]
42 pub struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
43 #[repr(simd)]
44 pub struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
45 #[repr(simd)]
46 pub struct i32x4(i32, i32, i32, i32);
47 #[repr(simd)]
48 pub struct i64x2(i64, i64);
49 #[repr(simd)]
50 pub struct f32x4(f32, f32, f32, f32);
51
52 impl Copy for i8 {}
53 impl Copy for i16 {}
54 impl Copy for i32 {}
55 impl Copy for f32 {}
56 impl Copy for i64 {}
57 impl Copy for f64 {}
58 impl Copy for ptr {}
59 impl Copy for i8x8 {}
60 impl Copy for i16x4 {}
61 impl Copy for i32x2 {}
62 impl Copy for i64x1 {}
63 impl Copy for f32x2 {}
64 impl Copy for i8x16 {}
65 impl Copy for i16x8 {}
66 impl Copy for i32x4 {}
67 impl Copy for i64x2 {}
68 impl Copy for f32x4 {}
69
70 extern "C" {
71 fn extern_func();
72 static extern_static: u8;
73 }
74
75 // CHECK-LABEL: sym_fn:
76 // CHECK: @APP
77 // CHECK: bl extern_func
78 // CHECK: @NO_APP
79 #[no_mangle]
80 pub unsafe fn sym_fn() {
81 asm!("bl {}", sym extern_func);
82 }
83
84 // CHECK-LABEL: sym_static:
85 // CHECK: @APP
86 // CHECK: adr r0, extern_static
87 // CHECK: @NO_APP
88 #[no_mangle]
89 pub unsafe fn sym_static() {
90 asm!("adr r0, {}", sym extern_static);
91 }
92
93 macro_rules! check {
94 ($func:ident $ty:ident $class:ident $mov:literal) => {
95 #[no_mangle]
96 pub unsafe fn $func(x: $ty) -> $ty {
97 // Hack to avoid function merging
98 extern "Rust" {
99 fn dont_merge(s: &str);
100 }
101 dont_merge(stringify!($func));
102
103 let y;
104 asm!(concat!($mov, " {}, {}"), out($class) y, in($class) x);
105 y
106 }
107 };
108 }
109
110 // CHECK-LABEL: reg_i8:
111 // CHECK: @APP
112 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
113 // CHECK: @NO_APP
114 check!(reg_i8 i8 reg "mov");
115
116 // CHECK-LABEL: reg_i16:
117 // CHECK: @APP
118 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
119 // CHECK: @NO_APP
120 check!(reg_i16 i16 reg "mov");
121
122 // CHECK-LABEL: reg_i32:
123 // CHECK: @APP
124 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
125 // CHECK: @NO_APP
126 check!(reg_i32 i32 reg "mov");
127
128 // CHECK-LABEL: reg_f32:
129 // CHECK: @APP
130 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
131 // CHECK: @NO_APP
132 check!(reg_f32 f32 reg "mov");
133
134 // CHECK-LABEL: reg_ptr:
135 // CHECK: @APP
136 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
137 // CHECK: @NO_APP
138 check!(reg_ptr ptr reg "mov");
139
140 // CHECK-LABEL: reg_thumb_i8:
141 // CHECK: @APP
142 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
143 // CHECK: @NO_APP
144 check!(reg_thumb_i8 i8 reg_thumb "mov");
145
146 // CHECK-LABEL: reg_thumb_i16:
147 // CHECK: @APP
148 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
149 // CHECK: @NO_APP
150 check!(reg_thumb_i16 i16 reg_thumb "mov");
151
152 // CHECK-LABEL: reg_thumb_i32:
153 // CHECK: @APP
154 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
155 // CHECK: @NO_APP
156 check!(reg_thumb_i32 i32 reg_thumb "mov");
157
158 // CHECK-LABEL: reg_thumb_f32:
159 // CHECK: @APP
160 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
161 // CHECK: @NO_APP
162 check!(reg_thumb_f32 f32 reg_thumb "mov");
163
164 // CHECK-LABEL: reg_thumb_ptr:
165 // CHECK: @APP
166 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
167 // CHECK: @NO_APP
168 check!(reg_thumb_ptr ptr reg_thumb "mov");
169
170 // CHECK-LABEL: sreg_i32:
171 // CHECK: @APP
172 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
173 // CHECK: @NO_APP
174 check!(sreg_i32 i32 sreg "vmov.f32");
175
176 // CHECK-LABEL: sreg_f32:
177 // CHECK: @APP
178 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
179 // CHECK: @NO_APP
180 check!(sreg_f32 f32 sreg "vmov.f32");
181
182 // CHECK-LABEL: sreg_ptr:
183 // CHECK: @APP
184 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
185 // CHECK: @NO_APP
186 check!(sreg_ptr ptr sreg "vmov.f32");
187
188 // CHECK-LABEL: sreg_low16_i32:
189 // CHECK: @APP
190 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
191 // CHECK: @NO_APP
192 check!(sreg_low16_i32 i32 sreg_low16 "vmov.f32");
193
194 // CHECK-LABEL: sreg_low16_f32:
195 // CHECK: @APP
196 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
197 // CHECK: @NO_APP
198 check!(sreg_low16_f32 f32 sreg_low16 "vmov.f32");
199
200 // CHECK-LABEL: dreg_i64:
201 // CHECK: @APP
202 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
203 // CHECK: @NO_APP
204 check!(dreg_i64 i64 dreg "vmov.f64");
205
206 // CHECK-LABEL: dreg_f64:
207 // CHECK: @APP
208 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
209 // CHECK: @NO_APP
210 check!(dreg_f64 f64 dreg "vmov.f64");
211
212 // CHECK-LABEL: dreg_i8x8:
213 // CHECK: @APP
214 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
215 // CHECK: @NO_APP
216 check!(dreg_i8x8 i8x8 dreg "vmov.f64");
217
218 // CHECK-LABEL: dreg_i16x4:
219 // CHECK: @APP
220 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
221 // CHECK: @NO_APP
222 check!(dreg_i16x4 i16x4 dreg "vmov.f64");
223
224 // CHECK-LABEL: dreg_i32x2:
225 // CHECK: @APP
226 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
227 // CHECK: @NO_APP
228 check!(dreg_i32x2 i32x2 dreg "vmov.f64");
229
230 // CHECK-LABEL: dreg_i64x1:
231 // CHECK: @APP
232 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
233 // CHECK: @NO_APP
234 check!(dreg_i64x1 i64x1 dreg "vmov.f64");
235
236 // CHECK-LABEL: dreg_f32x2:
237 // CHECK: @APP
238 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
239 // CHECK: @NO_APP
240 check!(dreg_f32x2 f32x2 dreg "vmov.f64");
241
242 // CHECK-LABEL: dreg_low16_i64:
243 // CHECK: @APP
244 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
245 // CHECK: @NO_APP
246 check!(dreg_low16_i64 i64 dreg_low16 "vmov.f64");
247
248 // CHECK-LABEL: dreg_low16_f64:
249 // CHECK: @APP
250 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
251 // CHECK: @NO_APP
252 check!(dreg_low16_f64 f64 dreg_low16 "vmov.f64");
253
254 // CHECK-LABEL: dreg_low16_i8x8:
255 // CHECK: @APP
256 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
257 // CHECK: @NO_APP
258 check!(dreg_low16_i8x8 i8x8 dreg_low16 "vmov.f64");
259
260 // CHECK-LABEL: dreg_low16_i16x4:
261 // CHECK: @APP
262 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
263 // CHECK: @NO_APP
264 check!(dreg_low16_i16x4 i16x4 dreg_low16 "vmov.f64");
265
266 // CHECK-LABEL: dreg_low16_i32x2:
267 // CHECK: @APP
268 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
269 // CHECK: @NO_APP
270 check!(dreg_low16_i32x2 i32x2 dreg_low16 "vmov.f64");
271
272 // CHECK-LABEL: dreg_low16_i64x1:
273 // CHECK: @APP
274 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
275 // CHECK: @NO_APP
276 check!(dreg_low16_i64x1 i64x1 dreg_low16 "vmov.f64");
277
278 // CHECK-LABEL: dreg_low16_f32x2:
279 // CHECK: @APP
280 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
281 // CHECK: @NO_APP
282 check!(dreg_low16_f32x2 f32x2 dreg_low16 "vmov.f64");
283
284 // CHECK-LABEL: dreg_low8_i64:
285 // CHECK: @APP
286 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
287 // CHECK: @NO_APP
288 check!(dreg_low8_i64 i64 dreg_low8 "vmov.f64");
289
290 // CHECK-LABEL: dreg_low8_f64:
291 // CHECK: @APP
292 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
293 // CHECK: @NO_APP
294 check!(dreg_low8_f64 f64 dreg_low8 "vmov.f64");
295
296 // CHECK-LABEL: dreg_low8_i8x8:
297 // CHECK: @APP
298 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
299 // CHECK: @NO_APP
300 check!(dreg_low8_i8x8 i8x8 dreg_low8 "vmov.f64");
301
302 // CHECK-LABEL: dreg_low8_i16x4:
303 // CHECK: @APP
304 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
305 // CHECK: @NO_APP
306 check!(dreg_low8_i16x4 i16x4 dreg_low8 "vmov.f64");
307
308 // CHECK-LABEL: dreg_low8_i32x2:
309 // CHECK: @APP
310 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
311 // CHECK: @NO_APP
312 check!(dreg_low8_i32x2 i32x2 dreg_low8 "vmov.f64");
313
314 // CHECK-LABEL: dreg_low8_i64x1:
315 // CHECK: @APP
316 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
317 // CHECK: @NO_APP
318 check!(dreg_low8_i64x1 i64x1 dreg_low8 "vmov.f64");
319
320 // CHECK-LABEL: dreg_low8_f32x2:
321 // CHECK: @APP
322 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
323 // CHECK: @NO_APP
324 check!(dreg_low8_f32x2 f32x2 dreg_low8 "vmov.f64");
325
326 // CHECK-LABEL: qreg_i8x16:
327 // CHECK: @APP
328 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
329 // CHECK: @NO_APP
330 check!(qreg_i8x16 i8x16 qreg "vmov");
331
332 // CHECK-LABEL: qreg_i16x8:
333 // CHECK: @APP
334 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
335 // CHECK: @NO_APP
336 check!(qreg_i16x8 i16x8 qreg "vmov");
337
338 // CHECK-LABEL: qreg_i32x4:
339 // CHECK: @APP
340 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
341 // CHECK: @NO_APP
342 check!(qreg_i32x4 i32x4 qreg "vmov");
343
344 // CHECK-LABEL: qreg_i64x2:
345 // CHECK: @APP
346 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
347 // CHECK: @NO_APP
348 check!(qreg_i64x2 i64x2 qreg "vmov");
349
350 // CHECK-LABEL: qreg_f32x4:
351 // CHECK: @APP
352 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
353 // CHECK: @NO_APP
354 check!(qreg_f32x4 f32x4 qreg "vmov");
355
356 // CHECK-LABEL: qreg_low8_i8x16:
357 // CHECK: @APP
358 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
359 // CHECK: @NO_APP
360 check!(qreg_low8_i8x16 i8x16 qreg_low8 "vmov");
361
362 // CHECK-LABEL: qreg_low8_i16x8:
363 // CHECK: @APP
364 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
365 // CHECK: @NO_APP
366 check!(qreg_low8_i16x8 i16x8 qreg_low8 "vmov");
367
368 // CHECK-LABEL: qreg_low8_i32x4:
369 // CHECK: @APP
370 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
371 // CHECK: @NO_APP
372 check!(qreg_low8_i32x4 i32x4 qreg_low8 "vmov");
373
374 // CHECK-LABEL: qreg_low8_i64x2:
375 // CHECK: @APP
376 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
377 // CHECK: @NO_APP
378 check!(qreg_low8_i64x2 i64x2 qreg_low8 "vmov");
379
380 // CHECK-LABEL: qreg_low8_f32x4:
381 // CHECK: @APP
382 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
383 // CHECK: @NO_APP
384 check!(qreg_low8_f32x4 f32x4 qreg_low8 "vmov");
385
386 // CHECK-LABEL: qreg_low4_i8x16:
387 // CHECK: @APP
388 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
389 // CHECK: @NO_APP
390 check!(qreg_low4_i8x16 i8x16 qreg_low4 "vmov");
391
392 // CHECK-LABEL: qreg_low4_i16x8:
393 // CHECK: @APP
394 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
395 // CHECK: @NO_APP
396 check!(qreg_low4_i16x8 i16x8 qreg_low4 "vmov");
397
398 // CHECK-LABEL: qreg_low4_i32x4:
399 // CHECK: @APP
400 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
401 // CHECK: @NO_APP
402 check!(qreg_low4_i32x4 i32x4 qreg_low4 "vmov");
403
404 // CHECK-LABEL: qreg_low4_i64x2:
405 // CHECK: @APP
406 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
407 // CHECK: @NO_APP
408 check!(qreg_low4_i64x2 i64x2 qreg_low4 "vmov");
409
410 // CHECK-LABEL: qreg_low4_f32x4:
411 // CHECK: @APP
412 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
413 // CHECK: @NO_APP
414 check!(qreg_low4_f32x4 f32x4 qreg_low4 "vmov");