diff options
Diffstat (limited to 'crates/parser')
| -rw-r--r-- | crates/parser/src/conversion.rs | 4 | ||||
| -rw-r--r-- | crates/parser/src/optimize.rs | 38 | ||||
| -rw-r--r-- | crates/parser/src/visit.rs | 62 |
3 files changed, 26 insertions, 78 deletions
diff --git a/crates/parser/src/conversion.rs b/crates/parser/src/conversion.rs index 19ce975..32f2944 100644 --- a/crates/parser/src/conversion.rs +++ b/crates/parser/src/conversion.rs @@ -191,8 +191,8 @@ pub(crate) fn convert_module_code( local_counts.c128 += 1; } Some(wasmparser::ValType::Ref(_)) => { - local_addr_map.push(local_counts.cref); - local_counts.cref += 1; + local_addr_map.push(local_counts.c32); + local_counts.c32 += 1; } None => return Err(crate::ParseError::UnsupportedOperator("Unknown local type".to_string())), } diff --git a/crates/parser/src/optimize.rs b/crates/parser/src/optimize.rs index 1369d7a..c066c29 100644 --- a/crates/parser/src/optimize.rs +++ b/crates/parser/src/optimize.rs @@ -21,7 +21,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) { Instruction::LocalCopy32(a, b) if a == b => instructions[read] = Instruction::Nop, Instruction::LocalCopy64(a, b) if a == b => instructions[read] = Instruction::Nop, Instruction::LocalCopy128(a, b) if a == b => instructions[read] = Instruction::Nop, - Instruction::LocalCopyRef(a, b) if a == b => instructions[read] = Instruction::Nop, Instruction::Call(addr) if addr == self_func_addr => instructions[read] = Instruction::CallSelf, Instruction::ReturnCall(addr) if addr == self_func_addr => instructions[read] = Instruction::ReturnCallSelf, Instruction::I32Add => { @@ -154,16 +153,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) { instructions[read] = Instruction::Nop; } } - Instruction::LocalGetRef(dst) => { - if read > 0 - && let Instruction::LocalSetRef(src) = instructions[read - 1] - && src == dst - { - instructions[read - 1] = Instruction::LocalTeeRef(src); - instructions[read] = Instruction::Nop; - } - } - Instruction::LocalSet32(dst) => { if read > 0 { match instructions[read - 1] { @@ -243,16 +232,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) { if src == dst { Instruction::Nop } else { Instruction::LocalCopy128(src, dst) }; } } - Instruction::LocalSetRef(dst) => { - if read > 0 - && let Instruction::LocalGetRef(src) = instructions[read - 1] - { - instructions[read - 1] = Instruction::Nop; - instructions[read] = - if src == dst { Instruction::Nop } else { Instruction::LocalCopyRef(src, dst) }; - } - } - Instruction::LocalTee32(dst) => { if read > 0 && let Instruction::LocalGet32(src) = instructions[read - 1] @@ -289,15 +268,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) { instructions[read] = Instruction::Nop; } } - Instruction::LocalTeeRef(dst) => { - if read > 0 - && let Instruction::LocalGetRef(src) = instructions[read - 1] - && src == dst - { - instructions[read] = Instruction::Nop; - } - } - Instruction::Drop32 => { if read > 0 && let Instruction::LocalTee32(local) = instructions[read - 1] @@ -322,14 +292,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) { instructions[read] = Instruction::Nop; } } - Instruction::DropRef => { - if read > 0 - && let Instruction::LocalTeeRef(local) = instructions[read - 1] - { - instructions[read - 1] = Instruction::LocalSetRef(local); - instructions[read] = Instruction::Nop; - } - } _ => {} } } diff --git a/crates/parser/src/visit.rs b/crates/parser/src/visit.rs index 94cb4ea..e6f415b 100644 --- a/crates/parser/src/visit.rs +++ b/crates/parser/src/visit.rs @@ -22,7 +22,6 @@ struct StackBase { s32: u16, s64: u16, s128: u16, - sref: u16, } struct LoweringCtx { @@ -214,7 +213,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild wasmparser::ValType::I64 => Instruction::GlobalSet64(global_index), wasmparser::ValType::F64 => Instruction::GlobalSet64(global_index), wasmparser::ValType::V128 => Instruction::GlobalSet128(global_index), - wasmparser::ValType::Ref(_) => Instruction::GlobalSetRef(global_index), + wasmparser::ValType::Ref(_) => Instruction::GlobalSet32(global_index), }) } } @@ -227,7 +226,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild wasmparser::ValType::I64 => Instruction::Drop64, wasmparser::ValType::F64 => Instruction::Drop64, wasmparser::ValType::V128 => Instruction::Drop128, - wasmparser::ValType::Ref(_) => Instruction::DropRef, + wasmparser::ValType::Ref(_) => Instruction::Drop32, }) } } @@ -257,7 +256,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild self.instructions.push(Instruction::LocalGet128(resolved_idx)); } wasmparser::ValType::Ref(_) => { - self.instructions.push(Instruction::LocalGetRef(resolved_idx)); + self.instructions.push(Instruction::LocalGet32(resolved_idx)); } } } @@ -272,7 +271,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild wasmparser::ValType::I64 => Instruction::LocalSet64(resolved_idx), wasmparser::ValType::F64 => Instruction::LocalSet64(resolved_idx), wasmparser::ValType::V128 => Instruction::LocalSet128(resolved_idx), - wasmparser::ValType::Ref(_) => Instruction::LocalSetRef(resolved_idx), + wasmparser::ValType::Ref(_) => Instruction::LocalSet32(resolved_idx), }) } } @@ -286,7 +285,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild wasmparser::ValType::I64 => Instruction::LocalTee64(resolved_idx), wasmparser::ValType::F64 => Instruction::LocalTee64(resolved_idx), wasmparser::ValType::V128 => Instruction::LocalTee128(resolved_idx), - wasmparser::ValType::Ref(_) => Instruction::LocalTeeRef(resolved_idx), + wasmparser::ValType::Ref(_) => Instruction::LocalTee32(resolved_idx), }) } } @@ -457,8 +456,8 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild } fn visit_typed_select_multi(&mut self, tys: Vec<wasmparser::ValType>) -> Self::Output { - let (c32, c64, c128, cref) = Self::label_keep_counts(&tys); - self.instructions.push(Instruction::SelectMulti(tinywasm_types::ValueCounts { c32, c64, c128, cref })); + let (c32, c64, c128) = Self::label_keep_counts(&tys); + self.instructions.push(Instruction::SelectMulti(tinywasm_types::ValueCounts { c32, c64, c128 })); } fn visit_typed_select(&mut self, ty: wasmparser::ValType) -> Self::Output { @@ -468,7 +467,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild wasmparser::ValType::I64 => Instruction::Select64, wasmparser::ValType::F64 => Instruction::Select64, wasmparser::ValType::V128 => Instruction::Select128, - wasmparser::ValType::Ref(_) => Instruction::SelectRef, + wasmparser::ValType::Ref(_) => Instruction::Select32, }); } @@ -595,7 +594,7 @@ impl<R: WasmModuleResources> FunctionBuilder<R> { wasmparser::ValType::I32 | wasmparser::ValType::F32 => base.s32 += 1, wasmparser::ValType::I64 | wasmparser::ValType::F64 => base.s64 += 1, wasmparser::ValType::V128 => base.s128 += 1, - wasmparser::ValType::Ref(_) => base.sref += 1, + wasmparser::ValType::Ref(_) => base.s32 += 1, } } } @@ -617,16 +616,8 @@ impl<R: WasmModuleResources> FunctionBuilder<R> { Some(idx) } - fn emit_dropkeep(&mut self, base: StackBase, c32: u16, c64: u16, c128: u16, cref: u16) { - if base.s32 == 0 - && c32 == 0 - && base.s64 == 0 - && c64 == 0 - && base.s128 == 0 - && c128 == 0 - && base.sref == 0 - && cref == 0 - { + fn emit_dropkeep(&mut self, base: StackBase, c32: u16, c64: u16, c128: u16) { + if base.s32 == 0 && c32 == 0 && base.s64 == 0 && c64 == 0 && base.s128 == 0 && c128 == 0 { return; } @@ -635,26 +626,21 @@ impl<R: WasmModuleResources> FunctionBuilder<R> { && base.s64 <= u8::MAX as u16 && c64 <= u8::MAX as u16 && base.s128 <= u8::MAX as u16 - && c128 <= u8::MAX as u16 - && base.sref <= u8::MAX as u16 - && cref <= u8::MAX as u16; + && c128 <= u8::MAX as u16; if fits_u8 { - self.instructions.push(Instruction::DropKeepSmall { - base32: base.s32 as u8, + self.instructions.push(Instruction::DropKeep { + base32: base.s32, keep32: c32 as u8, - base64: base.s64 as u8, + base64: base.s64, keep64: c64 as u8, - base128: base.s128 as u8, + base128: base.s128, keep128: c128 as u8, - base_ref: base.sref as u8, - keep_ref: cref as u8, }); } else { self.instructions.push(Instruction::DropKeep32(base.s32, c32)); self.instructions.push(Instruction::DropKeep64(base.s64, c64)); self.instructions.push(Instruction::DropKeep128(base.s128, c128)); - self.instructions.push(Instruction::DropKeepRef(base.sref, cref)); } } @@ -673,18 +659,18 @@ impl<R: WasmModuleResources> FunctionBuilder<R> { } } - fn label_keep_counts(label_types: &[wasmparser::ValType]) -> (u16, u16, u16, u16) { - let (mut c32, mut c64, mut c128, mut cref) = (0, 0, 0, 0); + fn label_keep_counts(label_types: &[wasmparser::ValType]) -> (u16, u16, u16) { + let (mut c32, mut c64, mut c128) = (0, 0, 0); for ty in label_types { match ty { wasmparser::ValType::I32 | wasmparser::ValType::F32 => c32 += 1, wasmparser::ValType::I64 | wasmparser::ValType::F64 => c64 += 1, wasmparser::ValType::V128 => c128 += 1, - wasmparser::ValType::Ref(_) => cref += 1, + wasmparser::ValType::Ref(_) => c32 += 1, } } - (c32, c64, c128, cref) + (c32, c64, c128) } fn emit_dropkeep_to_label(&mut self, label_depth: u32) { @@ -698,9 +684,9 @@ impl<R: WasmModuleResources> FunctionBuilder<R> { let base = self.stack_base_at_frame(label_depth as usize); let label_types: Vec<_> = self.label_types_for_frame(frame); - let (c32, c64, c128, cref) = Self::label_keep_counts(&label_types); + let (c32, c64, c128) = Self::label_keep_counts(&label_types); - self.emit_dropkeep(base, c32, c64, c128, cref); + self.emit_dropkeep(base, c32, c64, c128); } fn label_types_for_frame(&self, frame: &wasmparser::Frame) -> Vec<wasmparser::ValType> { @@ -746,8 +732,8 @@ impl<R: WasmModuleResources> FunctionBuilder<R> { let base = self.stack_base_at_frame(depth as usize); let label_types: Vec<_> = self.label_types_for_frame(frame); - let (c32, c64, c128, cref) = Self::label_keep_counts(&label_types); - self.emit_dropkeep(base, c32, c64, c128, cref); + let (c32, c64, c128) = Self::label_keep_counts(&label_types); + self.emit_dropkeep(base, c32, c64, c128); let jump_ip = self.instructions.len(); self.instructions.push(Instruction::Jump(0)); |
