summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/parser/Cargo.toml4
-rw-r--r--crates/parser/README.md2
-rw-r--r--crates/parser/src/lib.rs5
-rw-r--r--crates/parser/src/visit.rs2
-rw-r--r--crates/tinywasm/Cargo.toml7
-rw-r--r--crates/tinywasm/src/instance.rs4
-rw-r--r--crates/tinywasm/src/interpreter/executor.rs805
-rw-r--r--crates/tinywasm/src/interpreter/mod.rs4
-rw-r--r--crates/tinywasm/src/interpreter/no_std_floats.rs1
-rw-r--r--crates/tinywasm/src/interpreter/num_helpers.rs32
-rw-r--r--crates/tinywasm/src/interpreter/stack/call_stack.rs2
-rw-r--r--crates/tinywasm/src/interpreter/stack/value_stack.rs7
-rw-r--r--crates/tinywasm/src/interpreter/value128.rs76
-rw-r--r--crates/tinywasm/src/interpreter/values.rs46
-rw-r--r--crates/tinywasm/src/lib.rs7
-rw-r--r--crates/tinywasm/src/store/memory.rs25
-rw-r--r--crates/tinywasm/src/store/mod.rs14
-rw-r--r--crates/types/Cargo.toml4
-rw-r--r--crates/types/src/archive.rs1
-rw-r--r--crates/types/src/lib.rs4
20 files changed, 514 insertions, 538 deletions
diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml
index 3cbeee1..598a5b7 100644
--- a/crates/parser/Cargo.toml
+++ b/crates/parser/Cargo.toml
@@ -16,6 +16,6 @@ log={workspace=true, optional=true}
tinywasm-types={version="0.9.0-alpha.0", path="../types", default-features=false}
[features]
-default=["std", "logging"]
-logging=["log"]
+default=["std", "log"]
+log=["dep:log"]
std=["tinywasm-types/std", "wasmparser/std"]
diff --git a/crates/parser/README.md b/crates/parser/README.md
index 563cd6b..104cd50 100644
--- a/crates/parser/README.md
+++ b/crates/parser/README.md
@@ -6,7 +6,7 @@ It uses [my fork](https://crates.io/crates/tinywasm-wasmparser) of the [`wasmpar
## Features
- `std`: Enables the use of `std` and `std::io` for parsing from files and streams.
-- `logging`: Enables logging of the parsing process using the `log` crate.
+- `log`: Enables logging of the parsing process using the `log` crate.
## Usage
diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs
index 3f45db8..3f543b6 100644
--- a/crates/parser/src/lib.rs
+++ b/crates/parser/src/lib.rs
@@ -13,12 +13,12 @@ extern crate alloc;
extern crate std;
// log for logging (optional).
-#[cfg(feature = "logging")]
+#[cfg(feature = "log")]
#[allow(clippy::single_component_path_imports, unused_imports)]
use log;
// noop fallback if logging is disabled.
-#[cfg(not(feature = "logging"))]
+#[cfg(not(feature = "log"))]
#[allow(unused_imports, unused_macros)]
pub(crate) mod log {
macro_rules! debug ( ($($tt:tt)*) => {{}} );
@@ -67,6 +67,7 @@ impl Parser {
bulk_memory_opt: true,
call_indirect_overlong: true,
+ custom_descriptors: false,
cm_threading: false,
extended_const: false,
wide_arithmetic: false,
diff --git a/crates/parser/src/visit.rs b/crates/parser/src/visit.rs
index 4ae2cc1..9b9ab75 100644
--- a/crates/parser/src/visit.rs
+++ b/crates/parser/src/visit.rs
@@ -158,7 +158,7 @@ macro_rules! impl_visit_operator {
(@@$proposal:ident $op:ident $({ $($arg:ident: $argty:ty),* })? => $visit:ident ($($ann:tt)*)) => {
#[cold]
- fn $visit(&mut self $($(,$arg: $argty)*)?) {
+ fn $visit(&mut self $($(,_: $argty)*)?) {
self.unsupported(stringify!($visit))
}
};
diff --git a/crates/tinywasm/Cargo.toml b/crates/tinywasm/Cargo.toml
index 2315b9b..d1a0839 100644
--- a/crates/tinywasm/Cargo.toml
+++ b/crates/tinywasm/Cargo.toml
@@ -34,9 +34,9 @@ serde_json.workspace=true
serde.workspace=true
[features]
-default=["std", "parser", "logging", "archive", "canonicalize_nans"]
+default=["std", "parser", "log", "archive", "canonicalize_nans"]
-logging=["log", "tinywasm-parser?/logging", "tinywasm-types/logging"]
+log=["dep:log", "tinywasm-parser?/log", "tinywasm-types/log"]
std=["tinywasm-parser?/std", "tinywasm-types/std"]
# support for parsing WebAssembly
@@ -48,9 +48,6 @@ archive=["tinywasm-types/archive"]
# canonicalize all NaN values to a single representation
canonicalize_nans=[]
-# enable simd support (unstable / unfinished)
-unstable-simd=[]
-
[[test]]
name="test-wasm-1"
harness=false
diff --git a/crates/tinywasm/src/instance.rs b/crates/tinywasm/src/instance.rs
index aaa3407..0ca8f6f 100644
--- a/crates/tinywasm/src/instance.rs
+++ b/crates/tinywasm/src/instance.rs
@@ -4,7 +4,7 @@ use tinywasm_types::*;
use crate::func::{FromWasmValueTuple, IntoWasmValueTuple};
use crate::{Error, FuncHandle, FuncHandleTyped, Imports, MemoryRef, MemoryRefMut, Module, Result, Store};
-/// An instanciated WebAssembly module
+/// An instantiated WebAssembly module
///
/// Backed by an Rc, so cloning is cheap
///
@@ -72,7 +72,7 @@ impl ModuleInstance {
let global_addrs = store.init_globals(addrs.globals, module.0.globals.into(), &addrs.funcs, idx)?;
let (elem_addrs, elem_trapped) =
store.init_elements(&addrs.tables, &addrs.funcs, &global_addrs, &module.0.elements, idx)?;
- let (data_addrs, data_trapped) = store.init_datas(&addrs.memories, module.0.data.into(), idx)?;
+ let (data_addrs, data_trapped) = store.init_data(&addrs.memories, module.0.data.into(), idx)?;
let instance = ModuleInstanceInner {
failed_to_instantiate: elem_trapped.is_some() || data_trapped.is_some(),
diff --git a/crates/tinywasm/src/interpreter/executor.rs b/crates/tinywasm/src/interpreter/executor.rs
index 2e979bc..8033a4e 100644
--- a/crates/tinywasm/src/interpreter/executor.rs
+++ b/crates/tinywasm/src/interpreter/executor.rs
@@ -8,17 +8,10 @@ use core::ops::ControlFlow;
use interpreter::stack::CallFrame;
use tinywasm_types::*;
-#[cfg(all(feature = "std", feature = "unstable-simd"))]
-use crate::std::simd::StdFloat;
-#[cfg(feature = "unstable-simd")]
-use core::simd::{cmp::*, num::*, *};
-
-#[cfg(feature = "unstable-simd")]
-use core::ops::{Index, IndexMut, Shl, Shr};
-
use super::num_helpers::*;
use super::stack::{BlockFrame, BlockType, Stack};
use super::values::*;
+use crate::interpreter::Value128;
use crate::*;
pub(crate) struct Executor<'store, 'stack> {
@@ -316,410 +309,410 @@ impl<'store, 'stack> Executor<'store, 'stack> {
LocalCopy128(from, to) => self.exec_local_copy::<Value128>(*from, *to),
LocalCopyRef(from, to) => self.exec_local_copy::<ValueRef>(*from, *to),
- #[cfg(feature = "unstable-simd")] V128Not => self.stack.values.replace_top_same::<Value128>(|v| Ok(!v)).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128And => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a & b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128AndNot => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a & (!b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128Or => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a | b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128Xor => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a ^ b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128Bitselect => self.stack.values.calculate_same_3::<Value128>(|v1, v2, c| Ok((v1 & c) | (v2 & !c))).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128AnyTrue => self.stack.values.replace_top::<Value128, i32>(|v| Ok((v.reduce_or() != 0) as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16Swizzle => self.stack.values.calculate_same::<Value128>(|a, s| Ok(a.swizzle_dyn(s))).to_cf()?,
+ V128Not => self.stack.values.replace_top_same::<Value128>(|v| Ok(!v)).to_cf()?,
+ V128And => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a & b)).to_cf()?,
+ V128AndNot => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a & (!b))).to_cf()?,
+ V128Or => self.stack.values.calculate_same::<Value128>(|a, b| Ok(a | b)).to_cf()?,
+ 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_or() != 0) as i32)).to_cf()?,
+ I8x16Swizzle => self.stack.values.calculate_same::<Value128>(|a, s| Ok(a.swizzle(s))).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128Load(arg) => self.exec_mem_load::<Value128, 16, _>(arg.mem_addr(), arg.offset(), |v| v)?,
- #[cfg(feature = "unstable-simd")] V128Load8x8S(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load8x8U(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load16x4S(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load16x4U(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load32x2S(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load32x2U(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load8Splat(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load16Splat(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load32Splat(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Load64Splat(_arg) => unimplemented!(),
+ // V128Load(arg) => self.exec_mem_load::<Value128, 16, _>(arg.mem_addr(), arg.offset(), |v| v)?,
+ // V128Load8x8S(_arg) => unimplemented!(),
+ // V128Load8x8U(_arg) => unimplemented!(),
+ // V128Load16x4S(_arg) => unimplemented!(),
+ // V128Load16x4U(_arg) => unimplemented!(),
+ // V128Load32x2S(_arg) => unimplemented!(),
+ // V128Load32x2U(_arg) => unimplemented!(),
+ // V128Load8Splat(_arg) => unimplemented!(),
+ // V128Load16Splat(_arg) => unimplemented!(),
+ // V128Load32Splat(_arg) => unimplemented!(),
+ // V128Load64Splat(_arg) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] V128Store(arg) => self.exec_mem_store::<Value128, Value128, 16>(arg.mem_addr(), arg.offset(), |v| v)?,
+ // V128Store(arg) => self.exec_mem_store::<Value128, Value128, 16>(arg.mem_addr(), arg.offset(), |v| v)?,
- #[cfg(feature = "unstable-simd")] V128Store8Lane(arg, lane) => self.exec_mem_store_lane::<i8x16, i8, 1>(arg.mem_addr(), arg.offset(), *lane)?,
- #[cfg(feature = "unstable-simd")] V128Store16Lane(arg, lane) => self.exec_mem_store_lane::<i16x8, i16, 2>(arg.mem_addr(), arg.offset(), *lane)?,
- #[cfg(feature = "unstable-simd")] V128Store32Lane(arg, lane) => self.exec_mem_store_lane::<i32x4, i32, 4>(arg.mem_addr(), arg.offset(), *lane)?,
- #[cfg(feature = "unstable-simd")] V128Store64Lane(arg, lane) => self.exec_mem_store_lane::<i64x2, i64, 8>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Store8Lane(arg, lane) => self.exec_mem_store_lane::<i8x16, i8, 1>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Store16Lane(arg, lane) => self.exec_mem_store_lane::<i16x8, i16, 2>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Store32Lane(arg, lane) => self.exec_mem_store_lane::<i32x4, i32, 4>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Store64Lane(arg, lane) => self.exec_mem_store_lane::<i64x2, i64, 8>(arg.mem_addr(), arg.offset(), *lane)?,
- // Load a single 32-bit or 64-bit element into the lowest bits of a v128 vector, and initialize all other bits of the v128 vector to zero.
- #[cfg(feature = "unstable-simd")] V128Load32Zero(arg) => self.exec_mem_load::<i32, 4, Value128>(arg.mem_addr(), arg.offset(), |v| {
- let bytes = v.to_le_bytes();
- u8x16::from_array([bytes[0], bytes[1], bytes[2], bytes[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
- })?,
- #[cfg(feature = "unstable-simd")] V128Load64Zero(arg) => self.exec_mem_load::<i64, 8, Value128>(arg.mem_addr(), arg.offset(), |v| {
- let bytes = v.to_le_bytes();
- u8x16::from_array([bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], 0, 0, 0, 0, 0, 0, 0, 0])
- })?,
+ // // Load a single 32-bit or 64-bit element into the lowest bits of a v128 vector, and initialize all other bits of the v128 vector to zero.
+ // V128Load32Zero(arg) => self.exec_mem_load::<i32, 4, Value128>(arg.mem_addr(), arg.offset(), |v| {
+ // let bytes = v.to_le_bytes();
+ // u8x16::from_array([bytes[0], bytes[1], bytes[2], bytes[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+ // })?,
+ // V128Load64Zero(arg) => self.exec_mem_load::<i64, 8, Value128>(arg.mem_addr(), arg.offset(), |v| {
+ // let bytes = v.to_le_bytes();
+ // u8x16::from_array([bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], 0, 0, 0, 0, 0, 0, 0, 0])
+ // })?,
- #[cfg(feature = "unstable-simd")] V128Const(arg) => self.exec_const::<Value128>( self.cf.data().v128_constants[*arg as usize].to_le_bytes().into()),
+ // V128Const(arg) => self.exec_const::<Value128>( self.cf.data().v128_constants[*arg as usize].to_le_bytes().into()),
- #[cfg(feature = "unstable-simd")] I8x16ExtractLaneS(lane) => self.stack.values.replace_top::<i8x16, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16ExtractLaneU(lane) => self.stack.values.replace_top::<u8x16, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8ExtractLaneS(lane) => self.stack.values.replace_top::<i16x8, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8ExtractLaneU(lane) => self.stack.values.replace_top::<u16x8, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4ExtractLane(lane) => self.stack.values.replace_top::<i32x4, i32>(|v| Ok(v[*lane as usize])).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2ExtractLane(lane) => self.stack.values.replace_top::<i64x2, i64>(|v| Ok(v[*lane as usize])).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4ExtractLane(lane) => self.stack.values.replace_top::<f32x4, f32>(|v| Ok(v[*lane as usize])).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2ExtractLane(lane) => self.stack.values.replace_top::<f64x2, f64>(|v| Ok(v[*lane as usize])).to_cf()?,
+ // I8x16ExtractLaneS(lane) => self.stack.values.replace_top::<i8x16, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
+ // I8x16ExtractLaneU(lane) => self.stack.values.replace_top::<u8x16, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
+ // I16x8ExtractLaneS(lane) => self.stack.values.replace_top::<i16x8, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
+ // I16x8ExtractLaneU(lane) => self.stack.values.replace_top::<u16x8, i32>(|v| Ok(v[*lane as usize] as i32)).to_cf()?,
+ // I32x4ExtractLane(lane) => self.stack.values.replace_top::<i32x4, i32>(|v| Ok(v[*lane as usize])).to_cf()?,
+ // I64x2ExtractLane(lane) => self.stack.values.replace_top::<i64x2, i64>(|v| Ok(v[*lane as usize])).to_cf()?,
+ // F32x4ExtractLane(lane) => self.stack.values.replace_top::<f32x4, f32>(|v| Ok(v[*lane as usize])).to_cf()?,
+ // F64x2ExtractLane(lane) => self.stack.values.replace_top::<f64x2, f64>(|v| Ok(v[*lane as usize])).to_cf()?,
- #[cfg(feature = "unstable-simd")] V128Load8Lane(arg, lane) => self.exec_mem_load_lane::<i8, i8x16, 1>(arg.mem_addr(), arg.offset(), *lane)?,
- #[cfg(feature = "unstable-simd")] V128Load16Lane(arg, lane) => self.exec_mem_load_lane::<i16, i16x8, 2>(arg.mem_addr(), arg.offset(), *lane)?,
- #[cfg(feature = "unstable-simd")] V128Load32Lane(arg, lane) => self.exec_mem_load_lane::<i32, i32x4, 4>(arg.mem_addr(), arg.offset(), *lane)?,
- #[cfg(feature = "unstable-simd")] V128Load64Lane(arg, lane) => self.exec_mem_load_lane::<i64, i64x2, 8>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Load8Lane(arg, lane) => self.exec_mem_load_lane::<i8, i8x16, 1>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Load16Lane(arg, lane) => self.exec_mem_load_lane::<i16, i16x8, 2>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Load32Lane(arg, lane) => self.exec_mem_load_lane::<i32, i32x4, 4>(arg.mem_addr(), arg.offset(), *lane)?,
+ // V128Load64Lane(arg, lane) => self.exec_mem_load_lane::<i64, i64x2, 8>(arg.mem_addr(), arg.offset(), *lane)?,
- #[cfg(feature = "unstable-simd")] I8x16ReplaceLane(_lane) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ReplaceLane(_lane) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ReplaceLane(_lane) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ReplaceLane(_lane) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F32x4ReplaceLane(_lane) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2ReplaceLane(_lane) => unimplemented!(),
+ // I8x16ReplaceLane(_lane) => unimplemented!(),
+ // I16x8ReplaceLane(_lane) => unimplemented!(),
+ // I32x4ReplaceLane(_lane) => unimplemented!(),
+ // I64x2ReplaceLane(_lane) => unimplemented!(),
+ // F32x4ReplaceLane(_lane) => unimplemented!(),
+ // F64x2ReplaceLane(_lane) => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I8x16Splat => self.stack.values.replace_top::<i32, i8x16>(|v| Ok(Simd::<i8, 16>::splat(v as i8))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Splat => self.stack.values.replace_top::<i32, i16x8>(|v| Ok(Simd::<i16, 8>::splat(v as i16))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Splat => self.stack.values.replace_top::<i32, i32x4>(|v| Ok(Simd::<i32, 4>::splat(v))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Splat => self.stack.values.replace_top::<i64, i64x2>(|v| Ok(Simd::<i64, 2>::splat(v))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Splat => self.stack.values.replace_top::<f32, f32x4>(|v| Ok(Simd::<f32, 4>::splat(v))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Splat => self.stack.values.replace_top::<f64, f64x2>(|v| Ok(Simd::<f64, 2>::splat(v))).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()?,
- #[cfg(feature = "unstable-simd")] I8x16Eq => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Eq => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Eq => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Eq => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Eq => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_eq(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Eq => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_eq(b).to_int())).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()?,
+ // I64x2Eq => self.stack.values.calculate_same::<i64x2>(|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()?,
- #[cfg(feature = "unstable-simd")] I8x16Ne => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Ne => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Ne => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Ne => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Ne => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_ne(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Ne => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_ne(b).to_int())).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()?,
+ // I64x2Ne => self.stack.values.calculate_same::<i64x2>(|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()?,
- #[cfg(feature = "unstable-simd")] I8x16LtS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8LtS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4LtS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2LtS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16LtU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8LtU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4LtU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Lt => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_lt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Lt => self.stack.values.calculate::<f64x2, _>(|a, b| Ok(a.simd_lt(b).to_int())).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()?,
- #[cfg(feature = "unstable-simd")] F32x4Gt => self.stack.values.calculate::<f32x4, _>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Gt => self.stack.values.calculate::<f64x2, _>(|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()?,
- #[cfg(feature = "unstable-simd")] I8x16GtS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8GtS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4GtS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2GtS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2LeS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Le => self.stack.values.calculate::<f32x4,_>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Le => self.stack.values.calculate::<f64x2,_>(|a, b| Ok(a.simd_le(b).to_int())).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()?,
+ // I64x2GtS => self.stack.values.calculate_same::<i64x2>(|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()?,
- #[cfg(feature = "unstable-simd")] I8x16GtU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8GtU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4GtU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_gt(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Ge => self.stack.values.calculate::<f32x4,_>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Ge => self.stack.values.calculate::<f64x2,_>(|a, b| Ok(a.simd_ge(b).to_int())).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()?,
+ // 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()?,
- #[cfg(feature = "unstable-simd")] I8x16LeS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8LeS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4LeS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_le(b).to_int())).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()?,
- #[cfg(feature = "unstable-simd")] I8x16LeU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8LeU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_le(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4LeU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_le(b).to_int())).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()?,
- #[cfg(feature = "unstable-simd")] I8x16GeS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8GeS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4GeS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2GeS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
+ // I8x16GeS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
+ // I16x8GeS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
+ // I32x4GeS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
+ // I64x2GeS => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16GeU => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8GeU => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_ge(b).to_int())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4GeU => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_ge(b).to_int())).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()?,
- #[cfg(feature = "unstable-simd")] I8x16Abs => self.stack.values.replace_top_same::<i8x16>(|a| Ok(a.abs())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Abs => self.stack.values.replace_top_same::<i16x8>(|a| Ok(a.abs())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Abs => self.stack.values.replace_top_same::<i32x4>(|a| Ok(a.abs())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Abs => self.stack.values.replace_top_same::<i64x2>(|a| Ok(a.abs())).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()?,
- #[cfg(feature = "unstable-simd")] I8x16Neg => self.stack.values.replace_top_same::<i8x16>(|a| Ok(-a)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Neg => self.stack.values.replace_top_same::<i16x8>(|a| Ok(-a)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Neg => self.stack.values.replace_top_same::<i32x4>(|a| Ok(-a)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Neg => self.stack.values.replace_top_same::<i64x2>(|a| Ok(-a)).to_cf()?,
+ // I8x16Neg => self.stack.values.replace_top_same::<i8x16>(|a| Ok(-a)).to_cf()?,
+ // I16x8Neg => self.stack.values.replace_top_same::<i16x8>(|a| Ok(-a)).to_cf()?,
+ // I32x4Neg => self.stack.values.replace_top_same::<i32x4>(|a| Ok(-a)).to_cf()?,
+ // I64x2Neg => self.stack.values.replace_top_same::<i64x2>(|a| Ok(-a)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16AllTrue => self.stack.values.replace_top::<i8x16, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8AllTrue => self.stack.values.replace_top::<i16x8, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4AllTrue => self.stack.values.replace_top::<i32x4, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2AllTrue => self.stack.values.replace_top::<i64x2, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
+ // I8x16AllTrue => self.stack.values.replace_top::<i8x16, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
+ // I16x8AllTrue => self.stack.values.replace_top::<i16x8, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
+ // I32x4AllTrue => self.stack.values.replace_top::<i32x4, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
+ // I64x2AllTrue => self.stack.values.replace_top::<i64x2, i32>(|v| Ok((v.simd_ne(Simd::splat(0)).all()) as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16Bitmask => self.stack.values.replace_top::<i8x16, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Bitmask => self.stack.values.replace_top::<i16x8, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Bitmask => self.stack.values.replace_top::<i32x4, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Bitmask => self.stack.values.replace_top::<i64x2, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
+ // I8x16Bitmask => self.stack.values.replace_top::<i8x16, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
+ // I16x8Bitmask => self.stack.values.replace_top::<i16x8, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
+ // I32x4Bitmask => self.stack.values.replace_top::<i32x4, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
+ // I64x2Bitmask => self.stack.values.replace_top::<i64x2, i32>(|v| Ok(v.simd_lt(Simd::splat(0)).to_bitmask() as i32)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16Shl => self.stack.values.calculate_diff::<i32, i8x16, i8x16>(|a, b| Ok(b.shl(a as i8))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Shl => self.stack.values.calculate_diff::<i32, i16x8, i16x8>(|a, b| Ok(b.shl(a as i16))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Shl => self.stack.values.calculate_diff::<i32, i32x4, i32x4>(|a, b| Ok(b.shl(a))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Shl => self.stack.values.calculate_diff::<i32, i64x2, i64x2>(|a, b| Ok(b.shl(a as i64))).to_cf()?,
+ // I8x16Shl => self.stack.values.calculate_diff::<i32, i8x16, i8x16>(|a, b| Ok(b.shl(a as i8))).to_cf()?,
+ // I16x8Shl => self.stack.values.calculate_diff::<i32, i16x8, i16x8>(|a, b| Ok(b.shl(a as i16))).to_cf()?,
+ // I32x4Shl => self.stack.values.calculate_diff::<i32, i32x4, i32x4>(|a, b| Ok(b.shl(a))).to_cf()?,
+ // I64x2Shl => self.stack.values.calculate_diff::<i32, i64x2, i64x2>(|a, b| Ok(b.shl(a as i64))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16ShrS => self.stack.values.calculate_diff::<i32, i8x16, i8x16>(|a, b| Ok(b.shr(a as i8))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8ShrS => self.stack.values.calculate_diff::<i32, i16x8, i16x8>(|a, b| Ok(b.shr(a as i16))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4ShrS => self.stack.values.calculate_diff::<i32, i32x4, i32x4>(|a, b| Ok(b.shr(a))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2ShrS => self.stack.values.calculate_diff::<i32, i64x2, i64x2>(|a, b| Ok(b.shr(a as i64))).to_cf()?,
+ // I8x16ShrS => self.stack.values.calculate_diff::<i32, i8x16, i8x16>(|a, b| Ok(b.shr(a as i8))).to_cf()?,
+ // I16x8ShrS => self.stack.values.calculate_diff::<i32, i16x8, i16x8>(|a, b| Ok(b.shr(a as i16))).to_cf()?,
+ // I32x4ShrS => self.stack.values.calculate_diff::<i32, i32x4, i32x4>(|a, b| Ok(b.shr(a))).to_cf()?,
+ // I64x2ShrS => self.stack.values.calculate_diff::<i32, i64x2, i64x2>(|a, b| Ok(b.shr(a as i64))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16ShrU => self.stack.values.calculate_diff::<i32, u8x16, u8x16>(|a, b| Ok(b.shr(a as u8))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8ShrU => self.stack.values.calculate_diff::<i32, u16x8, u16x8>(|a, b| Ok(b.shr(a as u16))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4ShrU => self.stack.values.calculate_diff::<i32, u32x4, u32x4>(|a, b| Ok(b.shr(a as u32))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2ShrU => self.stack.values.calculate_diff::<i32, u64x2, u64x2>(|a, b| Ok(b.shr(a as u64))).to_cf()?,
+ // I8x16ShrU => self.stack.values.calculate_diff::<i32, u8x16, u8x16>(|a, b| Ok(b.shr(a as u8))).to_cf()?,
+ // I16x8ShrU => self.stack.values.calculate_diff::<i32, u16x8, u16x8>(|a, b| Ok(b.shr(a as u16))).to_cf()?,
+ // I32x4ShrU => self.stack.values.calculate_diff::<i32, u32x4, u32x4>(|a, b| Ok(b.shr(a as u32))).to_cf()?,
+ // I64x2ShrU => self.stack.values.calculate_diff::<i32, u64x2, u64x2>(|a, b| Ok(b.shr(a as u64))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16Add => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a + b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Add => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a + b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Add => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a + b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Add => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a + b)).to_cf()?,
+ // I8x16Add => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a + b)).to_cf()?,
+ // I16x8Add => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a + b)).to_cf()?,
+ // I32x4Add => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a + b)).to_cf()?,
+ // I64x2Add => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a + b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16Sub => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a - b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Sub => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a - b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Sub => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a - b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Sub => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a - b)).to_cf()?,
+ // I8x16Sub => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a - b)).to_cf()?,
+ // I16x8Sub => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a - b)).to_cf()?,
+ // I32x4Sub => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a - b)).to_cf()?,
+ // I64x2Sub => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a - b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16MinS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_min(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8MinS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_min(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4MinS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_min(b))).to_cf()?,
+ // I8x16MinS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_min(b))).to_cf()?,
+ // I16x8MinS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_min(b))).to_cf()?,
+ // I32x4MinS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_min(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16MinU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.simd_min(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8MinU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.simd_min(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4MinU => self.stack.values.calculate_same::<u32x4>(|a, b| Ok(a.simd_min(b))).to_cf()?,
+ // I8x16MinU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.simd_min(b))).to_cf()?,
+ // I16x8MinU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.simd_min(b))).to_cf()?,
+ // I32x4MinU => self.stack.values.calculate_same::<u32x4>(|a, b| Ok(a.simd_min(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16MaxS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_max(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8MaxS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_max(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4MaxS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_max(b))).to_cf()?,
+ // I8x16MaxS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.simd_max(b))).to_cf()?,
+ // I16x8MaxS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.simd_max(b))).to_cf()?,
+ // I32x4MaxS => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a.simd_max(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16MaxU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.simd_max(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8MaxU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.simd_max(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4MaxU => self.stack.values.calculate_same::<u32x4>(|a, b| Ok(a.simd_max(b))).to_cf()?,
+ // I8x16MaxU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.simd_max(b))).to_cf()?,
+ // I16x8MaxU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.simd_max(b))).to_cf()?,
+ // I32x4MaxU => self.stack.values.calculate_same::<u32x4>(|a, b| Ok(a.simd_max(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I64x2Mul => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a * b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8Mul => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a * b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4Mul => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a * b)).to_cf()?,
+ // I64x2Mul => self.stack.values.calculate_same::<i64x2>(|a, b| Ok(a * b)).to_cf()?,
+ // I16x8Mul => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a * b)).to_cf()?,
+ // I32x4Mul => self.stack.values.calculate_same::<i32x4>(|a, b| Ok(a * b)).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16NarrowI16x8S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I8x16NarrowI16x8U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8NarrowI32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8NarrowI32x4U => unimplemented!(),
+ // I8x16NarrowI16x8S => unimplemented!(),
+ // I8x16NarrowI16x8U => unimplemented!(),
+ // I16x8NarrowI32x4S => unimplemented!(),
+ // I16x8NarrowI32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I8x16AddSatS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8AddSatS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16AddSatU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8AddSatU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16SubSatS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8SubSatS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16SubSatU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I16x8SubSatU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
+ // I8x16AddSatS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
+ // I16x8AddSatS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
+ // I8x16AddSatU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
+ // I16x8AddSatU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.saturating_add(b))).to_cf()?,
+ // I8x16SubSatS => self.stack.values.calculate_same::<i8x16>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
+ // I16x8SubSatS => self.stack.values.calculate_same::<i16x8>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
+ // I8x16SubSatU => self.stack.values.calculate_same::<u8x16>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
+ // I16x8SubSatU => self.stack.values.calculate_same::<u16x8>(|a, b| Ok(a.saturating_sub(b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16AvgrU => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8AvgrU => unimplemented!(),
+ // I8x16AvgrU => unimplemented!(),
+ // I16x8AvgrU => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtAddPairwiseI8x16S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtAddPairwiseI8x16U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtAddPairwiseI16x8S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtAddPairwiseI16x8U => unimplemented!(),
+ // I16x8ExtAddPairwiseI8x16S => unimplemented!(),
+ // I16x8ExtAddPairwiseI8x16U => unimplemented!(),
+ // I32x4ExtAddPairwiseI16x8S => unimplemented!(),
+ // I32x4ExtAddPairwiseI16x8U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtMulLowI8x16S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtMulLowI8x16U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtMulHighI8x16S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtMulHighI8x16U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtMulLowI16x8S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtMulLowI16x8U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtMulHighI16x8S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtMulHighI16x8U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtMulLowI32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtMulLowI32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtMulHighI32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtMulHighI32x4U => unimplemented!(),
+ // I16x8ExtMulLowI8x16S => unimplemented!(),
+ // I16x8ExtMulLowI8x16U => unimplemented!(),
+ // I16x8ExtMulHighI8x16S => unimplemented!(),
+ // I16x8ExtMulHighI8x16U => unimplemented!(),
+ // I32x4ExtMulLowI16x8S => unimplemented!(),
+ // I32x4ExtMulLowI16x8U => unimplemented!(),
+ // I32x4ExtMulHighI16x8S => unimplemented!(),
+ // I32x4ExtMulHighI16x8U => unimplemented!(),
+ // I64x2ExtMulLowI32x4S => unimplemented!(),
+ // I64x2ExtMulLowI32x4U => unimplemented!(),
+ // I64x2ExtMulHighI32x4S => unimplemented!(),
+ // I64x2ExtMulHighI32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtendLowI8x16S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtendLowI8x16U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtendHighI8x16S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8ExtendHighI8x16U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtendLowI16x8S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtendLowI16x8U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtendHighI16x8S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4ExtendHighI16x8U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtendLowI32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtendLowI32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtendHighI32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2ExtendHighI32x4U => unimplemented!(),
+ // I16x8ExtendLowI8x16S => unimplemented!(),
+ // I16x8ExtendLowI8x16U => unimplemented!(),
+ // I16x8ExtendHighI8x16S => unimplemented!(),
+ // I16x8ExtendHighI8x16U => unimplemented!(),
+ // I32x4ExtendLowI16x8S => unimplemented!(),
+ // I32x4ExtendLowI16x8U => unimplemented!(),
+ // I32x4ExtendHighI16x8S => unimplemented!(),
+ // I32x4ExtendHighI16x8U => unimplemented!(),
+ // I64x2ExtendLowI32x4S => unimplemented!(),
+ // I64x2ExtendLowI32x4U => unimplemented!(),
+ // I64x2ExtendHighI32x4S => unimplemented!(),
+ // I64x2ExtendHighI32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I8x16Popcnt => self.stack.values.replace_top::<i8x16, _>(|v| Ok(v.count_ones())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I8x16Shuffle(_idx) => unimplemented!(),
+ // I8x16Popcnt => self.stack.values.replace_top::<i8x16, _>(|v| Ok(v.count_ones())).to_cf()?,
+ // I8x16Shuffle(_idx) => unimplemented!(),
+
+
+ // I16x8Q15MulrSatS => self.stack.values.calculate_same::<i16x8>(|a, b| {
+ // let subq15mulr = |a,b| {
+ // let a = a as i32;
+ // let b = b as i32;
+ // let r = (a * b + 0x4000) >> 15;
+ // if r > i16::MAX as i32 {
+ // i16::MAX
+ // } else if r < i16::MIN as i32 {
+ // i16::MIN
+ // } else {
+ // r as i16
+ // }
+ // };
+ // Ok(Simd::<i16, 8>::from_array([
+ // subq15mulr(a[0], b[0]),
+ // subq15mulr(a[1], b[1]),
+ // subq15mulr(a[2], b[2]),
+ // subq15mulr(a[3], b[3]),
+ // subq15mulr(a[4], b[4]),
+ // subq15mulr(a[5], b[5]),
+ // subq15mulr(a[6], b[6]),
+ // subq15mulr(a[7], b[7]),
+ // ]))
+ // }).to_cf()?,
+
+
+ // I32x4DotI16x8S => self.stack.values.calculate::<i16x8, i32x4>(|a, b| {
+ // Ok(Simd::<i32, 4>::from_array([
+ // i32::from(a[0] * b[0] + a[1] * b[1]),
+ // i32::from(a[2] * b[2] + a[3] * b[3]),
+ // i32::from(a[4] * b[4] + a[5] * b[5]),
+ // i32::from(a[6] * b[6] + a[7] * b[7]),
+ // ]))
+ // }).to_cf()?,
+
+ // F32x4Ceil => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.ceil())).to_cf()?,
+ // F64x2Ceil => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.ceil())).to_cf()?,
+ // F32x4Floor => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.floor())).to_cf()?,
+ // F64x2Floor => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.floor())).to_cf()?,
+ // F32x4Trunc => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.trunc())).to_cf()?,
+ // F64x2Trunc => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.trunc())).to_cf()?,
+ // F32x4Nearest => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.round())).to_cf()?,
+ // F64x2Nearest => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.round())).to_cf()?,
+ // F32x4Abs => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.abs())).to_cf()?,
+ // F64x2Abs => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.abs())).to_cf()?,
+ // F32x4Neg => self.stack.values.replace_top_same::<f32x4>(|v| Ok(-v)).to_cf()?,
+ // F64x2Neg => self.stack.values.replace_top_same::<f64x2>(|v| Ok(-v)).to_cf()?,
+ // F32x4Sqrt => self.stack.values.replace_top_same::<f32x4>(|v| Ok(canonicalize_f32x4(v.sqrt()))).to_cf()?,
+ // F64x2Sqrt => self.stack.values.replace_top_same::<f64x2>(|v| Ok(canonicalize_f64x2(v.sqrt()))).to_cf()?,
+ // F32x4Add => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a + b))).to_cf()?,
+ // F64x2Add => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a + b))).to_cf()?,
+ // F32x4Sub => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a - b))).to_cf()?,
+ // F64x2Sub => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a - b))).to_cf()?,
+ // F32x4Mul => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a * b))).to_cf()?,
+ // F64x2Mul => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a * b))).to_cf()?,
+ // F32x4Div => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a / b))).to_cf()?,
+ // F64x2Div => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a / b))).to_cf()?,
+
+ // F32x4Min => self.stack.values.calculate_same::<f32x4>(|a, b| {
+ // Ok(Simd::<f32, 4>::from_array([
+ // b[0].tw_minimum(a[0]),
+ // b[1].tw_minimum(a[1]),
+ // b[2].tw_minimum(a[2]),
+ // b[3].tw_minimum(a[3]),
+ // ]))
+ // }).to_cf()?,
+
+
+ // F64x2Min => self.stack.values.calculate_same::<f64x2>(|a, b| {
+ // Ok(Simd::<f64, 2>::from_array([
+ // b[0].tw_minimum(a[0]),
+ // b[1].tw_minimum(a[1]),
+ // ]))
+ // }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- I16x8Q15MulrSatS => self.stack.values.calculate_same::<i16x8>(|a, b| {
- let subq15mulr = |a,b| {
- let a = a as i32;
- let b = b as i32;
- let r = (a * b + 0x4000) >> 15;
- if r > i16::MAX as i32 {
- i16::MAX
- } else if r < i16::MIN as i32 {
- i16::MIN
- } else {
- r as i16
- }
- };
- Ok(Simd::<i16, 8>::from_array([
- subq15mulr(a[0], b[0]),
- subq15mulr(a[1], b[1]),
- subq15mulr(a[2], b[2]),
- subq15mulr(a[3], b[3]),
- subq15mulr(a[4], b[4]),
- subq15mulr(a[5], b[5]),
- subq15mulr(a[6], b[6]),
- subq15mulr(a[7], b[7]),
- ]))
- }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- I32x4DotI16x8S => self.stack.values.calculate::<i16x8, i32x4>(|a, b| {
- Ok(Simd::<i32, 4>::from_array([
- i32::from(a[0] * b[0] + a[1] * b[1]),
- i32::from(a[2] * b[2] + a[3] * b[3]),
- i32::from(a[4] * b[4] + a[5] * b[5]),
- i32::from(a[6] * b[6] + a[7] * b[7]),
- ]))
- }).to_cf()?,
+ // F32x4Max => self.stack.values.calculate_same::<f32x4>(|a, b| {
+ // Ok(Simd::<f32, 4>::from_array([
+ // b[0].tw_maximum(a[0]),
+ // b[1].tw_maximum(a[1]),
+ // b[2].tw_maximum(a[2]),
+ // b[3].tw_maximum(a[3]),
+ // ]))
+ // }).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Ceil => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.ceil())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Ceil => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.ceil())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Floor => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.floor())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Floor => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.floor())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Trunc => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.trunc())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Trunc => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.trunc())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Nearest => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.round())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Nearest => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.round())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Abs => self.stack.values.replace_top_same::<f32x4>(|v| Ok(v.abs())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Abs => self.stack.values.replace_top_same::<f64x2>(|v| Ok(v.abs())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Neg => self.stack.values.replace_top_same::<f32x4>(|v| Ok(-v)).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Neg => self.stack.values.replace_top_same::<f64x2>(|v| Ok(-v)).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Sqrt => self.stack.values.replace_top_same::<f32x4>(|v| Ok(canonicalize_f32x4(v.sqrt()))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Sqrt => self.stack.values.replace_top_same::<f64x2>(|v| Ok(canonicalize_f64x2(v.sqrt()))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Add => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a + b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Add => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a + b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Sub => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a - b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Sub => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a - b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Mul => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a * b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Mul => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a * b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4Div => self.stack.values.calculate_same::<f32x4>(|a, b| Ok(canonicalize_f32x4(a / b))).to_cf()?,
- #[cfg(feature = "unstable-simd")] F64x2Div => self.stack.values.calculate_same::<f64x2>(|a, b| Ok(canonicalize_f64x2(a / b))).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F32x4Min => self.stack.values.calculate_same::<f32x4>(|a, b| {
- Ok(Simd::<f32, 4>::from_array([
- b[0].tw_minimum(a[0]),
- b[1].tw_minimum(a[1]),
- b[2].tw_minimum(a[2]),
- b[3].tw_minimum(a[3]),
- ]))
- }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F64x2Min => self.stack.values.calculate_same::<f64x2>(|a, b| {
- Ok(Simd::<f64, 2>::from_array([
- b[0].tw_minimum(a[0]),
- b[1].tw_minimum(a[1]),
- ]))
- }).to_cf()?,
+ // F64x2Max => self.stack.values.calculate_same::<f64x2>(|a, b| {
+ // Ok(Simd::<f64, 2>::from_array([
+ // b[0].tw_maximum(a[0]),
+ // b[1].tw_maximum(a[1]),
+ // ]))
+ // }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F32x4Max => self.stack.values.calculate_same::<f32x4>(|a, b| {
- Ok(Simd::<f32, 4>::from_array([
- b[0].tw_maximum(a[0]),
- b[1].tw_maximum(a[1]),
- b[2].tw_maximum(a[2]),
- b[3].tw_maximum(a[3]),
- ]))
- }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F64x2Max => self.stack.values.calculate_same::<f64x2>(|a, b| {
- Ok(Simd::<f64, 2>::from_array([
- b[0].tw_maximum(a[0]),
- b[1].tw_maximum(a[1]),
- ]))
- }).to_cf()?,
+ // F32x4PMin => self.stack.values.calculate_same::<f32x4>(|a, b| {
+ // Ok(Simd::<f32, 4>::from_array([
+ // if b[0] < a[0] { b[0] } else { a[0]},
+ // if b[1] < a[1] { b[1] } else { a[1]},
+ // if b[2] < a[2] { b[2] } else { a[2]},
+ // if b[3] < a[3] { b[3] } else { a[3]},
+ // ]))
+ // }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F32x4PMin => self.stack.values.calculate_same::<f32x4>(|a, b| {
- Ok(Simd::<f32, 4>::from_array([
- if b[0] < a[0] { b[0] } else { a[0]},
- if b[1] < a[1] { b[1] } else { a[1]},
- if b[2] < a[2] { b[2] } else { a[2]},
- if b[3] < a[3] { b[3] } else { a[3]},
- ]))
- }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F32x4PMax => self.stack.values.calculate_same::<f32x4>(|a, b| {
- Ok(Simd::<f32, 4>::from_array([
- if b[0] > a[0] { b[0] } else { a[0]},
- if b[1] > a[1] { b[1] } else { a[1]},
- if b[2] > a[2] { b[2] } else { a[2]},
- if b[3] > a[3] { b[3] } else { a[3]},
- ]))
- }).to_cf()?,
+ // F32x4PMax => self.stack.values.calculate_same::<f32x4>(|a, b| {
+ // Ok(Simd::<f32, 4>::from_array([
+ // if b[0] > a[0] { b[0] } else { a[0]},
+ // if b[1] > a[1] { b[1] } else { a[1]},
+ // if b[2] > a[2] { b[2] } else { a[2]},
+ // if b[3] > a[3] { b[3] } else { a[3]},
+ // ]))
+ // }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F64x2PMin => self.stack.values.calculate_same::<f64x2>(|a, b| {
- Ok(Simd::<f64, 2>::from_array([
- if b[0] < a[0] { b[0] } else { a[0]},
- if b[1] < a[1] { b[1] } else { a[1]},
- ]))
- }).to_cf()?,
- #[cfg(feature = "unstable-simd")]
- F64x2PMax => self.stack.values.calculate_same::<f64x2>(|a, b| {
- Ok(Simd::<f64, 2>::from_array([
- if b[0] > a[0] { b[0] } else { a[0]},
- if b[1] > a[1] { b[1] } else { a[1]},
- ]))
- }).to_cf()?,
+ // F64x2PMin => self.stack.values.calculate_same::<f64x2>(|a, b| {
+ // Ok(Simd::<f64, 2>::from_array([
+ // if b[0] < a[0] { b[0] } else { a[0]},
+ // if b[1] < a[1] { b[1] } else { a[1]},
+ // ]))
+ // }).to_cf()?,
- // not correct
- #[cfg(feature = "unstable-simd")] I32x4TruncSatF32x4S => self.stack.values.replace_top::<f32x4, f32x4>(|v| Ok(v.trunc())).to_cf()?,
- #[cfg(feature = "unstable-simd")] I32x4TruncSatF32x4U => self.stack.values.replace_top::<f32x4, f32x4>(|v| Ok(v.trunc())).to_cf()?,
- #[cfg(feature = "unstable-simd")] F32x4ConvertI32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F32x4ConvertI32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2ConvertLowI32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2ConvertLowI32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F32x4DemoteF64x2Zero => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2PromoteLowF32x4 => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4TruncSatF64x2SZero => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4TruncSatF64x2UZero => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I8x16RelaxedSwizzle => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4RelaxedTruncF32x4S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4RelaxedTruncF32x4U => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4RelaxedTruncF64x2SZero => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4RelaxedTruncF64x2UZero => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F32x4RelaxedMadd => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F32x4RelaxedNmadd => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2RelaxedMadd => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2RelaxedNmadd => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I8x16RelaxedLaneselect => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8RelaxedLaneselect => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4RelaxedLaneselect => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I64x2RelaxedLaneselect => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F32x4RelaxedMin => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F32x4RelaxedMax => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2RelaxedMin => unimplemented!(),
- #[cfg(feature = "unstable-simd")] F64x2RelaxedMax => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8RelaxedQ15mulrS => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I16x8RelaxedDotI8x16I7x16S => unimplemented!(),
- #[cfg(feature = "unstable-simd")] I32x4RelaxedDotI8x16I7x16AddS => unimplemented!(),
+ // F64x2PMax => self.stack.values.calculate_same::<f64x2>(|a, b| {
+ // Ok(Simd::<f64, 2>::from_array([
+ // if b[0] > a[0] { b[0] } else { a[0]},
+ // if b[1] > a[1] { b[1] } else { a[1]},
+ // ]))
+ // }).to_cf()?,
+
+ // // not correct
+ // I32x4TruncSatF32x4S => self.stack.values.replace_top::<f32x4, f32x4>(|v| Ok(v.trunc())).to_cf()?,
+ // I32x4TruncSatF32x4U => self.stack.values.replace_top::<f32x4, f32x4>(|v| Ok(v.trunc())).to_cf()?,
+ // F32x4ConvertI32x4S => unimplemented!(),
+ // F32x4ConvertI32x4U => unimplemented!(),
+ // F64x2ConvertLowI32x4S => unimplemented!(),
+ // F64x2ConvertLowI32x4U => unimplemented!(),
+ // F32x4DemoteF64x2Zero => unimplemented!(),
+ // F64x2PromoteLowF32x4 => unimplemented!(),
+ // I32x4TruncSatF64x2SZero => unimplemented!(),
+ // I32x4TruncSatF64x2UZero => unimplemented!(),
+
+ // I8x16RelaxedSwizzle => unimplemented!(),
+ // I32x4RelaxedTruncF32x4S => unimplemented!(),
+ // I32x4RelaxedTruncF32x4U => unimplemented!(),
+ // I32x4RelaxedTruncF64x2SZero => unimplemented!(),
+ // I32x4RelaxedTruncF64x2UZero => unimplemented!(),
+ // F32x4RelaxedMadd => unimplemented!(),
+ // F32x4RelaxedNmadd => unimplemented!(),
+ // F64x2RelaxedMadd => unimplemented!(),
+ // F64x2RelaxedNmadd => unimplemented!(),
+ // I8x16RelaxedLaneselect => unimplemented!(),
+ // I16x8RelaxedLaneselect => unimplemented!(),
+ // I32x4RelaxedLaneselect => unimplemented!(),
+ // I64x2RelaxedLaneselect => unimplemented!(),
+ // F32x4RelaxedMin => unimplemented!(),
+ // F32x4RelaxedMax => unimplemented!(),
+ // F64x2RelaxedMin => unimplemented!(),
+ // F64x2RelaxedMax => unimplemented!(),
+ // I16x8RelaxedQ15mulrS => unimplemented!(),
+ // I16x8RelaxedDotI8x16I7x16S => unimplemented!(),
+ // I32x4RelaxedDotI8x16I7x16AddS => unimplemented!(),
#[allow(unreachable_patterns)]
i => return ControlFlow::Break(Some(Error::UnsupportedFeature(format!("unimplemented opcode: {i:?}")))),
@@ -995,7 +988,7 @@ impl<'store, 'stack> Executor<'store, 'stack> {
let data = self
.store
.data
- .datas
+ .data
.get(self.module.resolve_data_addr(data_index) as usize)
.ok_or_else(|| Error::Other("data not found".to_string()))?;
@@ -1045,33 +1038,32 @@ impl<'store, 'stack> Executor<'store, 'stack> {
}
}
- #[cfg(feature = "unstable-simd")]
- fn exec_mem_load_lane<
- LOAD: MemLoadable<LOAD_SIZE>,
- INTO: InternalValue + IndexMut<usize, Output = LOAD>,
- const LOAD_SIZE: usize,
- >(
- &mut self,
- mem_addr: tinywasm_types::MemAddr,
- offset: u64,
- lane: u8,
- ) -> ControlFlow<Option<Error>> {
- let mem = self.store.get_mem(self.module.resolve_mem_addr(mem_addr));
- let mut imm = self.stack.values.pop::<INTO>();
- let val = self.stack.values.pop::<i32>() as u64;
- let Some(Ok(addr)) = offset.checked_add(val).map(TryInto::try_into) else {
- cold();
- return ControlFlow::Break(Some(Error::Trap(Trap::MemoryOutOfBounds {
- offset: val as usize,
- len: LOAD_SIZE,
- max: 0,
- })));
- };
- let val = mem.load_as::<LOAD_SIZE, LOAD>(addr).to_cf()?;
- imm[lane as usize] = val;
- self.stack.values.push(imm);
- ControlFlow::Continue(())
- }
+ // fn exec_mem_load_lane<
+ // LOAD: MemLoadable<LOAD_SIZE>,
+ // INTO: InternalValue + IndexMut<usize, Output = LOAD>,
+ // const LOAD_SIZE: usize,
+ // >(
+ // &mut self,
+ // mem_addr: tinywasm_types::MemAddr,
+ // offset: u64,
+ // lane: u8,
+ // ) -> ControlFlow<Option<Error>> {
+ // let mem = self.store.get_mem(self.module.resolve_mem_addr(mem_addr));
+ // let mut imm = self.stack.values.pop::<INTO>();
+ // let val = self.stack.values.pop::<i32>() as u64;
+ // let Some(Ok(addr)) = offset.checked_add(val).map(TryInto::try_into) else {
+ // cold();
+ // return ControlFlow::Break(Some(Error::Trap(Trap::MemoryOutOfBounds {
+ // offset: val as usize,
+ // len: LOAD_SIZE,
+ // max: 0,
+ // })));
+ // };
+ // let val = mem.load_as::<LOAD_SIZE, LOAD>(addr).to_cf()?;
+ // imm[lane as usize] = val;
+ // self.stack.values.push(imm);
+ // ControlFlow::Continue(())
+ // }
fn exec_mem_load<LOAD: MemLoadable<LOAD_SIZE>, const LOAD_SIZE: usize, TARGET: InternalValue>(
&mut self,
@@ -1099,28 +1091,27 @@ impl<'store, 'stack> Executor<'store, 'stack> {
ControlFlow::Continue(())
}
- #[cfg(feature = "unstable-simd")]
- fn exec_mem_store_lane<T: InternalValue + Index<usize, Output = U>, U: MemStorable<N> + Copy, const N: usize>(
- &mut self,
- mem_addr: tinywasm_types::MemAddr,
- offset: u64,
- lane: u8,
- ) -> ControlFlow<Option<Error>> {
- let mem = self.store.get_mem_mut(self.module.resolve_mem_addr(mem_addr));
- let val = self.stack.values.pop::<T>();
- let val = val[lane as usize].to_mem_bytes();
+ // fn exec_mem_store_lane<T: InternalValue + Index<usize, Output = U>, U: MemStorable<N> + Copy, const N: usize>(
+ // &mut self,
+ // mem_addr: tinywasm_types::MemAddr,
+ // offset: u64,
+ // lane: u8,
+ // ) -> ControlFlow<Option<Error>> {
+ // let mem = self.store.get_mem_mut(self.module.resolve_mem_addr(mem_addr));
+ // let val = self.stack.values.pop::<T>();
+ // let val = val[lane as usize].to_mem_bytes();
- let addr = match mem.is_64bit() {
- true => self.stack.values.pop::<i64>() as u64,
- false => self.stack.values.pop::<i32>() as u32 as u64,
- };
+ // let addr = match mem.is_64bit() {
+ // true => self.stack.values.pop::<i64>() as u64,
+ // false => self.stack.values.pop::<i32>() as u32 as u64,
+ // };
- if let Err(e) = mem.store((offset + addr) as usize, val.len(), &val) {
- return ControlFlow::Break(Some(e));
- }
+ // if let Err(e) = mem.store((offset + addr) as usize, val.len(), &val) {
+ // return ControlFlow::Break(Some(e));
+ // }
- ControlFlow::Continue(())
- }
+ // ControlFlow::Continue(())
+ // }
fn exec_mem_store<T: InternalValue, U: MemStorable<N>, const N: usize>(
&mut self,
diff --git a/crates/tinywasm/src/interpreter/mod.rs b/crates/tinywasm/src/interpreter/mod.rs
index 0b7df2f..6d94ce1 100644
--- a/crates/tinywasm/src/interpreter/mod.rs
+++ b/crates/tinywasm/src/interpreter/mod.rs
@@ -1,12 +1,14 @@
pub(crate) mod executor;
pub(crate) mod num_helpers;
pub(crate) mod stack;
-mod values;
+pub(crate) mod value128;
+pub(crate) mod values;
#[cfg(not(feature = "std"))]
mod no_std_floats;
use crate::{Result, Store};
+pub(crate) use value128::*;
pub use values::*;
/// The main `TinyWasm` runtime.
diff --git a/crates/tinywasm/src/interpreter/no_std_floats.rs b/crates/tinywasm/src/interpreter/no_std_floats.rs
index e273184..b6ce998 100644
--- a/crates/tinywasm/src/interpreter/no_std_floats.rs
+++ b/crates/tinywasm/src/interpreter/no_std_floats.rs
@@ -1,3 +1,4 @@
+// see https://github.com/rust-lang/rust/issues/137578 :(
pub(super) trait NoStdFloatExt {
fn round(self) -> Self;
fn ceil(self) -> Self;
diff --git a/crates/tinywasm/src/interpreter/num_helpers.rs b/crates/tinywasm/src/interpreter/num_helpers.rs
index da27f3d..0356403 100644
--- a/crates/tinywasm/src/interpreter/num_helpers.rs
+++ b/crates/tinywasm/src/interpreter/num_helpers.rs
@@ -190,35 +190,3 @@ macro_rules! impl_checked_wrapping_rem {
}
impl_checked_wrapping_rem! { i32 i64 u32 u64 }
-
-#[cfg(all(feature = "unstable-simd", not(feature = "canonicalize_nans")))]
-#[inline]
-pub(crate) fn canonicalize_f32x4(x: core::simd::f32x4) -> core::simd::f32x4 {
- x // No need to do anything, as we are not replacing NaNs
-}
-
-#[cfg(all(feature = "unstable-simd", feature = "canonicalize_nans"))]
-/// replace all NaNs in a f32x4 with f32::NAN
-#[inline]
-pub(crate) fn canonicalize_f32x4(x: core::simd::f32x4) -> core::simd::f32x4 {
- use core::simd::{Simd, num::SimdFloat};
- let nan = Simd::splat(f32::NAN);
- let mask = x.is_nan();
- mask.select(nan, x)
-}
-
-#[cfg(all(feature = "unstable-simd", not(feature = "canonicalize_nans")))]
-#[inline]
-pub(crate) fn canonicalize_f64x2(x: core::simd::f64x2) -> core::simd::f64x2 {
- x // No need to do anything, as we are not replacing NaNs
-}
-
-#[cfg(feature = "unstable-simd")]
-/// replace all NaNs in a f64x2 with f64::NAN
-#[inline]
-pub(crate) fn canonicalize_f64x2(x: core::simd::f64x2) -> core::simd::f64x2 {
- use core::simd::{Simd, num::SimdFloat};
- let nan = Simd::splat(f64::NAN);
- let mask = x.is_nan();
- mask.select(nan, x)
-}
diff --git a/crates/tinywasm/src/interpreter/stack/call_stack.rs b/crates/tinywasm/src/interpreter/stack/call_stack.rs
index c7f02b6..e0a4d6a 100644
--- a/crates/tinywasm/src/interpreter/stack/call_stack.rs
+++ b/crates/tinywasm/src/interpreter/stack/call_stack.rs
@@ -2,7 +2,7 @@ use core::ops::ControlFlow;
use super::BlockType;
use crate::Trap;
-use crate::interpreter::values::*;
+use crate::interpreter::{Value128, values::*};
use crate::{Error, unlikely};
use alloc::boxed::Box;
diff --git a/crates/tinywasm/src/interpreter/stack/value_stack.rs b/crates/tinywasm/src/interpreter/stack/value_stack.rs
index 054ffe3..6e02b0f 100644
--- a/crates/tinywasm/src/interpreter/stack/value_stack.rs
+++ b/crates/tinywasm/src/interpreter/stack/value_stack.rs
@@ -188,12 +188,7 @@ impl ValueStack {
ValType::F64 => WasmValue::F64(self.pop()),
ValType::RefExtern => WasmValue::RefExtern(ExternRef::new(self.pop())),
ValType::RefFunc => WasmValue::RefFunc(FuncRef::new(self.pop())),
-
- #[cfg(not(feature = "unstable-simd"))]
- ValType::V128 => WasmValue::V128(self.pop()),
-
- #[cfg(feature = "unstable-simd")]
- ValType::V128 => WasmValue::V128(i128::from_le_bytes(self.pop::<Value128>().to_array())),
+ ValType::V128 => WasmValue::V128(self.pop::<Value128>().into()),
}
}
diff --git a/crates/tinywasm/src/interpreter/value128.rs b/crates/tinywasm/src/interpreter/value128.rs
new file mode 100644
index 0000000..12d70e5
--- /dev/null
+++ b/crates/tinywasm/src/interpreter/value128.rs
@@ -0,0 +1,76 @@
+#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
+pub struct Value128(i128);
+
+impl Value128 {
+ pub const fn from_le_bytes(bytes: [u8; 16]) -> Self {
+ Self(i128::from_le_bytes(bytes))
+ }
+
+ pub const fn to_le_bytes(self) -> [u8; 16] {
+ self.0.to_le_bytes()
+ }
+
+ pub const fn reduce_or(self) -> u8 {
+ let mut result = 0u8;
+ let bytes = self.to_le_bytes();
+ let mut i = 0;
+ while i < 16 {
+ result |= bytes[i];
+ i += 1;
+ }
+ result
+ }
+
+ pub const fn swizzle(self, s: Self) -> Self {
+ let a_bytes = self.to_le_bytes();
+ let s_bytes = s.to_le_bytes();
+ let mut result_bytes = [0u8; 16];
+ let mut i = 0;
+ while i < 16 {
+ let index = s_bytes[i] as usize;
+ result_bytes[i] = if index < 16 { a_bytes[index] } else { 0 };
+ i += 1;
+ }
+ Self::from_le_bytes(result_bytes)
+ }
+}
+
+impl From<Value128> for i128 {
+ fn from(val: Value128) -> Self {
+ val.0
+ }
+}
+
+impl From<i128> for Value128 {
+ fn from(value: i128) -> Self {
+ Self(value)
+ }
+}
+
+impl core::ops::Not for Value128 {
+ type Output = Self;
+ fn not(self) -> Self::Output {
+ Self(!self.0)
+ }
+}
+
+impl core::ops::BitAnd for Value128 {
+ type Output = Self;
+ fn bitand(self, rhs: Self) -> Self::Output {
+ Self(self.0 & rhs.0)
+ }
+}
+
+impl core::ops::BitOr for Value128 {
+ type Output = Self;
+ fn bitor(self, rhs: Self) -> Self::Output {
+ Self(self.0 | rhs.0)
+ }
+}
+
+impl core::ops::BitXor for Value128 {
+ type Output = Self;
+ fn bitxor(self, rhs: Self) -> Self::Output {
+ Self(self.0 ^ rhs.0)
+ }
+}
diff --git a/crates/tinywasm/src/interpreter/values.rs b/crates/tinywasm/src/interpreter/values.rs
index 9cf90ca..0940c97 100644
--- a/crates/tinywasm/src/interpreter/values.rs
+++ b/crates/tinywasm/src/interpreter/values.rs
@@ -1,4 +1,4 @@
-use crate::Result;
+use crate::{Result, interpreter::value128::Value128};
use super::stack::{Locals, ValueStack};
use tinywasm_types::{ExternRef, FuncRef, LocalAddr, ValType, WasmValue};
@@ -7,11 +7,6 @@ pub(crate) type Value32 = u32;
pub(crate) type Value64 = u64;
pub(crate) type ValueRef = Option<u32>;
-#[cfg(feature = "unstable-simd")]
-pub(crate) type Value128 = core::simd::u8x16;
-#[cfg(not(feature = "unstable-simd"))]
-pub(crate) type Value128 = i128;
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
/// A untyped WebAssembly value
pub enum TinyWasmValue {
@@ -112,12 +107,7 @@ impl TinyWasmValue {
ValType::F64 => WasmValue::F64(f64::from_bits(self.unwrap_64())),
ValType::RefExtern => WasmValue::RefExtern(ExternRef::new(self.unwrap_ref())),
ValType::RefFunc => WasmValue::RefFunc(FuncRef::new(self.unwrap_ref())),
-
- #[cfg(feature = "unstable-simd")]
- ValType::V128 => WasmValue::V128(i128::from_le_bytes(self.unwrap_128().to_array())),
-
- #[cfg(not(feature = "unstable-simd"))]
- ValType::V128 => WasmValue::V128(self.unwrap_128()),
+ ValType::V128 => WasmValue::V128(self.unwrap_128().into()),
}
}
}
@@ -131,12 +121,7 @@ impl From<&WasmValue> for TinyWasmValue {
WasmValue::F64(v) => Self::Value64(v.to_bits()),
WasmValue::RefExtern(v) => Self::ValueRef(v.addr()),
WasmValue::RefFunc(v) => Self::ValueRef(v.addr()),
-
- #[cfg(not(feature = "unstable-simd"))]
- WasmValue::V128(v) => Self::Value128(*v),
-
- #[cfg(feature = "unstable-simd")]
- WasmValue::V128(v) => TinyWasmValue::Value128(v.to_le_bytes().into()),
+ WasmValue::V128(v) => Self::Value128((*v).into()),
}
}
}
@@ -147,6 +132,12 @@ impl From<WasmValue> for TinyWasmValue {
}
}
+impl From<i128> for TinyWasmValue {
+ fn from(value: i128) -> Self {
+ Self::Value128(Value128::from(value))
+ }
+}
+
mod sealed {
#[expect(unreachable_pub)]
pub trait Sealed {}
@@ -272,22 +263,3 @@ impl_internalvalue! {
ValueRef, stack_ref, locals_ref, ValueRef, ValueRef, |v| v, |v| v
Value128, stack_128, locals_128, Value128, Value128, |v| v, |v| v
}
-
-#[cfg(feature = "unstable-simd")]
-use core::simd::{num::SimdUint, *};
-
-#[cfg(feature = "unstable-simd")]
-impl_internalvalue! {
- Value128, stack_128, locals_128, u8x16, i128, |v: i128| v.to_le_bytes().into(), |v: u8x16| i128::from_le_bytes(v.into())
- Value128, stack_128, locals_128, u8x16, u128, |v: u128| v.to_le_bytes().into(), |v: u8x16| u128::from_le_bytes(v.into())
- Value128, stack_128, locals_128, u8x16, i8x16, |v: i8x16| v.to_le_bytes(), |v: u8x16| v.cast()
- Value128, stack_128, locals_128, u8x16, i16x8, |v: i16x8| v.to_le_bytes(), |v: u8x16| i16x8::from_le_bytes(v)
- Value128, stack_128, locals_128, u8x16, i32x4, |v: i32x4| v.to_le_bytes(), |v: u8x16| i32x4::from_le_bytes(v)
- Value128, stack_128, locals_128, u8x16, i64x2, |v: i64x2| v.to_le_bytes(), |v: u8x16| i64x2::from_le_bytes(v)
- Value128, stack_128, locals_128, u8x16, f32x4, |v: f32x4| v.to_le_bytes(), |v: u8x16| f32x4::from_le_bytes(v)
- Value128, stack_128, locals_128, u8x16, f64x2, |v: f64x2| v.to_le_bytes(), |v: u8x16| f64x2::from_le_bytes(v)
-
- Value128, stack_128, locals_128, u8x16, u16x8, |v: u16x8| v.to_le_bytes(), |v: u8x16| u16x8::from_le_bytes(v)
- Value128, stack_128, locals_128, u8x16, u32x4, |v: u32x4| v.to_le_bytes(), |v: u8x16| u32x4::from_le_bytes(v)
- Value128, stack_128, locals_128, u8x16, u64x2, |v: u64x2| v.to_le_bytes(), |v: u8x16| u64x2::from_le_bytes(v)
-}
diff --git a/crates/tinywasm/src/lib.rs b/crates/tinywasm/src/lib.rs
index 0037829..a176670 100644
--- a/crates/tinywasm/src/lib.rs
+++ b/crates/tinywasm/src/lib.rs
@@ -5,7 +5,6 @@
))]
#![warn(missing_docs, missing_debug_implementations, rust_2018_idioms, unreachable_pub)]
#![forbid(unsafe_code)]
-#![cfg_attr(feature = "unstable-simd", feature(portable_simd))]
//! A tiny WebAssembly Runtime written in Rust
//!
@@ -16,7 +15,7 @@
//! ## Features
//!- **`std`**\
//! Enables the use of `std` and `std::io` for parsing from files and streams. This is enabled by default.
-//!- **`logging`**\
+//!- **`log`**\
//! Enables logging using the `log` crate. This is enabled by default.
//!- **`parser`**\
//! Enables the `tinywasm-parser` crate. This is enabled by default.
@@ -97,12 +96,12 @@ mod std;
extern crate alloc;
// log for logging (optional).
-#[cfg(feature = "logging")]
+#[cfg(feature = "log")]
#[expect(clippy::single_component_path_imports)]
use log;
// noop fallback if logging is disabled.
-#[cfg(not(feature = "logging"))]
+#[cfg(not(feature = "log"))]
#[allow(unused_imports, unused_macros)]
pub(crate) mod log {
macro_rules! debug ( ($($tt:tt)*) => {{}} );
diff --git a/crates/tinywasm/src/store/memory.rs b/crates/tinywasm/src/store/memory.rs
index b8ca1e8..267ca9a 100644
--- a/crates/tinywasm/src/store/memory.rs
+++ b/crates/tinywasm/src/store/memory.rs
@@ -4,9 +4,6 @@ use tinywasm_types::{MemoryArch, MemoryType, ModuleInstanceAddr};
use crate::{Error, Result, cold, interpreter::Value128, log};
-#[cfg(feature = "unstable-simd")]
-use core::simd::ToBytes;
-
/// A WebAssembly Memory Instance
///
/// See <https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances>
@@ -189,28 +186,6 @@ macro_rules! impl_mem_traits {
impl_mem_traits!(u8, 1, i8, 1, u16, 2, i16, 2, u32, 4, i32, 4, f32, 4, u64, 8, i64, 8, f64, 8, Value128, 16);
-#[cfg(feature = "unstable-simd")]
-impl_mem_traits!(
- core::simd::i8x16,
- 16,
- core::simd::i16x8,
- 16,
- core::simd::i32x4,
- 16,
- core::simd::i64x2,
- 16,
- core::simd::u16x8,
- 16,
- core::simd::u32x4,
- 16,
- core::simd::u64x2,
- 16,
- core::simd::f32x4,
- 16,
- core::simd::f64x2,
- 16
-);
-
#[cfg(test)]
mod memory_instance_tests {
use super::*;
diff --git a/crates/tinywasm/src/store/mod.rs b/crates/tinywasm/src/store/mod.rs
index 8446297..9cafa7e 100644
--- a/crates/tinywasm/src/store/mod.rs
+++ b/crates/tinywasm/src/store/mod.rs
@@ -111,7 +111,7 @@ pub(crate) struct StoreData {
pub(crate) memories: Vec<MemoryInstance>,
pub(crate) globals: Vec<GlobalInstance>,
pub(crate) elements: Vec<ElementInstance>,
- pub(crate) datas: Vec<DataInstance>,
+ pub(crate) data: Vec<DataInstance>,
}
impl Store {
@@ -199,7 +199,7 @@ impl Store {
/// Get the data at the actual index in the store
#[inline]
pub(crate) fn get_data_mut(&mut self, addr: DataAddr) -> &mut DataInstance {
- &mut self.data.datas[addr as usize]
+ &mut self.data.data[addr as usize]
}
/// Get the element at the actual index in the store
@@ -370,15 +370,15 @@ impl Store {
}
/// Add data to the store, returning their addresses in the store
- pub(crate) fn init_datas(
+ pub(crate) fn init_data(
&mut self,
mem_addrs: &[MemAddr],
- datas: Vec<Data>,
+ data: Vec<Data>,
idx: ModuleInstanceAddr,
) -> Result<(Box<[Addr]>, Option<Trap>)> {
- let data_count = self.data.datas.len();
+ let data_count = self.data.data.len();
let mut data_addrs = Vec::with_capacity(data_count);
- for (i, data) in datas.into_iter().enumerate() {
+ for (i, data) in data.into_iter().enumerate() {
let data_val = match data.kind {
tinywasm_types::DataKind::Active { mem: mem_addr, offset } => {
let Some(mem_addr) = mem_addrs.get(mem_addr as usize) else {
@@ -399,7 +399,7 @@ impl Store {
tinywasm_types::DataKind::Passive => Some(data.data.to_vec()),
};
- self.data.datas.push(DataInstance::new(data_val, idx));
+ self.data.data.push(DataInstance::new(data_val, idx));
data_addrs.push((i + data_count) as Addr);
}
diff --git a/crates/types/Cargo.toml b/crates/types/Cargo.toml
index b986c2a..5efcb8b 100644
--- a/crates/types/Cargo.toml
+++ b/crates/types/Cargo.toml
@@ -16,8 +16,8 @@ postcard={version="1.1", optional=true, default-features=false, features=["alloc
serde={version="1.0", optional=true, default-features=false, features=["alloc"]}
[features]
-default=["std", "logging", "archive"]
+default=["std", "log", "archive"]
std=["serde?/std"]
archive=["dep:postcard", "dep:serde"]
-logging=["dep:log"]
+log=["dep:log"]
diff --git a/crates/types/src/archive.rs b/crates/types/src/archive.rs
index 7d52049..069addf 100644
--- a/crates/types/src/archive.rs
+++ b/crates/types/src/archive.rs
@@ -51,7 +51,6 @@ impl TinyWasmModule {
/// Creates a `TinyWasmModule` from a slice of bytes.
pub fn from_twasm(wasm: &[u8]) -> Result<Self, TwasmError> {
let len = validate_magic(wasm)?;
-
postcard::from_bytes(&wasm[len..]).map_err(TwasmError::InvalidArchive)
}
diff --git a/crates/types/src/lib.rs b/crates/types/src/lib.rs
index c34b705..beaa828 100644
--- a/crates/types/src/lib.rs
+++ b/crates/types/src/lib.rs
@@ -21,12 +21,12 @@ const fn max_page_count(page_size: u64) -> u64 {
}
// log for logging (optional).
-#[cfg(feature = "logging")]
+#[cfg(feature = "log")]
#[allow(clippy::single_component_path_imports, unused_imports)]
use log;
// noop fallback if logging is disabled.
-#[cfg(not(feature = "logging"))]
+#[cfg(not(feature = "log"))]
#[allow(unused_imports, unused_macros)]
pub(crate) mod log {
macro_rules! debug ( ($($tt:tt)*) => {{}} );