1 // min-llvm-version: 10.0.1
2 // assembly-output: emit-asm
4 // compile-flags: --target armv7-unknown-linux-gnueabihf
5 // compile-flags: -C target-feature=+neon
6 // needs-llvm-components: arm
8 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
9 #![crate_type = "rlib"]
11 #![allow(asm_sub_register, non_camel_case_types)]
13 #[rustc_builtin_macro]
17 #[rustc_builtin_macro]
21 #[rustc_builtin_macro]
22 macro_rules! stringify {
32 pub struct f32x4(f32, f32, f32, f32);
37 impl Copy for f32x4 {}
40 ($func:ident $modifier:literal $reg:ident $ty:ident $mov:literal) => {
41 // -O and extern "C" guarantee that the selected register is always r0/s0/d0/q0
43 pub unsafe extern "C" fn $func() -> $ty {
44 // Hack to avoid function merging
46 fn dont_merge(s: &str);
48 dont_merge(stringify!($func));
51 asm!(concat!($mov, " {0:", $modifier, "}, {0:", $modifier, "}"), out($reg) y);
61 check!(reg "" reg i32 "mov");
63 // CHECK-LABEL: reg_thumb:
67 check!(reg_thumb "" reg_thumb i32 "mov");
71 // CHECK: vmov.f32 s0, s0
73 check!(sreg "" sreg f32 "vmov.f32");
75 // CHECK-LABEL: sreg_low16:
77 // CHECK: vmov.f32 s0, s0
79 check!(sreg_low16 "" sreg_low16 f32 "vmov.f32");
83 // CHECK: vmov.f64 d0, d0
85 check!(dreg "" dreg f64 "vmov.f64");
87 // CHECK-LABEL: dreg_low16:
89 // CHECK: vmov.f64 d0, d0
91 check!(dreg_low16 "" dreg_low16 f64 "vmov.f64");
93 // CHECK-LABEL: dreg_low8:
95 // CHECK: vmov.f64 d0, d0
97 check!(dreg_low8 "" dreg_low8 f64 "vmov.f64");
101 // CHECK: vorr q0, q0, q0
103 check!(qreg "" qreg f32x4 "vmov");
105 // CHECK-LABEL: qreg_e:
107 // CHECK: vmov.f64 d0, d0
109 check!(qreg_e "e" qreg f32x4 "vmov.f64");
111 // CHECK-LABEL: qreg_f:
113 // CHECK: vmov.f64 d1, d1
115 check!(qreg_f "f" qreg f32x4 "vmov.f64");
117 // CHECK-LABEL: qreg_low8:
119 // CHECK: vorr q0, q0, q0
121 check!(qreg_low8 "" qreg_low8 f32x4 "vmov");
123 // CHECK-LABEL: qreg_low8_e:
125 // CHECK: vmov.f64 d0, d0
127 check!(qreg_low8_e "e" qreg_low8 f32x4 "vmov.f64");
129 // CHECK-LABEL: qreg_low8_f:
131 // CHECK: vmov.f64 d1, d1
133 check!(qreg_low8_f "f" qreg_low8 f32x4 "vmov.f64");
135 // CHECK-LABEL: qreg_low4:
137 // CHECK: vorr q0, q0, q0
139 check!(qreg_low4 "" qreg_low4 f32x4 "vmov");
141 // CHECK-LABEL: qreg_low4_e:
143 // CHECK: vmov.f64 d0, d0
145 check!(qreg_low4_e "e" qreg_low4 f32x4 "vmov.f64");
147 // CHECK-LABEL: qreg_low4_f:
149 // CHECK: vmov.f64 d1, d1
151 check!(qreg_low4_f "f" qreg_low4 f32x4 "vmov.f64");