1 // min-llvm-version: 10.0.1
2 // assembly-output: emit-asm
3 // compile-flags: --target hexagon-unknown-linux-musl
4 // needs-llvm-components: hexagon
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 {
29 type ptr = *const i32;
38 static extern_static: u8;
42 ($func:ident $ty:ident $class:ident) => {
44 pub unsafe fn $func(x: $ty) -> $ty {
45 // Hack to avoid function merging
47 fn dont_merge(s: &str);
49 dont_merge(stringify!($func));
52 asm!("{} = {}", out($class) y, in($class) x);
58 macro_rules! check_reg {
59 ($func:ident $ty:ident $reg:tt) => {
61 pub unsafe fn $func(x: $ty) -> $ty {
62 // Hack to avoid function merging
64 fn dont_merge(s: &str);
66 dont_merge(stringify!($func));
69 asm!(concat!($reg, " = ", $reg), lateout($reg) y, in($reg) x);
75 // CHECK-LABEL: sym_static:
76 // CHECK: InlineAsm Start
77 // CHECK: r0 = #extern_static
78 // CHECK: InlineAsm End
80 pub unsafe fn sym_static() {
81 // Hack to avoid function merging
83 fn dont_merge(s: &str);
85 dont_merge(stringify!($func));
87 asm!("r0 = #{}", sym extern_static);
90 // CHECK-LABEL: sym_fn:
91 // CHECK: InlineAsm Start
92 // CHECK: r0 = #extern_func
93 // CHECK: InlineAsm End
95 pub unsafe fn sym_fn() {
96 // Hack to avoid function merging
98 fn dont_merge(s: &str);
100 dont_merge(stringify!($func));
102 asm!("r0 = #{}", sym extern_func);
105 // This is a test for multi-instruction packets,
106 // which require the escaped braces.
108 // CHECK-LABEL: packet:
109 // CHECK: InlineAsm Start
111 // CHECK: r{{[0-9]+}} = r0
112 // CHECK: memw(r1) = r{{[0-9]+}}
114 // CHECK: InlineAsm End
116 pub unsafe fn packet() {
121 }}", out(reg) _, in(reg) &val);
124 // CHECK-LABEL: reg_ptr:
125 // CHECK: InlineAsm Start
126 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
127 // CHECK: InlineAsm End
128 check!(reg_ptr ptr reg);
130 // CHECK-LABEL: reg_f32:
131 // CHECK: InlineAsm Start
132 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
133 // CHECK: InlineAsm End
134 check!(reg_f32 f32 reg);
136 // CHECK-LABEL: reg_i32:
137 // CHECK: InlineAsm Start
138 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
139 // CHECK: InlineAsm End
140 check!(reg_i32 i32 reg);
142 // CHECK-LABEL: reg_i8:
143 // CHECK: InlineAsm Start
144 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
145 // CHECK: InlineAsm End
146 check!(reg_i8 i8 reg);
148 // CHECK-LABEL: reg_i16:
149 // CHECK: InlineAsm Start
150 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
151 // CHECK: InlineAsm End
152 check!(reg_i16 i16 reg);
154 // CHECK-LABEL: r0_ptr:
155 // CHECK: InlineAsm Start
157 // CHECK: InlineAsm End
158 check_reg!(r0_ptr ptr "r0");
160 // CHECK-LABEL: r0_f32:
161 // CHECK: InlineAsm Start
163 // CHECK: InlineAsm End
164 check_reg!(r0_f32 f32 "r0");
166 // CHECK-LABEL: r0_i32:
167 // CHECK: InlineAsm Start
169 // CHECK: InlineAsm End
170 check_reg!(r0_i32 i32 "r0");
172 // CHECK-LABEL: r0_i8:
173 // CHECK: InlineAsm Start
175 // CHECK: InlineAsm End
176 check_reg!(r0_i8 i8 "r0");
178 // CHECK-LABEL: r0_i16:
179 // CHECK: InlineAsm Start
181 // CHECK: InlineAsm End
182 check_reg!(r0_i16 i16 "r0");