summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/benchmarks/benches/selfhosted.rs6
-rw-r--r--crates/parser/src/visit.rs35
-rw-r--r--crates/tinywasm/src/runtime/interpreter/mod.rs33
-rw-r--r--crates/tinywasm/src/runtime/stack/value_stack.rs9
4 files changed, 45 insertions, 38 deletions
diff --git a/crates/benchmarks/benches/selfhosted.rs b/crates/benchmarks/benches/selfhosted.rs
index 94dfdce..1396fd1 100644
--- a/crates/benchmarks/benches/selfhosted.rs
+++ b/crates/benchmarks/benches/selfhosted.rs
@@ -61,10 +61,10 @@ fn criterion_benchmark(c: &mut Criterion) {
{
let twasm = util::wasm_to_twasm(TINYWASM);
let mut group = c.benchmark_group("selfhosted");
- group.bench_function("native", |b| b.iter(run_native));
+ // group.bench_function("native", |b| b.iter(run_native));
group.bench_function("tinywasm", |b| b.iter(|| run_tinywasm(&twasm)));
- group.bench_function("wasmi", |b| b.iter(|| run_wasmi(TINYWASM)));
- group.bench_function("wasmer", |b| b.iter(|| run_wasmer(TINYWASM)));
+ // group.bench_function("wasmi", |b| b.iter(|| run_wasmi(TINYWASM)));
+ // group.bench_function("wasmer", |b| b.iter(|| run_wasmer(TINYWASM)));
}
}
diff --git a/crates/parser/src/visit.rs b/crates/parser/src/visit.rs
index 9038567..f994e7e 100644
--- a/crates/parser/src/visit.rs
+++ b/crates/parser/src/visit.rs
@@ -325,10 +325,10 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
fn visit_local_get(&mut self, idx: u32) -> Self::Output {
if let Some(instruction) = self.instructions.last_mut() {
match instruction {
- // Instruction::LocalGet(a) => *instruction = Instruction::LocalGet2(*a, idx),
- // Instruction::LocalGet2(a, b) => *instruction = Instruction::LocalGet3(*a, *b, idx),
- // Instruction::LocalGet3(a, b, c) => *instruction = Instruction::LocalGet4(*a, *b, *c, idx),
- // Instruction::LocalTee(a) => *instruction = Instruction::LocalTeeGet(*a, idx),
+ Instruction::LocalGet(a) => *instruction = Instruction::LocalGet2(*a, idx),
+ Instruction::LocalGet2(a, b) => *instruction = Instruction::LocalGet3(*a, *b, idx),
+ Instruction::LocalGet3(a, b, c) => *instruction = Instruction::LocalGet4(*a, *b, *c, idx),
+ Instruction::LocalTee(a) => *instruction = Instruction::LocalTeeGet(*a, idx),
_ => return self.visit(Instruction::LocalGet(idx)),
};
Ok(())
@@ -338,16 +338,15 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
}
fn visit_local_set(&mut self, idx: u32) -> Self::Output {
- // LocalGetSet
- if let Some(instruction) = self.instructions.last_mut() {
- match instruction {
- // Instruction::LocalGet(a) => *instruction = Instruction::LocalGetSet(*a, idx),
- _ => return self.visit(Instruction::LocalSet(idx)),
- };
- Ok(())
- } else {
- self.visit(Instruction::LocalSet(idx))
+ if self.instructions.len() < 1 {
+ return self.visit(Instruction::I64Rotl);
}
+
+ // LocalGetSet
+ match self.instructions[self.instructions.len() - 1..] {
+ // Instruction::LocalGet(a) => *instruction = Instruction::LocalGetSet(*a, idx),
+ _ => return self.visit(Instruction::LocalSet(idx)),
+ };
}
fn visit_local_tee(&mut self, idx: u32) -> Self::Output {
@@ -360,11 +359,11 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
}
match self.instructions[self.instructions.len() - 2..] {
- // [Instruction::I64Xor, Instruction::I64Const(a)] => {
- // self.instructions.pop();
- // self.instructions.pop();
- // self.visit(Instruction::I64XorConstRotl(a))
- // }
+ [Instruction::I64Xor, Instruction::I64Const(a)] => {
+ self.instructions.pop();
+ self.instructions.pop();
+ self.visit(Instruction::I64XorConstRotl(a))
+ }
_ => self.visit(Instruction::I64Rotl),
}
}
diff --git a/crates/tinywasm/src/runtime/interpreter/mod.rs b/crates/tinywasm/src/runtime/interpreter/mod.rs
index 57e5f34..91d1859 100644
--- a/crates/tinywasm/src/runtime/interpreter/mod.rs
+++ b/crates/tinywasm/src/runtime/interpreter/mod.rs
@@ -680,19 +680,22 @@ fn exec_one(cf: &mut CallFrame, stack: &mut Stack, store: &mut Store, module: &M
// custom instructions
LocalGet2(a, b) => {
- stack.values.push(cf.get_local(a as usize));
- stack.values.push(cf.get_local(b as usize));
+ stack.values.extend_from_slice(&[cf.get_local(a as usize), cf.get_local(b as usize)]);
}
LocalGet3(a, b, c) => {
- stack.values.push(cf.get_local(a as usize));
- stack.values.push(cf.get_local(b as usize));
- stack.values.push(cf.get_local(c as usize));
+ stack.values.extend_from_slice(&[
+ cf.get_local(a as usize),
+ cf.get_local(b as usize),
+ cf.get_local(c as usize),
+ ]);
}
LocalGet4(a, b, c, d) => {
- stack.values.push(cf.get_local(a as usize));
- stack.values.push(cf.get_local(b as usize));
- stack.values.push(cf.get_local(c as usize));
- stack.values.push(cf.get_local(d as usize));
+ stack.values.extend_from_slice(&[
+ cf.get_local(a as usize),
+ cf.get_local(b as usize),
+ cf.get_local(c as usize),
+ cf.get_local(d as usize),
+ ]);
}
LocalTeeGet(a, b) => {
let last =
@@ -701,10 +704,14 @@ fn exec_one(cf: &mut CallFrame, stack: &mut Stack, store: &mut Store, module: &M
stack.values.push(cf.get_local(b as usize));
}
- // LocalTeeGet
- // LocalGetSet
- // I64XorConstRotl
- // I32LocalGetConstAdd
+ // I64Xor + I64Const + I64RotL
+ I64XorConstRotl(rotate_by) => {
+ let val = stack.values.pop_t::<i64>()?;
+ let mask = stack.values.pop_t::<i64>()?;
+ let res = val ^ mask;
+ stack.values.push(res.rotate_left(rotate_by as u32).into());
+ }
+
i => {
cold();
log::error!("unimplemented instruction: {:?}", i);
diff --git a/crates/tinywasm/src/runtime/stack/value_stack.rs b/crates/tinywasm/src/runtime/stack/value_stack.rs
index be5b53b..c6d7918 100644
--- a/crates/tinywasm/src/runtime/stack/value_stack.rs
+++ b/crates/tinywasm/src/runtime/stack/value_stack.rs
@@ -25,14 +25,15 @@ impl ValueStack {
#[inline]
pub(crate) fn extend_from_typed(&mut self, values: &[WasmValue]) {
- if values.is_empty() {
- return;
- }
-
self.stack.extend(values.iter().map(|v| RawWasmValue::from(*v)));
}
#[inline]
+ pub(crate) fn extend_from_slice(&mut self, values: &[RawWasmValue]) {
+ self.stack.extend_from_slice(values);
+ }
+
+ #[inline]
pub(crate) fn len(&self) -> usize {
self.stack.len()
}