1 // assembly-output: emit-asm
2 // compile-flags: --target wasm32-unknown-unknown
3 // compile-flags: --crate-type cdylib
4 // needs-llvm-components: webassembly
6 #![feature(no_core, lang_items, rustc_attrs, asm_sym, asm_experimental_arch)]
13 #[rustc_builtin_macro]
35 static extern_static: u8;
38 // CHECK-LABEL: sym_fn:
40 // CHECK: call extern_func
43 pub unsafe fn sym_fn() {
44 asm!("call {}", sym extern_func);
47 // CHECK-LABEL: sym_static
49 // CHECK: i32.const 42
50 // CHECK: i32.store extern_static
53 pub unsafe fn sym_static() {
57 ", sym extern_static);
61 ($func:ident $ty:ident $instr:literal) => {
63 pub unsafe fn $func(x: $ty) -> $ty {
65 asm!(concat!("local.get {}\n", $instr, "\nlocal.set {}"), in(local) x, out(local) y);
71 // CHECK-LABEL: i8_i32:
73 // CHECK: local.get {{[0-9]}}
75 // CHECK: local.set {{[0-9]}}
77 check!(i8_i32 i8 "i32.clz");
79 // CHECK-LABEL: i16_i32:
81 // CHECK: local.get {{[0-9]}}
83 // CHECK: local.set {{[0-9]}}
85 check!(i16_i32 i16 "i32.clz");
87 // CHECK-LABEL: i32_i32:
89 // CHECK: local.get {{[0-9]}}
91 // CHECK: local.set {{[0-9]}}
93 check!(i32_i32 i32 "i32.clz");
95 // CHECK-LABEL: i8_i64
97 // CHECK: local.get {{[0-9]}}
99 // CHECK: local.set {{[0-9]}}
101 check!(i8_i64 i8 "i64.clz");
103 // CHECK-LABEL: i16_i64
105 // CHECK: local.get {{[0-9]}}
107 // CHECK: local.set {{[0-9]}}
109 check!(i16_i64 i16 "i64.clz");
111 // CHECK-LABEL: i32_i64
113 // CHECK: local.get {{[0-9]}}
115 // CHECK: local.set {{[0-9]}}
117 check!(i32_i64 i32 "i64.clz");
119 // CHECK-LABEL: i64_i64
121 // CHECK: local.get {{[0-9]}}
123 // CHECK: local.set {{[0-9]}}
125 check!(i64_i64 i64 "i64.clz");
127 // CHECK-LABEL: f32_f32
129 // CHECK: local.get {{[0-9]}}
131 // CHECK: local.set {{[0-9]}}
133 check!(f32_f32 f32 "f32.abs");
135 // CHECK-LABEL: f64_f64
137 // CHECK: local.get {{[0-9]}}
139 // CHECK: local.set {{[0-9]}}
141 check!(f64_f64 f64 "f64.abs");
143 // CHECK-LABEL: i32_ptr
145 // CHECK: local.get {{[0-9]}}
147 // CHECK: local.set {{[0-9]}}
149 check!(i32_ptr ptr "i32.eqz");