Auto merge of #78684 - devsnek:inline-asm-wasm, r=Amanieu
Add wasm32 support to inline asm There is some contention around inline asm and wasm, and I really only made this to figure out the process of hacking on rustc, but I figured as long as the code existed, it was worth uploading. cc `@Amanieu`
This commit is contained in:
commit
6645da366e
8 changed files with 231 additions and 4 deletions
150
src/test/assembly/asm/wasm-types.rs
Normal file
150
src/test/assembly/asm/wasm-types.rs
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
// no-system-llvm
|
||||
// assembly-output: emit-asm
|
||||
// compile-flags: --target wasm32-unknown-unknown
|
||||
// compile-flags: --crate-type cdylib
|
||||
// needs-llvm-components: webassembly
|
||||
|
||||
#![feature(no_core, lang_items, rustc_attrs)]
|
||||
#![no_core]
|
||||
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! asm {
|
||||
() => {};
|
||||
}
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! concat {
|
||||
() => {};
|
||||
}
|
||||
|
||||
#[lang = "sized"]
|
||||
trait Sized {}
|
||||
#[lang = "copy"]
|
||||
trait Copy {}
|
||||
|
||||
type ptr = *mut u8;
|
||||
|
||||
impl Copy for i8 {}
|
||||
impl Copy for i16 {}
|
||||
impl Copy for i32 {}
|
||||
impl Copy for f32 {}
|
||||
impl Copy for i64 {}
|
||||
impl Copy for f64 {}
|
||||
impl Copy for ptr {}
|
||||
|
||||
extern "C" {
|
||||
fn extern_func();
|
||||
static extern_static: u8;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sym_fn:
|
||||
// CHECK: #APP
|
||||
// CHECK: call extern_func
|
||||
// CHECK: #NO_APP
|
||||
#[no_mangle]
|
||||
pub unsafe fn sym_fn() {
|
||||
asm!("call {}", sym extern_func);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sym_static
|
||||
// CHECK: #APP
|
||||
// CHECK: i32.const 42
|
||||
// CHECK: i32.store extern_static
|
||||
// CHECK: #NO_APP
|
||||
#[no_mangle]
|
||||
pub unsafe fn sym_static() {
|
||||
asm!("
|
||||
i32.const 42
|
||||
i32.store {}
|
||||
", sym extern_static);
|
||||
}
|
||||
|
||||
macro_rules! check {
|
||||
($func:ident $ty:ident $instr:literal) => {
|
||||
#[no_mangle]
|
||||
pub unsafe fn $func(x: $ty) -> $ty {
|
||||
let y;
|
||||
asm!(concat!("local.get {}\n", $instr, "\nlocal.set {}"), in(local) x, out(local) y);
|
||||
y
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// CHECK-LABEL: i8_i32:
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i32.clz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i8_i32 i8 "i32.clz");
|
||||
|
||||
// CHECK-LABEL: i16_i32:
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i32.clz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i16_i32 i16 "i32.clz");
|
||||
|
||||
// CHECK-LABEL: i32_i32:
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i32.clz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i32_i32 i32 "i32.clz");
|
||||
|
||||
// CHECK-LABEL: i8_i64
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i64.clz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i8_i64 i8 "i64.clz");
|
||||
|
||||
// CHECK-LABEL: i16_i64
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i64.clz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i16_i64 i16 "i64.clz");
|
||||
|
||||
// CHECK-LABEL: i32_i64
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i64.clz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i32_i64 i32 "i64.clz");
|
||||
|
||||
// CHECK-LABEL: i64_i64
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i64.clz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i64_i64 i64 "i64.clz");
|
||||
|
||||
// CHECK-LABEL: f32_f32
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: f32.abs
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(f32_f32 f32 "f32.abs");
|
||||
|
||||
// CHECK-LABEL: f64_f64
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: f64.abs
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(f64_f64 f64 "f64.abs");
|
||||
|
||||
// CHECK-LABEL: i32_ptr
|
||||
// CHECK: #APP
|
||||
// CHECK: local.get {{[0-9]}}
|
||||
// CHECK: i32.eqz
|
||||
// CHECK: local.set {{[0-9]}}
|
||||
// CHECK: #NO_APP
|
||||
check!(i32_ptr ptr "i32.eqz");
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
// compile-flags: --target wasm32-unknown-unknown
|
||||
// needs-llvm-components: webassembly
|
||||
// compile-flags: --target sparc-unknown-linux-gnu
|
||||
// needs-llvm-components: sparc
|
||||
|
||||
#![feature(no_core, lang_items, rustc_attrs)]
|
||||
#![no_core]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue