Skip to content

Commit 5de0533

Browse files
chore: remove ref stack
Signed-off-by: Henry <mail@henrygressmann.de>
1 parent e47089b commit 5de0533

12 files changed

Lines changed: 179 additions & 175 deletions

File tree

‎crates/parser/src/conversion.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ pub(crate) fn convert_module_code(
191191
local_counts.c128 += 1;
192192
}
193193
Some(wasmparser::ValType::Ref(_)) => {
194-
local_addr_map.push(local_counts.cref);
195-
local_counts.cref += 1;
194+
local_addr_map.push(local_counts.c32);
195+
local_counts.c32 += 1;
196196
}
197197
None => return Err(crate::ParseError::UnsupportedOperator("Unknown local type".to_string())),
198198
}

‎crates/parser/src/optimize.rs‎

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) {
2121
Instruction::LocalCopy32(a, b) if a == b => instructions[read] = Instruction::Nop,
2222
Instruction::LocalCopy64(a, b) if a == b => instructions[read] = Instruction::Nop,
2323
Instruction::LocalCopy128(a, b) if a == b => instructions[read] = Instruction::Nop,
24-
Instruction::LocalCopyRef(a, b) if a == b => instructions[read] = Instruction::Nop,
2524
Instruction::Call(addr) if addr == self_func_addr => instructions[read] = Instruction::CallSelf,
2625
Instruction::ReturnCall(addr) if addr == self_func_addr => instructions[read] = Instruction::ReturnCallSelf,
2726
Instruction::I32Add => {
@@ -154,16 +153,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) {
154153
instructions[read] = Instruction::Nop;
155154
}
156155
}
157-
Instruction::LocalGetRef(dst) => {
158-
if read > 0
159-
&& let Instruction::LocalSetRef(src) = instructions[read - 1]
160-
&& src == dst
161-
{
162-
instructions[read - 1] = Instruction::LocalTeeRef(src);
163-
instructions[read] = Instruction::Nop;
164-
}
165-
}
166-
167156
Instruction::LocalSet32(dst) => {
168157
if read > 0 {
169158
match instructions[read - 1] {
@@ -243,16 +232,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) {
243232
if src == dst { Instruction::Nop } else { Instruction::LocalCopy128(src, dst) };
244233
}
245234
}
246-
Instruction::LocalSetRef(dst) => {
247-
if read > 0
248-
&& let Instruction::LocalGetRef(src) = instructions[read - 1]
249-
{
250-
instructions[read - 1] = Instruction::Nop;
251-
instructions[read] =
252-
if src == dst { Instruction::Nop } else { Instruction::LocalCopyRef(src, dst) };
253-
}
254-
}
255-
256235
Instruction::LocalTee32(dst) => {
257236
if read > 0
258237
&& let Instruction::LocalGet32(src) = instructions[read - 1]
@@ -289,15 +268,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) {
289268
instructions[read] = Instruction::Nop;
290269
}
291270
}
292-
Instruction::LocalTeeRef(dst) => {
293-
if read > 0
294-
&& let Instruction::LocalGetRef(src) = instructions[read - 1]
295-
&& src == dst
296-
{
297-
instructions[read] = Instruction::Nop;
298-
}
299-
}
300-
301271
Instruction::Drop32 => {
302272
if read > 0
303273
&& let Instruction::LocalTee32(local) = instructions[read - 1]
@@ -322,14 +292,6 @@ fn rewrite(instructions: &mut [Instruction], self_func_addr: u32) {
322292
instructions[read] = Instruction::Nop;
323293
}
324294
}
325-
Instruction::DropRef => {
326-
if read > 0
327-
&& let Instruction::LocalTeeRef(local) = instructions[read - 1]
328-
{
329-
instructions[read - 1] = Instruction::LocalSetRef(local);
330-
instructions[read] = Instruction::Nop;
331-
}
332-
}
333295
_ => {}
334296
}
335297
}

‎crates/parser/src/visit.rs‎

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ struct StackBase {
2222
s32: u16,
2323
s64: u16,
2424
s128: u16,
25-
sref: u16,
2625
}
2726

