]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/bpf-types.rs
Rollup merge of #100604 - dtolnay:okorerr, r=m-ou-se
[rust.git] / src / test / assembly / asm / bpf-types.rs
1 // assembly-output: emit-asm
2 // compile-flags: --target bpfel-unknown-none -C target_feature=+alu32
3 // needs-llvm-components: bpf
4
5 #![feature(no_core, lang_items, rustc_attrs, repr_simd, asm_sym, asm_experimental_arch)]
6 #![crate_type = "rlib"]
7 #![no_core]
8 #![allow(asm_sub_register, non_camel_case_types)]
9
10 #[rustc_builtin_macro]
11 macro_rules! asm {
12     () => {};
13 }
14 #[rustc_builtin_macro]
15 macro_rules! concat {
16     () => {};
17 }
18 #[rustc_builtin_macro]
19 macro_rules! stringify {
20     () => {};
21 }
22
23 #[lang = "sized"]
24 trait Sized {}
25 #[lang = "copy"]
26 trait Copy {}
27
28 type ptr = *const u64;
29
30 impl Copy for i8 {}
31 impl Copy for i16 {}
32 impl Copy for i32 {}
33 impl Copy for i64 {}
34 impl Copy for ptr {}
35
36 macro_rules! check {
37     ($func:ident $ty:ident $class:ident) => {
38         #[no_mangle]
39         pub unsafe fn $func(x: $ty) -> $ty {
40             let y;
41             asm!("{} = {}", out($class) y, in($class) x);
42             y
43         }
44     };
45 }
46
47 macro_rules! check_reg {
48     ($func:ident $ty:ident $reg:tt) => {
49         #[no_mangle]
50         pub unsafe fn $func(x: $ty) -> $ty {
51             let y;
52             asm!(concat!($reg, " = ", $reg), lateout($reg) y, in($reg) x);
53             y
54         }
55     };
56 }
57
58 extern "C" {
59     fn extern_func();
60 }
61
62 // CHECK-LABEL: sym_fn
63 // CHECK: #APP
64 // CHECK: call extern_func
65 // CHECK: #NO_APP
66 #[no_mangle]
67 pub unsafe fn sym_fn() {
68     asm!("call {}", sym extern_func);
69 }
70
71 // CHECK-LABEL: reg_i8:
72 // CHECK: #APP
73 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
74 // CHECK: #NO_APP
75 check!(reg_i8 i8 reg);
76
77 // CHECK-LABEL: reg_i16:
78 // CHECK: #APP
79 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
80 // CHECK: #NO_APP
81 check!(reg_i16 i16 reg);
82
83 // CHECK-LABEL: reg_i32:
84 // CHECK: #APP
85 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
86 // CHECK: #NO_APP
87 check!(reg_i32 i32 reg);
88
89 // CHECK-LABEL: reg_i64:
90 // CHECK: #APP
91 // CHECK: r{{[0-9]+}} = r{{[0-9]+}}
92 // CHECK: #NO_APP
93 check!(reg_i64 i64 reg);
94
95 // CHECK-LABEL: wreg_i8:
96 // CHECK: #APP
97 // CHECK: w{{[0-9]+}} = w{{[0-9]+}}
98 // CHECK: #NO_APP
99 check!(wreg_i8 i8 wreg);
100
101 // CHECK-LABEL: wreg_i16:
102 // CHECK: #APP
103 // CHECK: w{{[0-9]+}} = w{{[0-9]+}}
104 // CHECK: #NO_APP
105 check!(wreg_i16 i16 wreg);
106
107 // CHECK-LABEL: wreg_i32:
108 // CHECK: #APP
109 // CHECK: w{{[0-9]+}} = w{{[0-9]+}}
110 // CHECK: #NO_APP
111 check!(wreg_i32 i32 wreg);
112
113 // CHECK-LABEL: r0_i8:
114 // CHECK: #APP
115 // CHECK: r0 = r0
116 // CHECK: #NO_APP
117 check_reg!(r0_i8 i8 "r0");
118
119 // CHECK-LABEL: r0_i16:
120 // CHECK: #APP
121 // CHECK: r0 = r0
122 // CHECK: #NO_APP
123 check_reg!(r0_i16 i16 "r0");
124
125 // CHECK-LABEL: r0_i32:
126 // CHECK: #APP
127 // CHECK: r0 = r0
128 // CHECK: #NO_APP
129 check_reg!(r0_i32 i32 "r0");
130
131 // CHECK-LABEL: r0_i64:
132 // CHECK: #APP
133 // CHECK: r0 = r0
134 // CHECK: #NO_APP
135 check_reg!(r0_i64 i64 "r0");
136
137 // CHECK-LABEL: w0_i8:
138 // CHECK: #APP
139 // CHECK: w0 = w0
140 // CHECK: #NO_APP
141 check_reg!(w0_i8 i8 "w0");
142
143 // CHECK-LABEL: w0_i16:
144 // CHECK: #APP
145 // CHECK: w0 = w0
146 // CHECK: #NO_APP
147 check_reg!(w0_i16 i16 "w0");
148
149 // CHECK-LABEL: w0_i32:
150 // CHECK: #APP
151 // CHECK: w0 = w0
152 // CHECK: #NO_APP
153 check_reg!(w0_i32 i32 "w0");