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
7 #![feature(no_core, lang_items, rustc_attrs)]
10 #[rustc_builtin_macro]
14 #[rustc_builtin_macro]
36 static extern_static: u8;
39 // CHECK-LABEL: sym_fn:
41 // CHECK: call extern_func
44 pub unsafe fn sym_fn() {
45 asm!("call {}", sym extern_func);
48 // CHECK-LABEL: sym_static
50 // CHECK: i32.const 42
51 // CHECK: i32.store extern_static
54 pub unsafe fn sym_static() {
58 ", sym extern_static);
62 ($func:ident $ty:ident $instr:literal) => {
64 pub unsafe fn $func(x: $ty) -> $ty {
66 asm!(concat!("local.get {}\n", $instr, "\nlocal.set {}"), in(local) x, out(local) y);
72 // CHECK-LABEL: i8_i32:
74 // CHECK: local.get {{[0-9]}}
76 // CHECK: local.set {{[0-9]}}
78 check!(i8_i32 i8 "i32.clz");
80 // CHECK-LABEL: i16_i32:
82 // CHECK: local.get {{[0-9]}}
84 // CHECK: local.set {{[0-9]}}
86 check!(i16_i32 i16 "i32.clz");
88 // CHECK-LABEL: i32_i32:
90 // CHECK: local.get {{[0-9]}}
92 // CHECK: local.set {{[0-9]}}
94 check!(i32_i32 i32 "i32.clz");
96 // CHECK-LABEL: i8_i64
98 // CHECK: local.get {{[0-9]}}
100 // CHECK: local.set {{[0-9]}}
102 check!(i8_i64 i8 "i64.clz");
104 // CHECK-LABEL: i16_i64
106 // CHECK: local.get {{[0-9]}}
108 // CHECK: local.set {{[0-9]}}
110 check!(i16_i64 i16 "i64.clz");
112 // CHECK-LABEL: i32_i64
114 // CHECK: local.get {{[0-9]}}
116 // CHECK: local.set {{[0-9]}}
118 check!(i32_i64 i32 "i64.clz");
120 // CHECK-LABEL: i64_i64
122 // CHECK: local.get {{[0-9]}}
124 // CHECK: local.set {{[0-9]}}
126 check!(i64_i64 i64 "i64.clz");
128 // CHECK-LABEL: f32_f32
130 // CHECK: local.get {{[0-9]}}
132 // CHECK: local.set {{[0-9]}}
134 check!(f32_f32 f32 "f32.abs");
136 // CHECK-LABEL: f64_f64
138 // CHECK: local.get {{[0-9]}}
140 // CHECK: local.set {{[0-9]}}
142 check!(f64_f64 f64 "f64.abs");
144 // CHECK-LABEL: i32_ptr
146 // CHECK: local.get {{[0-9]}}
148 // CHECK: local.set {{[0-9]}}
150 check!(i32_ptr ptr "i32.eqz");