2 // assembly-output: emit-asm
3 // compile-flags: --target armv7-unknown-linux-gnueabihf
4 // compile-flags: -C target-feature=+neon
6 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
7 #![crate_type = "rlib"]
9 #![allow(asm_sub_register, non_camel_case_types)]
11 #[rustc_builtin_macro]
15 #[rustc_builtin_macro]
19 #[rustc_builtin_macro]
20 macro_rules
! stringify
{
32 pub struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
34 pub struct i16x4(i16, i16, i16, i16);
36 pub struct i32x2(i32, i32);
38 pub struct i64x1(i64);
40 pub struct f32x2(f32, f32);
42 pub struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
44 pub struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
46 pub struct i32x4(i32, i32, i32, i32);
48 pub struct i64x2(i64, i64);
50 pub struct f32x4(f32, f32, f32, f32);
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 {}
72 static extern_static
: u8;
75 // CHECK-LABEL: sym_fn:
77 // CHECK: bl extern_func
80 pub unsafe fn sym_fn() {
81 asm
!("bl {}", sym extern_func
);
84 // CHECK-LABEL: sym_static:
86 // CHECK: adr r0, extern_static
89 pub unsafe fn sym_static() {
90 asm
!("adr r0, {}", sym extern_static
);
94 ($func
:ident $ty
:ident $class
:ident $mov
:literal
) => {
96 pub unsafe fn $
func(x
: $ty
) -> $ty
{
97 // Hack to avoid function merging
99 fn dont_merge(s
: &str);
101 dont_merge(stringify
!($func
));
104 asm
!(concat
!($mov
, " {}, {}"), out($class
) y
, in($class
) x
);
110 // CHECK-LABEL: reg_i8:
112 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
114 check
!(reg_i8
i8 reg
"mov");
116 // CHECK-LABEL: reg_i16:
118 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
120 check
!(reg_i16
i16 reg
"mov");
122 // CHECK-LABEL: reg_i32:
124 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
126 check
!(reg_i32
i32 reg
"mov");
128 // CHECK-LABEL: reg_f32:
130 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
132 check
!(reg_f32
f32 reg
"mov");
134 // CHECK-LABEL: reg_ptr:
136 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
138 check
!(reg_ptr ptr reg
"mov");
140 // CHECK-LABEL: reg_thumb_i8:
142 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
144 check
!(reg_thumb_i8
i8 reg_thumb
"mov");
146 // CHECK-LABEL: reg_thumb_i16:
148 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
150 check
!(reg_thumb_i16
i16 reg_thumb
"mov");
152 // CHECK-LABEL: reg_thumb_i32:
154 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
156 check
!(reg_thumb_i32
i32 reg_thumb
"mov");
158 // CHECK-LABEL: reg_thumb_f32:
160 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
162 check
!(reg_thumb_f32
f32 reg_thumb
"mov");
164 // CHECK-LABEL: reg_thumb_ptr:
166 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
168 check
!(reg_thumb_ptr ptr reg_thumb
"mov");
170 // CHECK-LABEL: sreg_i32:
172 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
174 check
!(sreg_i32
i32 sreg
"vmov.f32");
176 // CHECK-LABEL: sreg_f32:
178 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
180 check
!(sreg_f32
f32 sreg
"vmov.f32");
182 // CHECK-LABEL: sreg_ptr:
184 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
186 check
!(sreg_ptr ptr sreg
"vmov.f32");
188 // CHECK-LABEL: sreg_low16_i32:
190 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
192 check
!(sreg_low16_i32
i32 sreg_low16
"vmov.f32");
194 // CHECK-LABEL: sreg_low16_f32:
196 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
198 check
!(sreg_low16_f32
f32 sreg_low16
"vmov.f32");
200 // CHECK-LABEL: dreg_i64:
202 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
204 check
!(dreg_i64
i64 dreg
"vmov.f64");
206 // CHECK-LABEL: dreg_f64:
208 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
210 check
!(dreg_f64
f64 dreg
"vmov.f64");
212 // CHECK-LABEL: dreg_i8x8:
214 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
216 check
!(dreg_i8x8 i8x8 dreg
"vmov.f64");
218 // CHECK-LABEL: dreg_i16x4:
220 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
222 check
!(dreg_i16x4 i16x4 dreg
"vmov.f64");
224 // CHECK-LABEL: dreg_i32x2:
226 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
228 check
!(dreg_i32x2 i32x2 dreg
"vmov.f64");
230 // CHECK-LABEL: dreg_i64x1:
232 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
234 check
!(dreg_i64x1 i64x1 dreg
"vmov.f64");
236 // CHECK-LABEL: dreg_f32x2:
238 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
240 check
!(dreg_f32x2 f32x2 dreg
"vmov.f64");
242 // CHECK-LABEL: dreg_low16_i64:
244 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
246 check
!(dreg_low16_i64
i64 dreg_low16
"vmov.f64");
248 // CHECK-LABEL: dreg_low16_f64:
250 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
252 check
!(dreg_low16_f64
f64 dreg_low16
"vmov.f64");
254 // CHECK-LABEL: dreg_low16_i8x8:
256 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
258 check
!(dreg_low16_i8x8 i8x8 dreg_low16
"vmov.f64");
260 // CHECK-LABEL: dreg_low16_i16x4:
262 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
264 check
!(dreg_low16_i16x4 i16x4 dreg_low16
"vmov.f64");
266 // CHECK-LABEL: dreg_low16_i32x2:
268 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
270 check
!(dreg_low16_i32x2 i32x2 dreg_low16
"vmov.f64");
272 // CHECK-LABEL: dreg_low16_i64x1:
274 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
276 check
!(dreg_low16_i64x1 i64x1 dreg_low16
"vmov.f64");
278 // CHECK-LABEL: dreg_low16_f32x2:
280 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
282 check
!(dreg_low16_f32x2 f32x2 dreg_low16
"vmov.f64");
284 // CHECK-LABEL: dreg_low8_i64:
286 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
288 check
!(dreg_low8_i64
i64 dreg_low8
"vmov.f64");
290 // CHECK-LABEL: dreg_low8_f64:
292 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
294 check
!(dreg_low8_f64
f64 dreg_low8
"vmov.f64");
296 // CHECK-LABEL: dreg_low8_i8x8:
298 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
300 check
!(dreg_low8_i8x8 i8x8 dreg_low8
"vmov.f64");
302 // CHECK-LABEL: dreg_low8_i16x4:
304 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
306 check
!(dreg_low8_i16x4 i16x4 dreg_low8
"vmov.f64");
308 // CHECK-LABEL: dreg_low8_i32x2:
310 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
312 check
!(dreg_low8_i32x2 i32x2 dreg_low8
"vmov.f64");
314 // CHECK-LABEL: dreg_low8_i64x1:
316 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
318 check
!(dreg_low8_i64x1 i64x1 dreg_low8
"vmov.f64");
320 // CHECK-LABEL: dreg_low8_f32x2:
322 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
324 check
!(dreg_low8_f32x2 f32x2 dreg_low8
"vmov.f64");
326 // CHECK-LABEL: qreg_i8x16:
328 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
330 check
!(qreg_i8x16 i8x16 qreg
"vmov");
332 // CHECK-LABEL: qreg_i16x8:
334 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
336 check
!(qreg_i16x8 i16x8 qreg
"vmov");
338 // CHECK-LABEL: qreg_i32x4:
340 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
342 check
!(qreg_i32x4 i32x4 qreg
"vmov");
344 // CHECK-LABEL: qreg_i64x2:
346 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
348 check
!(qreg_i64x2 i64x2 qreg
"vmov");
350 // CHECK-LABEL: qreg_f32x4:
352 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
354 check
!(qreg_f32x4 f32x4 qreg
"vmov");
356 // CHECK-LABEL: qreg_low8_i8x16:
358 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
360 check
!(qreg_low8_i8x16 i8x16 qreg_low8
"vmov");
362 // CHECK-LABEL: qreg_low8_i16x8:
364 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
366 check
!(qreg_low8_i16x8 i16x8 qreg_low8
"vmov");
368 // CHECK-LABEL: qreg_low8_i32x4:
370 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
372 check
!(qreg_low8_i32x4 i32x4 qreg_low8
"vmov");
374 // CHECK-LABEL: qreg_low8_i64x2:
376 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
378 check
!(qreg_low8_i64x2 i64x2 qreg_low8
"vmov");
380 // CHECK-LABEL: qreg_low8_f32x4:
382 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
384 check
!(qreg_low8_f32x4 f32x4 qreg_low8
"vmov");
386 // CHECK-LABEL: qreg_low4_i8x16:
388 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
390 check
!(qreg_low4_i8x16 i8x16 qreg_low4
"vmov");
392 // CHECK-LABEL: qreg_low4_i16x8:
394 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
396 check
!(qreg_low4_i16x8 i16x8 qreg_low4
"vmov");
398 // CHECK-LABEL: qreg_low4_i32x4:
400 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
402 check
!(qreg_low4_i32x4 i32x4 qreg_low4
"vmov");
404 // CHECK-LABEL: qreg_low4_i64x2:
406 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
408 check
!(qreg_low4_i64x2 i64x2 qreg_low4
"vmov");
410 // CHECK-LABEL: qreg_low4_f32x4:
412 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
414 check
!(qreg_low4_f32x4 f32x4 qreg_low4
"vmov");