diff options
| -rw-r--r-- | Cargo.lock | 6 | ||||
| -rw-r--r-- | crates/tinywasm/Cargo.toml | 7 | ||||
| -rw-r--r-- | crates/tinywasm/src/interpreter/executor.rs | 106 | ||||
| -rw-r--r-- | crates/tinywasm/src/interpreter/simd.rs | 17 | ||||
| -rw-r--r-- | crates/tinywasm/src/interpreter/values.rs | 20 | ||||
| -rw-r--r-- | crates/tinywasm/tests/generated/wasm-simd.csv | 2 | ||||
| -rw-r--r-- | crates/tinywasm/tests/test-wasm-simd.rs | 13 | ||||
| -rw-r--r-- | crates/types/src/instructions.rs | 2 |
8 files changed, 99 insertions, 74 deletions
@@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aho-corasick" @@ -674,9 +674,9 @@ dependencies = [ [[package]] name = "wasm-testsuite" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea6edc2d1ffad1d673091e3e3e98961e7c1a8c0f24cbf2431fa02d861e071bd" +checksum = "3439010f90930c46aead98a232d3e38c147d9543db7e6a40289297b2eda13941" dependencies = [ "include_dir", "wast", diff --git a/crates/tinywasm/Cargo.toml b/crates/tinywasm/Cargo.toml index 0ea406c..734a962 100644 --- a/crates/tinywasm/Cargo.toml +++ b/crates/tinywasm/Cargo.toml @@ -20,7 +20,7 @@ tinywasm-types={version="0.9.0-alpha.0", path="../types", default-features=false libm={version="0.2", default-features=false} [dev-dependencies] -wasm-testsuite={version="0.4.4"} +wasm-testsuite={version="0.4.5"} indexmap="2.7" wast={workspace=true} wat={workspace=true} @@ -79,6 +79,11 @@ harness=false test=false [[test]] +name="test-wasm-simd" +harness=false +test=false + +[[test]] name="test-wast" harness=false test=false diff --git a/crates/tinywasm/src/interpreter/executor.rs b/crates/tinywasm/src/interpreter/executor.rs index 291ab64..100075b 100644 --- a/crates/tinywasm/src/interpreter/executor.rs +++ b/crates/tinywasm/src/interpreter/executor.rs @@ -3,7 +3,7 @@ use super::no_std_floats::NoStdFloatExt; use alloc::{format, rc::Rc, string::ToString}; -use core::ops::{ControlFlow, Not}; +use core::ops::ControlFlow; use core::simd::cmp::{SimdPartialEq, SimdPartialOrd}; use core::simd::num::SimdUint; use interpreter::stack::CallFrame; @@ -316,67 +316,71 @@ impl<'store, 'stack> Executor<'store, 'stack> { V128Xor => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a ^ b)).to_cf()?, V128Bitselect => self.stack.values.calculate_same_3::<Value128>(|v1, v2, c| Ok((v1 & c) | (v2 & !c))).to_cf()?, V128AnyTrue => self.stack.values.replace_top::<Value128, i32>(|v| Ok((v.reduce_sum() != 0) as i32)).to_cf()?, - I8x16Swizzle => self.stack.values.calculate_same::<Value128>(|a, s| Ok(a.swizzle_dyn(s))).to_cf()?, - I8x16Splat => self.stack.values.replace_top::<i32, Value128>(|v| Ok(Simd::<i8, 16>::splat(v as i8).to_ne_bytes())).to_cf()?, - I16x8Splat => self.stack.values.replace_top::<i32, Value128>(|v| Ok(Simd::<i16, 8>::splat(v as i16).to_ne_bytes())).to_cf()?, - I32x4Splat => self.stack.values.replace_top::<i32, Value128>(|v| Ok(Simd::<i32, 4>::splat(v).to_ne_bytes())).to_cf()?, - I64x2Splat => self.stack.values.replace_top::<i64, Value128>(|v| Ok(Simd::<i64, 2>::splat(v).to_ne_bytes())).to_cf()?, - F32x4Splat => self.stack.values.replace_top::<f32, Value128>(|v| Ok(Simd::<f32, 4>::splat(v).to_ne_bytes())).to_cf()?, - F64x2Splat => self.stack.values.replace_top::<f64, Value128>(|v| Ok(Simd::<f64, 2>::splat(v).to_ne_bytes())).to_cf()?, + I8x16Splat => self.stack.values.replace_top::<i32, i8x16>(|v| Ok(Simd::<i8, 16>::splat(v as i8))).to_cf()?, + I16x8Splat => self.stack.values.replace_top::<i32, i16x8>(|v| Ok(Simd::<i16, 8>::splat(v as i16))).to_cf()?, + I32x4Splat => self.stack.values.replace_top::<i32, i32x4>(|v| Ok(Simd::<i32, 4>::splat(v))).to_cf()?, + I64x2Splat => self.stack.values.replace_top::<i64, i64x2>(|v| Ok(Simd::<i64, 2>::splat(v))).to_cf()?, + F32x4Splat => self.stack.values.replace_top::<f32, f32x4>(|v| Ok(Simd::<f32, 4>::splat(v))).to_cf()?, + F64x2Splat => self.stack.values.replace_top::<f64, f64x2>(|v| Ok(Simd::<f64, 2>::splat(v))).to_cf()?, + + I8x16Eq => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, + I16x8Eq => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, + I32x4Eq => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, + F32x4Eq => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, + F64x2Eq => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?, - I8x16Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, - I16x8Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, - I32x4Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, - F32x4Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, - F64x2Eq => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_eq(b).to_int().to_ne_bytes())).to_cf()?, + I8x16Ne => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, + I16x8Ne => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, + I32x4Ne => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, + F32x4Ne => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, + F64x2Ne => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?, - I8x16Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, - I16x8Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, - I32x4Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, - F32x4Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, - F64x2Ne => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ne(b).to_int().to_ne_bytes())).to_cf()?, + I8x16LtS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + I16x8LtS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + I32x4LtS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + I64x2LtS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + I8x16LtU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + I16x8LtU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + I32x4LtU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + F32x4Lt => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, + F64x2Lt => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?, - I8x16LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - I16x8LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - I32x4LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - I64x2LtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - F32x4Lt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - F64x2Lt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, + I64x2GtS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + F32x4Gt => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + F64x2Gt => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, - I8x16LtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - I16x8LtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - I32x4LtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_lt(b).to_int().to_ne_bytes())).to_cf()?, - I64x2GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - F32x4Gt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - F64x2Gt => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, + I8x16GtS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + I16x8GtS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + I32x4GtS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + I64x2LeS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, + F32x4Le => self.stack.values.calculate::<f32x4,_>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, + F64x2Le => self.stack.values.calculate::<f64x2,_>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, - I8x16GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - I16x8GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - I32x4GtS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - I64x2LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, - F32x4Le => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, - F64x2Le => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, + I8x16GtU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + I16x8GtU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + I32x4GtU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?, + I64x2GeS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, + F32x4Ge => self.stack.values.calculate::<f32x4,_>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, + F64x2Ge => self.stack.values.calculate::<f64x2,_>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, - I8x16GtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - I16x8GtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - I32x4GtU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_gt(b).to_int().to_ne_bytes())).to_cf()?, - I64x2GeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, - F32x4Ge => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, - F64x2Ge => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, + I8x16LeS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, + I16x8LeS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, + I32x4LeS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, - I8x16LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, - I16x8LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, - I32x4LeS => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, + I8x16LeU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, + I16x8LeU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, + I32x4LeU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?, - I8x16LeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, - I16x8LeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, - I32x4LeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_le(b).to_int().to_ne_bytes())).to_cf()?, + I8x16GeU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, + I16x8GeU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, + I32x4GeU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?, - I8x16GeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, - I16x8GeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, - I32x4GeU => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a.simd_ge(b).to_int().to_ne_bytes())).to_cf()?, + I8x16Abs => self.stack.values.replace_top_same::<i8x16>(|a| Ok(a.abs())).to_cf()?, + I16x8Abs => self.stack.values.replace_top_same::<i16x8>(|a| Ok(a.abs())).to_cf()?, + I32x4Abs => self.stack.values.replace_top_same::<i32x4>(|a| Ok(a.abs())).to_cf()?, + I64x2Abs => self.stack.values.replace_top_same::<i64x2>(|a| Ok(a.abs())).to_cf()?, i => return ControlFlow::Break(Some(Error::UnsupportedFeature(format!("unimplemented opcode: {i:?}")))), }; diff --git a/crates/tinywasm/src/interpreter/simd.rs b/crates/tinywasm/src/interpreter/simd.rs index 53c64e3..2042bc6 100644 --- a/crates/tinywasm/src/interpreter/simd.rs +++ b/crates/tinywasm/src/interpreter/simd.rs @@ -1,18 +1,3 @@ -pub(super) use core::ops::Neg; - -pub(super) use core::simd::Simd; -pub(super) use core::simd::ToBytes; pub(super) use core::simd::num::SimdFloat; pub(super) use core::simd::num::SimdInt; - -macro_rules! impl_wasm_simd_val { - ($($v:ident),*) => { - $( - pub(super) fn $v(f: core::simd::u8x16) -> core::simd::$v { - core::simd::$v::from_ne_bytes(f) - } - )* - }; -} - -impl_wasm_simd_val!(i8x16, i16x8, i32x4, i64x2, f32x4, f64x2); +pub(super) use core::simd::*; diff --git a/crates/tinywasm/src/interpreter/values.rs b/crates/tinywasm/src/interpreter/values.rs index 7a2a916..98d40af 100644 --- a/crates/tinywasm/src/interpreter/values.rs +++ b/crates/tinywasm/src/interpreter/values.rs @@ -1,7 +1,7 @@ use crate::Result; -use tinywasm_types::{ExternRef, FuncRef, LocalAddr, ValType, WasmValue}; use super::stack::{Locals, ValueStack}; +use tinywasm_types::{ExternRef, FuncRef, LocalAddr, ValType, WasmValue}; pub(crate) type Value32 = u32; pub(crate) type Value64 = u64; @@ -272,3 +272,21 @@ impl_internalvalue! { Value128, stack_128, locals_128, Value128, Value128, |v| v, |v| v ValueRef, stack_ref, locals_ref, ValueRef, ValueRef, |v| v, |v| v } + +#[cfg(feature = "simd")] +use core::simd::{num::SimdUint, *}; + +#[cfg(feature = "simd")] +impl_internalvalue! { + Value128, stack_128, locals_128, u8x16, u128, |v: u128| v.to_ne_bytes().into(), |v: u8x16| u128::from_ne_bytes(v.into()) + Value128, stack_128, locals_128, u8x16, i8x16, |v: i8x16| v.to_ne_bytes(), |v: u8x16| v.cast() + Value128, stack_128, locals_128, u8x16, i16x8, |v: i16x8| v.to_ne_bytes(), |v: u8x16| i16x8::from_ne_bytes(v) + Value128, stack_128, locals_128, u8x16, i32x4, |v: i32x4| v.to_ne_bytes(), |v: u8x16| i32x4::from_ne_bytes(v) + Value128, stack_128, locals_128, u8x16, i64x2, |v: i64x2| v.to_ne_bytes(), |v: u8x16| i64x2::from_ne_bytes(v) + Value128, stack_128, locals_128, u8x16, f32x4, |v: f32x4| v.to_ne_bytes(), |v: u8x16| f32x4::from_ne_bytes(v) + Value128, stack_128, locals_128, u8x16, f64x2, |v: f64x2| v.to_ne_bytes(), |v: u8x16| f64x2::from_ne_bytes(v) + + Value128, stack_128, locals_128, u8x16, u16x8, |v: u16x8| v.to_ne_bytes(), |v: u8x16| u16x8::from_ne_bytes(v) + Value128, stack_128, locals_128, u8x16, u32x4, |v: u32x4| v.to_ne_bytes(), |v: u8x16| u32x4::from_ne_bytes(v) + Value128, stack_128, locals_128, u8x16, u64x2, |v: u64x2| v.to_ne_bytes(), |v: u8x16| u64x2::from_ne_bytes(v) +} diff --git a/crates/tinywasm/tests/generated/wasm-simd.csv b/crates/tinywasm/tests/generated/wasm-simd.csv index d695dfa..210564b 100644 --- a/crates/tinywasm/tests/generated/wasm-simd.csv +++ b/crates/tinywasm/tests/generated/wasm-simd.csv @@ -1,2 +1,2 @@ 0.8.0,1300,24679,[{"name":"simd_address.wast","passed":4,"failed":45},{"name":"simd_align.wast","passed":46,"failed":54},{"name":"simd_bit_shift.wast","passed":39,"failed":213},{"name":"simd_bitwise.wast","passed":28,"failed":141},{"name":"simd_boolean.wast","passed":16,"failed":261},{"name":"simd_const.wast","passed":301,"failed":456},{"name":"simd_conversions.wast","passed":48,"failed":234},{"name":"simd_f32x4.wast","passed":16,"failed":774},{"name":"simd_f32x4_arith.wast","passed":16,"failed":1806},{"name":"simd_f32x4_cmp.wast","passed":24,"failed":2583},{"name":"simd_f32x4_pmin_pmax.wast","passed":14,"failed":3873},{"name":"simd_f32x4_rounding.wast","passed":24,"failed":177},{"name":"simd_f64x2.wast","passed":8,"failed":795},{"name":"simd_f64x2_arith.wast","passed":16,"failed":1809},{"name":"simd_f64x2_cmp.wast","passed":24,"failed":2661},{"name":"simd_f64x2_pmin_pmax.wast","passed":14,"failed":3873},{"name":"simd_f64x2_rounding.wast","passed":24,"failed":177},{"name":"simd_i16x8_arith.wast","passed":11,"failed":183},{"name":"simd_i16x8_arith2.wast","passed":19,"failed":153},{"name":"simd_i16x8_cmp.wast","passed":30,"failed":435},{"name":"simd_i16x8_extadd_pairwise_i8x16.wast","passed":4,"failed":17},{"name":"simd_i16x8_extmul_i8x16.wast","passed":12,"failed":105},{"name":"simd_i16x8_q15mulr_sat_s.wast","passed":3,"failed":27},{"name":"simd_i16x8_sat_arith.wast","passed":16,"failed":206},{"name":"simd_i32x4_arith.wast","passed":11,"failed":183},{"name":"simd_i32x4_arith2.wast","passed":26,"failed":123},{"name":"simd_i32x4_cmp.wast","passed":40,"failed":435},{"name":"simd_i32x4_dot_i16x8.wast","passed":3,"failed":27},{"name":"simd_i32x4_extadd_pairwise_i16x8.wast","passed":4,"failed":17},{"name":"simd_i32x4_extmul_i16x8.wast","passed":12,"failed":105},{"name":"simd_i32x4_trunc_sat_f32x4.wast","passed":4,"failed":103},{"name":"simd_i32x4_trunc_sat_f64x2.wast","passed":4,"failed":103},{"name":"simd_i64x2_arith.wast","passed":11,"failed":189},{"name":"simd_i64x2_arith2.wast","passed":2,"failed":23},{"name":"simd_i64x2_cmp.wast","passed":10,"failed":103},{"name":"simd_i64x2_extmul_i32x4.wast","passed":12,"failed":105},{"name":"simd_i8x16_arith.wast","passed":8,"failed":123},{"name":"simd_i8x16_arith2.wast","passed":25,"failed":186},{"name":"simd_i8x16_cmp.wast","passed":30,"failed":415},{"name":"simd_i8x16_sat_arith.wast","passed":24,"failed":190},{"name":"simd_int_to_int_extend.wast","passed":24,"failed":229},{"name":"simd_lane.wast","passed":189,"failed":286},{"name":"simd_linking.wast","passed":0,"failed":3},{"name":"simd_load.wast","passed":8,"failed":31},{"name":"simd_load16_lane.wast","passed":3,"failed":33},{"name":"simd_load32_lane.wast","passed":3,"failed":21},{"name":"simd_load64_lane.wast","passed":3,"failed":13},{"name":"simd_load8_lane.wast","passed":3,"failed":49},{"name":"simd_load_extend.wast","passed":18,"failed":86},{"name":"simd_load_splat.wast","passed":12,"failed":114},{"name":"simd_load_zero.wast","passed":10,"failed":29},{"name":"simd_splat.wast","passed":23,"failed":162},{"name":"simd_store.wast","passed":9,"failed":19},{"name":"simd_store16_lane.wast","passed":3,"failed":33},{"name":"simd_store32_lane.wast","passed":3,"failed":21},{"name":"simd_store64_lane.wast","passed":3,"failed":13},{"name":"simd_store8_lane.wast","passed":3,"failed":49}] -0.9.0-alpha.0,1741,24238,[{"name":"simd_address.wast","passed":7,"failed":42},{"name":"simd_align.wast","passed":93,"failed":7},{"name":"simd_bit_shift.wast","passed":41,"failed":211},{"name":"simd_bitwise.wast","passed":30,"failed":139},{"name":"simd_boolean.wast","passed":18,"failed":259},{"name":"simd_const.wast","passed":551,"failed":206},{"name":"simd_conversions.wast","passed":50,"failed":232},{"name":"simd_f32x4.wast","passed":18,"failed":772},{"name":"simd_f32x4_arith.wast","passed":19,"failed":1803},{"name":"simd_f32x4_cmp.wast","passed":26,"failed":2581},{"name":"simd_f32x4_pmin_pmax.wast","passed":15,"failed":3872},{"name":"simd_f32x4_rounding.wast","passed":25,"failed":176},{"name":"simd_f64x2.wast","passed":10,"failed":793},{"name":"simd_f64x2_arith.wast","passed":19,"failed":1806},{"name":"simd_f64x2_cmp.wast","passed":26,"failed":2659},{"name":"simd_f64x2_pmin_pmax.wast","passed":15,"failed":3872},{"name":"simd_f64x2_rounding.wast","passed":25,"failed":176},{"name":"simd_i16x8_arith.wast","passed":13,"failed":181},{"name":"simd_i16x8_arith2.wast","passed":21,"failed":151},{"name":"simd_i16x8_cmp.wast","passed":32,"failed":433},{"name":"simd_i16x8_extadd_pairwise_i8x16.wast","passed":5,"failed":16},{"name":"simd_i16x8_extmul_i8x16.wast","passed":13,"failed":104},{"name":"simd_i16x8_q15mulr_sat_s.wast","passed":4,"failed":26},{"name":"simd_i16x8_sat_arith.wast","passed":18,"failed":204},{"name":"simd_i32x4_arith.wast","passed":13,"failed":181},{"name":"simd_i32x4_arith2.wast","passed":28,"failed":121},{"name":"simd_i32x4_cmp.wast","passed":42,"failed":433},{"name":"simd_i32x4_dot_i16x8.wast","passed":4,"failed":26},{"name":"simd_i32x4_extadd_pairwise_i16x8.wast","passed":5,"failed":16},{"name":"simd_i32x4_extmul_i16x8.wast","passed":13,"failed":104},{"name":"simd_i32x4_trunc_sat_f32x4.wast","passed":5,"failed":102},{"name":"simd_i32x4_trunc_sat_f64x2.wast","passed":5,"failed":102},{"name":"simd_i64x2_arith.wast","passed":13,"failed":187},{"name":"simd_i64x2_arith2.wast","passed":4,"failed":21},{"name":"simd_i64x2_cmp.wast","passed":11,"failed":102},{"name":"simd_i64x2_extmul_i32x4.wast","passed":13,"failed":104},{"name":"simd_i8x16_arith.wast","passed":10,"failed":121},{"name":"simd_i8x16_arith2.wast","passed":27,"failed":184},{"name":"simd_i8x16_cmp.wast","passed":32,"failed":413},{"name":"simd_i8x16_sat_arith.wast","passed":26,"failed":188},{"name":"simd_int_to_int_extend.wast","passed":25,"failed":228},{"name":"simd_lane.wast","passed":209,"failed":266},{"name":"simd_linking.wast","passed":0,"failed":3},{"name":"simd_load.wast","passed":24,"failed":15},{"name":"simd_load16_lane.wast","passed":4,"failed":32},{"name":"simd_load32_lane.wast","passed":4,"failed":20},{"name":"simd_load64_lane.wast","passed":4,"failed":12},{"name":"simd_load8_lane.wast","passed":4,"failed":48},{"name":"simd_load_extend.wast","passed":24,"failed":80},{"name":"simd_load_splat.wast","passed":17,"failed":109},{"name":"simd_load_zero.wast","passed":12,"failed":27},{"name":"simd_splat.wast","passed":37,"failed":148},{"name":"simd_store.wast","passed":20,"failed":8},{"name":"simd_store16_lane.wast","passed":3,"failed":33},{"name":"simd_store32_lane.wast","passed":3,"failed":21},{"name":"simd_store64_lane.wast","passed":3,"failed":13},{"name":"simd_store8_lane.wast","passed":3,"failed":49}] +0.9.0-alpha.0,1808,24172,[{"name":"simd_address.wast","passed":7,"failed":42},{"name":"simd_align.wast","passed":92,"failed":8},{"name":"simd_bit_shift.wast","passed":41,"failed":211},{"name":"simd_bitwise.wast","passed":30,"failed":139},{"name":"simd_boolean.wast","passed":123,"failed":154},{"name":"simd_const.wast","passed":551,"failed":206},{"name":"simd_conversions.wast","passed":50,"failed":232},{"name":"simd_f32x4.wast","passed":18,"failed":772},{"name":"simd_f32x4_arith.wast","passed":19,"failed":1803},{"name":"simd_f32x4_cmp.wast","passed":26,"failed":2581},{"name":"simd_f32x4_pmin_pmax.wast","passed":15,"failed":3872},{"name":"simd_f32x4_rounding.wast","passed":25,"failed":176},{"name":"simd_f64x2.wast","passed":10,"failed":793},{"name":"simd_f64x2_arith.wast","passed":19,"failed":1806},{"name":"simd_f64x2_cmp.wast","passed":26,"failed":2659},{"name":"simd_f64x2_pmin_pmax.wast","passed":15,"failed":3872},{"name":"simd_f64x2_rounding.wast","passed":25,"failed":176},{"name":"simd_i16x8_arith.wast","passed":13,"failed":181},{"name":"simd_i16x8_arith2.wast","passed":21,"failed":151},{"name":"simd_i16x8_cmp.wast","passed":32,"failed":433},{"name":"simd_i16x8_extadd_pairwise_i8x16.wast","passed":5,"failed":16},{"name":"simd_i16x8_extmul_i8x16.wast","passed":13,"failed":104},{"name":"simd_i16x8_q15mulr_sat_s.wast","passed":4,"failed":26},{"name":"simd_i16x8_sat_arith.wast","passed":18,"failed":204},{"name":"simd_i32x4_arith.wast","passed":13,"failed":181},{"name":"simd_i32x4_arith2.wast","passed":28,"failed":121},{"name":"simd_i32x4_cmp.wast","passed":42,"failed":433},{"name":"simd_i32x4_dot_i16x8.wast","passed":4,"failed":26},{"name":"simd_i32x4_extadd_pairwise_i16x8.wast","passed":5,"failed":16},{"name":"simd_i32x4_extmul_i16x8.wast","passed":13,"failed":104},{"name":"simd_i32x4_trunc_sat_f32x4.wast","passed":5,"failed":102},{"name":"simd_i32x4_trunc_sat_f64x2.wast","passed":5,"failed":102},{"name":"simd_i64x2_arith.wast","passed":13,"failed":187},{"name":"simd_i64x2_arith2.wast","passed":4,"failed":21},{"name":"simd_i64x2_cmp.wast","passed":11,"failed":102},{"name":"simd_i64x2_extmul_i32x4.wast","passed":13,"failed":104},{"name":"simd_i8x16_arith.wast","passed":10,"failed":121},{"name":"simd_i8x16_arith2.wast","passed":27,"failed":184},{"name":"simd_i8x16_cmp.wast","passed":32,"failed":413},{"name":"simd_i8x16_sat_arith.wast","passed":26,"failed":188},{"name":"simd_int_to_int_extend.wast","passed":25,"failed":228},{"name":"simd_lane.wast","passed":200,"failed":275},{"name":"simd_linking.wast","passed":0,"failed":3},{"name":"simd_load.wast","passed":22,"failed":17},{"name":"simd_load16_lane.wast","passed":4,"failed":32},{"name":"simd_load32_lane.wast","passed":4,"failed":20},{"name":"simd_load64_lane.wast","passed":4,"failed":12},{"name":"simd_load8_lane.wast","passed":4,"failed":48},{"name":"simd_load_extend.wast","passed":20,"failed":84},{"name":"simd_load_splat.wast","passed":14,"failed":112},{"name":"simd_load_zero.wast","passed":12,"failed":27},{"name":"simd_memory-multi.wast","passed":1,"failed":0},{"name":"simd_splat.wast","passed":26,"failed":159},{"name":"simd_store.wast","passed":11,"failed":17},{"name":"simd_store16_lane.wast","passed":3,"failed":33},{"name":"simd_store32_lane.wast","passed":3,"failed":21},{"name":"simd_store64_lane.wast","passed":3,"failed":13},{"name":"simd_store8_lane.wast","passed":3,"failed":49}] diff --git a/crates/tinywasm/tests/test-wasm-simd.rs b/crates/tinywasm/tests/test-wasm-simd.rs new file mode 100644 index 0000000..d8f15ea --- /dev/null +++ b/crates/tinywasm/tests/test-wasm-simd.rs @@ -0,0 +1,13 @@ +mod testsuite; +use eyre::Result; +use testsuite::TestSuite; +use wasm_testsuite::data::{Proposal, proposal}; + +fn main() -> Result<()> { + TestSuite::set_log_level(log::LevelFilter::Off); + + let mut test_suite = TestSuite::new(); + test_suite.run_files(proposal(&Proposal::Simd))?; + test_suite.save_csv("./tests/generated/wasm-simd.csv", env!("CARGO_PKG_VERSION"))?; + test_suite.report_status() +} diff --git a/crates/types/src/instructions.rs b/crates/types/src/instructions.rs index e3e30f6..24116e8 100644 --- a/crates/types/src/instructions.rs +++ b/crates/types/src/instructions.rs @@ -216,7 +216,7 @@ pub enum Instruction { I8x16Abs, I8x16Neg, I8x16AllTrue, I8x16Bitmask, I8x16Shl, I8x16ShrS, I8x16ShrU, I8x16Add, I8x16Sub, I8x16MinS, I8x16MinU, I8x16MaxS, I8x16MaxU, I16x8Abs, I16x8Neg, I16x8AllTrue, I16x8Bitmask, I16x8Shl, I16x8ShrS, I16x8ShrU, I16x8Add, I16x8Sub, I16x8MinS, I16x8MinU, I16x8MaxS, I16x8MaxU, - I32x4Abs, I32x4Neg, I32x4AllTrue, I32x4Bitmask, I32x4Shl, I32x4ShrS, I32x4ShrU, I32x4Add, I32x4Sub, I32x4MinS, I32x4MinU, I32x4MaxS, I32x4MaxU, + I32x4Abs, I32x4Neg, I32x4AllTrue, I32x4Bitmask, I32x4Shl, I32x4ShrS, I32x4ShrU, I32x4Add, I32x4Sub, I32x4MinS, I32x4MinU, I32x4MaxS, I32x4MaxU, I64x2Abs, I64x2Neg, I64x2AllTrue, I64x2Bitmask, I64x2Shl, I64x2ShrS, I64x2ShrU, I64x2Add, I64x2Sub, I64x2Mul, I8x16NarrowI16x8S, I8x16NarrowI16x8U, I8x16AddSatS, I8x16AddSatU, I8x16SubSatS, I8x16SubSatU, I8x16AvgrU, |
