]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/wasm-types.rs
Rollup merge of #80543 - LeSeulArtichaut:notify-close, r=spastorino
[rust.git] / src / test / assembly / asm / wasm-types.rs
1 // min-llvm-version: 10.0.1
2 // assembly-output: emit-asm
3 // compile-flags: --target wasm32-unknown-unknown
4 // compile-flags: --crate-type cdylib
5 // needs-llvm-components: webassembly
6
7 #![feature(no_core, lang_items, rustc_attrs)]
8 #![no_core]
9
10 #[rustc_builtin_macro]
11 macro_rules! asm {
12     () => {};
13 }
14 #[rustc_builtin_macro]
15 macro_rules! concat {
16     () => {};
17 }
18
19 #[lang = "sized"]
20 trait Sized {}
21 #[lang = "copy"]
22 trait Copy {}
23
24 type ptr = *mut u8;
25
26 impl Copy for i8 {}
27 impl Copy for i16 {}
28 impl Copy for i32 {}
29 impl Copy for f32 {}
30 impl Copy for i64 {}
31 impl Copy for f64 {}
32 impl Copy for ptr {}
33
34 extern "C" {
35     fn extern_func();
36     static extern_static: u8;
37 }
38
39 // CHECK-LABEL: sym_fn:
40 // CHECK: #APP
41 // CHECK: call extern_func
42 // CHECK: #NO_APP
43 #[no_mangle]
44 pub unsafe fn sym_fn() {
45     asm!("call {}", sym extern_func);
46 }
47
48 // CHECK-LABEL: sym_static
49 // CHECK: #APP
50 // CHECK: i32.const 42
51 // CHECK: i32.store extern_static
52 // CHECK: #NO_APP
53 #[no_mangle]
54 pub unsafe fn sym_static() {
55     asm!("
56         i32.const 42
57         i32.store {}
58     ", sym extern_static);
59 }
60
61 macro_rules! check {
62     ($func:ident $ty:ident $instr:literal) => {
63         #[no_mangle]
64         pub unsafe fn $func(x: $ty) -> $ty {
65             let y;
66             asm!(concat!("local.get {}\n", $instr, "\nlocal.set {}"), in(local) x, out(local) y);
67             y
68         }
69     };
70 }
71
72 // CHECK-LABEL: i8_i32:
73 // CHECK: #APP
74 // CHECK: local.get {{[0-9]}}
75 // CHECK: i32.clz
76 // CHECK: local.set {{[0-9]}}
77 // CHECK: #NO_APP
78 check!(i8_i32 i8 "i32.clz");
79
80 // CHECK-LABEL: i16_i32:
81 // CHECK: #APP
82 // CHECK: local.get {{[0-9]}}
83 // CHECK: i32.clz
84 // CHECK: local.set {{[0-9]}}
85 // CHECK: #NO_APP
86 check!(i16_i32 i16 "i32.clz");
87
88 // CHECK-LABEL: i32_i32:
89 // CHECK: #APP
90 // CHECK: local.get {{[0-9]}}
91 // CHECK: i32.clz
92 // CHECK: local.set {{[0-9]}}
93 // CHECK: #NO_APP
94 check!(i32_i32 i32 "i32.clz");
95
96 // CHECK-LABEL: i8_i64
97 // CHECK: #APP
98 // CHECK: local.get {{[0-9]}}
99 // CHECK: i64.clz
100 // CHECK: local.set {{[0-9]}}
101 // CHECK: #NO_APP
102 check!(i8_i64 i8 "i64.clz");
103
104 // CHECK-LABEL: i16_i64
105 // CHECK: #APP
106 // CHECK: local.get {{[0-9]}}
107 // CHECK: i64.clz
108 // CHECK: local.set {{[0-9]}}
109 // CHECK: #NO_APP
110 check!(i16_i64 i16 "i64.clz");
111
112 // CHECK-LABEL: i32_i64
113 // CHECK: #APP
114 // CHECK: local.get {{[0-9]}}
115 // CHECK: i64.clz
116 // CHECK: local.set {{[0-9]}}
117 // CHECK: #NO_APP
118 check!(i32_i64 i32 "i64.clz");
119
120 // CHECK-LABEL: i64_i64
121 // CHECK: #APP
122 // CHECK: local.get {{[0-9]}}
123 // CHECK: i64.clz
124 // CHECK: local.set {{[0-9]}}
125 // CHECK: #NO_APP
126 check!(i64_i64 i64 "i64.clz");
127
128 // CHECK-LABEL: f32_f32
129 // CHECK: #APP
130 // CHECK: local.get {{[0-9]}}
131 // CHECK: f32.abs
132 // CHECK: local.set {{[0-9]}}
133 // CHECK: #NO_APP
134 check!(f32_f32 f32 "f32.abs");
135
136 // CHECK-LABEL: f64_f64
137 // CHECK: #APP
138 // CHECK: local.get {{[0-9]}}
139 // CHECK: f64.abs
140 // CHECK: local.set {{[0-9]}}
141 // CHECK: #NO_APP
142 check!(f64_f64 f64 "f64.abs");
143
144 // CHECK-LABEL: i32_ptr
145 // CHECK: #APP
146 // CHECK: local.get {{[0-9]}}
147 // CHECK: i32.eqz
148 // CHECK: local.set {{[0-9]}}
149 // CHECK: #NO_APP
150 check!(i32_ptr ptr "i32.eqz");