diff --git a/benches/static_and_dynamic_functions.rs b/benches/static_and_dynamic_functions.rs index 4ca055de3..1383ea7ba 100644 --- a/benches/static_and_dynamic_functions.rs +++ b/benches/static_and_dynamic_functions.rs @@ -8,6 +8,25 @@ static BASIC_WAT: &str = r#"(module (func (export "add") (param i32 i32) (result i32) (i32.add (local.get 0) (local.get 1))) + (func (export "add20") (param i32 i32 i32 i32 i32 + i32 i32 i32 i32 i32 + i32 i32 i32 i32 i32 + i32 i32 i32 i32 i32) (result i32) + (i32.add + (i32.add + (i32.add (i32.add (i32.add (local.get 0) (local.get 1)) + (i32.add (local.get 2) (local.get 3))) + (i32.add (i32.add (local.get 4) (local.get 5)) + (i32.add (local.get 6) (local.get 7)))) + (i32.add + (i32.add (i32.add (local.get 8) (local.get 9)) + (i32.add (local.get 10) (local.get 11))) + (i32.add (i32.add (local.get 12) (local.get 13)) + (i32.add (local.get 14) (local.get 15))))) + + (i32.add (i32.add (local.get 16) (local.get 17)) + (i32.add (local.get 18) (local.get 19)))) +) (func (export "double_then_add") (param i32 i32) (result i32) (i32.add (call $multiply (local.get 0) (i32.const 2)) (call $multiply (local.get 1) (i32.const 2)))) @@ -34,6 +53,18 @@ wasmer_compilers! { assert_eq!(result, 10); }) }); + + let dyn_f_many: Function = instance.exports.get("add20").unwrap(); + let f_many: NativeFunc<(i32, i32, i32, i32, i32, + i32, i32, i32, i32, i32, + i32, i32, i32, i32, i32, + i32, i32, i32, i32, i32), i32> = dyn_f_many.native().unwrap(); + c.bench_function(&format!("basic static func with many args {}", COMPILER_NAME), |b| { + b.iter(|| { + let result = black_box(f_many.call(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20).unwrap()); + assert_eq!(result, 210); + }) + }); } pub fn run_basic_dynamic_function(c: &mut Criterion) { @@ -53,6 +84,19 @@ wasmer_compilers! { assert_eq!(dyn_result[0], Val::I32(10)); }) }); + + let dyn_f_many: Function = instance.exports.get("add20").unwrap(); + c.bench_function(&format!("basic dynfunc with many args {}", COMPILER_NAME), |b| { + b.iter(|| { + let dyn_result = black_box(dyn_f_many.call( + &[Val::I32(1), Val::I32(2), Val::I32(3), Val::I32(4), Val::I32(5), + Val::I32(6), Val::I32(7), Val::I32(8), Val::I32(9), Val::I32(10), + Val::I32(11), Val::I32(12), Val::I32(13), Val::I32(14), Val::I32(15), + Val::I32(16), Val::I32(17), Val::I32(18), Val::I32(19), Val::I32(20), + ]).unwrap()); + assert_eq!(dyn_result[0], Val::I32(210)); + }) + }); } } diff --git a/lib/api/src/native.rs b/lib/api/src/native.rs index 0f4f2c279..ee31daa2c 100644 --- a/lib/api/src/native.rs +++ b/lib/api/src/native.rs @@ -188,5 +188,27 @@ impl_native_traits!(A1); impl_native_traits!(A1, A2); impl_native_traits!(A1, A2, A3); impl_native_traits!(A1, A2, A3, A4); +impl_native_traits!(A1, A2, A3, A4, A5); +impl_native_traits!(A1, A2, A3, A4, A5, A6); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16); +impl_native_traits!(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17); +impl_native_traits!( + A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18 +); +impl_native_traits!( + A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19 +); +impl_native_traits!( + A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20 +); // impl_native_traits!(A1, A2, A3); diff --git a/lib/wasm-common/src/native.rs b/lib/wasm-common/src/native.rs index 189d9c6ae..1d849ce34 100644 --- a/lib/wasm-common/src/native.rs +++ b/lib/wasm-common/src/native.rs @@ -590,11 +590,11 @@ impl_traits!([C] S12, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12); impl_traits!([C] S13, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13); impl_traits!([C] S14, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14); impl_traits!([C] S15, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15); -// impl_traits!([C] S16, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16); -// impl_traits!([C] S17, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17); -// impl_traits!([C] S18, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18); -// impl_traits!([C] S19, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19); -// impl_traits!([C] S20, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20); +impl_traits!([C] S16, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16); +impl_traits!([C] S17, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17); +impl_traits!([C] S18, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18); +impl_traits!([C] S19, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19); +impl_traits!([C] S20, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20); // impl_traits!([C] S21, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21); // impl_traits!([C] S22, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22); // impl_traits!([C] S23, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23);