1 // min-llvm-version: 10.0.1
2 // assembly-output: emit-asm
3 // compile-flags: --target bpfel-unknown-none -C target_feature=+alu32
4 // needs-llvm-components: bpf
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 u64;
38 ($func:ident $ty:ident $class:ident) => {
40 pub unsafe fn $func(x: $ty) -> $ty {
42 asm!("{} = {}", out($class) y, in($class) x);
48 macro_rules! check_reg {
49 ($func:ident $ty:ident $reg:tt) => {
51 pub unsafe fn $func(x: $ty) -> $ty {
53 asm!(concat!($reg, " = ", $reg), lateout($reg) y, in($reg) x);
63 // CHECK-LABEL: sym_fn
65 // CHECK: call extern_func
68 pub unsafe fn sym_fn() {
69 asm!("call {}", sym extern_func);
72 // CHECK-LABEL: reg_i8:
74 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
76 check!(reg_i8 i8 reg);
78 // CHECK-LABEL: reg_i16:
80 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
82 check!(reg_i16 i16 reg);
84 // CHECK-LABEL: reg_i32:
86 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
88 check!(reg_i32 i32 reg);
90 // CHECK-LABEL: reg_i64:
92 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
94 check!(reg_i64 i64 reg);
96 // CHECK-LABEL: wreg_i8:
98 // CHECK: w{{[0-9]+}} = w{{[0-9]+}}
100 check!(wreg_i8 i8 wreg);
102 // CHECK-LABEL: wreg_i16:
104 // CHECK: w{{[0-9]+}} = w{{[0-9]+}}
106 check!(wreg_i16 i16 wreg);
108 // CHECK-LABEL: wreg_i32:
110 // CHECK: w{{[0-9]+}} = w{{[0-9]+}}
112 check!(wreg_i32 i32 wreg);
114 // CHECK-LABEL: r0_i8:
118 check_reg!(r0_i8 i8 "r0");
120 // CHECK-LABEL: r0_i16:
124 check_reg!(r0_i16 i16 "r0");
126 // CHECK-LABEL: r0_i32:
130 check_reg!(r0_i32 i32 "r0");
132 // CHECK-LABEL: r0_i64:
136 check_reg!(r0_i64 i64 "r0");
138 // CHECK-LABEL: w0_i8:
142 check_reg!(w0_i8 i8 "w0");
144 // CHECK-LABEL: w0_i16:
148 check_reg!(w0_i16 i16 "w0");
150 // CHECK-LABEL: w0_i32:
154 check_reg!(w0_i32 i32 "w0");