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