2827
struct LoweringCtx {
@@ -214,7 +213,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
214213
wasmparser::ValType::I64 => Instruction::GlobalSet64(global_index),
215214
wasmparser::ValType::F64 => Instruction::GlobalSet64(global_index),
216215
wasmparser::ValType::V128 => Instruction::GlobalSet128(global_index),
217-
wasmparser::ValType::Ref(_) => Instruction::GlobalSetRef(global_index),
216+
wasmparser::ValType::Ref(_) => Instruction::GlobalSet32(global_index),
218217
})
219218
}
220219
}
@@ -227,7 +226,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
227226
wasmparser::ValType::I64 => Instruction::Drop64,
228227
wasmparser::ValType::F64 => Instruction::Drop64,
229228
wasmparser::ValType::V128 => Instruction::Drop128,
230-
wasmparser::ValType::Ref(_) => Instruction::DropRef,
229+
wasmparser::ValType::Ref(_) => Instruction::Drop32,
231230
})
232231
}
233232
}
@@ -257,7 +256,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
257256
self.instructions.push(Instruction::LocalGet128(resolved_idx));
258257
}
259258
wasmparser::ValType::Ref(_) => {
260-
self.instructions.push(Instruction::LocalGetRef(resolved_idx));
259+
self.instructions.push(Instruction::LocalGet32(resolved_idx));
261260
}
262261
}
263262
}
@@ -272,7 +271,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
272271
wasmparser::ValType::I64 => Instruction::LocalSet64(resolved_idx),
273272
wasmparser::ValType::F64 => Instruction::LocalSet64(resolved_idx),
274273
wasmparser::ValType::V128 => Instruction::LocalSet128(resolved_idx),
275-
wasmparser::ValType::Ref(_) => Instruction::LocalSetRef(resolved_idx),
274+
wasmparser::ValType::Ref(_) => Instruction::LocalSet32(resolved_idx),
276275
})
277276
}
278277
}
@@ -286,7 +285,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
286285
wasmparser::ValType::I64 => Instruction::LocalTee64(resolved_idx),
287286
wasmparser::ValType::F64 => Instruction::LocalTee64(resolved_idx),
288287
wasmparser::ValType::V128 => Instruction::LocalTee128(resolved_idx),
289-
wasmparser::ValType::Ref(_) => Instruction::LocalTeeRef(resolved_idx),
288+
wasmparser::ValType::Ref(_) => Instruction::LocalTee32(resolved_idx),
290289
})
291290
}
292291
}
@@ -457,8 +456,8 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
457456
}
458457

459458
fn visit_typed_select_multi(&mut self, tys: Vec<wasmparser::ValType>) -> Self::Output {
460-
let (c32, c64, c128, cref) = Self::label_keep_counts(&tys);
461-
self.instructions.push(Instruction::SelectMulti(tinywasm_types::ValueCounts { c32, c64, c128, cref }));
459+
let (c32, c64, c128) = Self::label_keep_counts(&tys);
460+
self.instructions.push(Instruction::SelectMulti(tinywasm_types::ValueCounts { c32, c64, c128 }));
462461
}
463462

464463
fn visit_typed_select(&mut self, ty: wasmparser::ValType) -> Self::Output {
@@ -468,7 +467,7 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
468467
wasmparser::ValType::I64 => Instruction::Select64,
469468
wasmparser::ValType::F64 => Instruction::Select64,
470469
wasmparser::ValType::V128 => Instruction::Select128,
471-
wasmparser::ValType::Ref(_) => Instruction::SelectRef,
470+
wasmparser::ValType::Ref(_) => Instruction::Select32,
472471
});
473472
}
474473

@@ -595,7 +594,7 @@ impl<R: WasmModuleResources> FunctionBuilder<R> {
595594
wasmparser::ValType::I32 | wasmparser::ValType::F32 => base.s32 += 1,
596595
wasmparser::ValType::I64 | wasmparser::ValType::F64 => base.s64 += 1,
597596
wasmparser::ValType::V128 => base.s128 += 1,
598-
wasmparser::ValType::Ref(_) => base.sref += 1,
597+
wasmparser::ValType::Ref(_) => base.s32 += 1,
599598
}
600599
}
601600
}
@@ -617,16 +616,8 @@ impl<R: WasmModuleResources> FunctionBuilder<R> {
617616
Some(idx)
618617
}
619618

620-
fn emit_dropkeep(&mut self, base: StackBase, c32: u16, c64: u16, c128: u16, cref: u16) {
621-
if base.s32 == 0
622-
&& c32 == 0
623-
&& base.s64 == 0
624-
&& c64 == 0
625-
&& base.s128 == 0
626-
&& c128 == 0
627-
&& base.sref == 0
628-
&& cref == 0
629-
{
619+
fn emit_dropkeep(&mut self, base: StackBase, c32: u16, c64: u16, c128: u16) {
620+
if base.s32 == 0 && c32 == 0 && base.s64 == 0 && c64 == 0 && base.s128 == 0 && c128 == 0 {
630621
return;
631622
}
632623

@@ -635,26 +626,21 @@ impl<R: WasmModuleResources> FunctionBuilder<R> {
635626
&& base.s64 <= u8::MAX as u16
636627
&& c64 <= u8::MAX as u16
637628
&& base.s128 <= u8::MAX as u16
638-
&& c128 <= u8::MAX as u16
639-
&& base.sref <= u8::MAX as u16
640-
&& cref <= u8::MAX as u16;
629+
&& c128 <= u8::MAX as u16;
641630

642631
if fits_u8 {
643-
self.instructions.push(Instruction::DropKeepSmall {
644-
base32: base.s32 as u8,
632+
self.instructions.push(Instruction::DropKeep {
633+
base32: base.s32,
645634
keep32: c32 as u8,
646-
base64: base.s64 as u8,
635+
base64: base.s64,
647636
keep64: c64 as u8,
648-
base128: base.s128 as u8,
637+
base128: base.s128,
649638
keep128: c128 as u8,
650-
base_ref: base.sref as u8,
651-
keep_ref: cref as u8,
652639
});
653640
} else {
654641
self.instructions.push(Instruction::DropKeep32(base.s32, c32));
655642
self.instructions.push(Instruction::DropKeep64(base.s64, c64));
656643
self.instructions.push(Instruction::DropKeep128(base.s128, c128));
657-
self.instructions.push(Instruction::DropKeepRef(base.sref, cref));
658644
}
659645
}
660646

@@ -673,18 +659,18 @@ impl<R: WasmModuleResources> FunctionBuilder<R> {
673659
}
674660
}
675661

676-
fn label_keep_counts(label_types: &[wasmparser::ValType]) -> (u16, u16, u16, u16) {
677-
let (mut c32, mut c64, mut c128, mut cref) = (0, 0, 0, 0);
662+
fn label_keep_counts(label_types: &[wasmparser::ValType]) -> (u16, u16, u16) {
663+
let (mut c32, mut c64, mut c128) = (0, 0, 0);
678664
for ty in label_types {
679665
match ty {
680666
wasmparser::ValType::I32 | wasmparser::ValType::F32 => c32 += 1,
681667
wasmparser::ValType::I64 | wasmparser::ValType::F64 => c64 += 1,
682668
wasmparser::ValType::V128 => c128 += 1,
683-
wasmparser::ValType::Ref(_) => cref += 1,
669+
wasmparser::ValType::Ref(_) => c32 += 1,
684670
}
685671
}
686672

687-
(c32, c64, c128, cref)
673+
(c32, c64, c128)
688674
}
689675

690676
fn emit_dropkeep_to_label(&mut self, label_depth: u32) {
@@ -698,9 +684,9 @@ impl<R: WasmModuleResources> FunctionBuilder<R> {
698684

699685
let base = self.stack_base_at_frame(label_depth as usize);
700686
let label_types: Vec<_> = self.label_types_for_frame(frame);
701-
let (c32, c64, c128, cref) = Self::label_keep_counts(&label_types);
687+
let (c32, c64, c128) = Self::label_keep_counts(&label_types);
702688

703-
self.emit_dropkeep(base, c32, c64, c128, cref);
689+
self.emit_dropkeep(base, c32, c64, c128);
704690
}
705691

706692
fn label_types_for_frame(&self, frame: &wasmparser::Frame) -> Vec<wasmparser::ValType> {
@@ -746,8 +732,8 @@ impl<R: WasmModuleResources> FunctionBuilder<R> {
746732

747733
let base = self.stack_base_at_frame(depth as usize);
748734
let label_types: Vec<_> = self.label_types_for_frame(frame);
749-
let (c32, c64, c128, cref) = Self::label_keep_counts(&label_types);
750-
self.emit_dropkeep(base, c32, c64, c128, cref);
735+
let (c32, c64, c128) = Self::label_keep_counts(&label_types);
736+
self.emit_dropkeep(base, c32, c64, c128);
751737

752738
let jump_ip = self.instructions.len();
753739
self.instructions.push(Instruction::Jump(0));

‎crates/tinywasm/src/engine.rs‎

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,15 @@ pub enum FuelPolicy {
3939
Weighted,
4040
}
4141

42-
/// Default size for the 32-bit value stack (i32, f32 values).
43-
pub const DEFAULT_VALUE_STACK_32_SIZE: usize = 32 * 1024; // 32k slots
42+
/// Default size for the 32-bit value stack (i32, f32, ref values).
43+
pub const DEFAULT_VALUE_STACK_32_SIZE: usize = 36 * 1024; // 36k slots
4444

4545
/// Default size for the 64-bit value stack (i64, f64 values).
4646
pub const DEFAULT_VALUE_STACK_64_SIZE: usize = 32 * 1024; // 32k slots
4747

4848
/// Default size for the 128-bit value stack (v128 values).
4949
pub const DEFAULT_VALUE_STACK_128_SIZE: usize = 4 * 1024; // 4k slots
5050

51-
/// Default size for the reference value stack (funcref, externref values).
52-
pub const DEFAULT_VALUE_STACK_REF_SIZE: usize = 4 * 1024; // 4k slots
53-
5451
/// Default maximum size for the call stack (function frames).
5552
pub const DEFAULT_MAX_CALL_STACK_SIZE: usize = 1024; // 1024 frames
5653

@@ -59,14 +56,12 @@ pub const DEFAULT_MAX_CALL_STACK_SIZE: usize = 1024; // 1024 frames
5956
#[cfg_attr(feature = "debug", derive(Debug))]
6057
#[non_exhaustive]
6158
pub struct Config {
62-
/// Size of the 32-bit value stack (i32, f32 values).
59+
/// Size of the 32-bit value stack (i32, f32, ref values).
6360
pub stack_32_size: usize,
6461
/// Size of the 64-bit value stack (i64, f64 values).
6562
pub stack_64_size: usize,
6663
/// Size of the 128-bit value stack (v128 values).
6764
pub stack_128_size: usize,
68-
/// Size of the reference value stack (funcref, externref values).
69-
pub stack_ref_size: usize,
7065
/// Maximum size of the call stack
7166
pub max_call_stack_size: usize,
7267
/// Fuel accounting policy used by budgeted execution.
@@ -92,7 +87,6 @@ impl Default for Config {
9287
stack_32_size: DEFAULT_VALUE_STACK_32_SIZE,
9388
stack_64_size: DEFAULT_VALUE_STACK_64_SIZE,
9489
stack_128_size: DEFAULT_VALUE_STACK_128_SIZE,
95-
stack_ref_size: DEFAULT_VALUE_STACK_REF_SIZE,
9690
max_call_stack_size: DEFAULT_MAX_CALL_STACK_SIZE,
9791
fuel_policy: FuelPolicy::default(),
9892
}

0 commit comments

Comments
 (0)