use wasm_encoder::{Function, Instruction, ValType};
use super::{IO_IOVEC, IO_NWRITTEN, RuntimeFuncIndices};
pub(super) fn emit_fd_write_buf(rt: &RuntimeFuncIndices) -> Function {
let mut f = Function::new(vec![]);
match rt.adapter {
super::super::WasmAdapter::Aver => {
f.instruction(&Instruction::LocalGet(0)); f.instruction(&Instruction::LocalGet(1)); f.instruction(&Instruction::Call(rt.fd_write_import));
f.instruction(&Instruction::End);
}
super::super::WasmAdapter::Wasi => {
f.instruction(&Instruction::I32Const(IO_IOVEC as i32));
f.instruction(&Instruction::LocalGet(0));
f.instruction(&Instruction::I32Store(wasm_encoder::MemArg {
offset: 0,
align: 2,
memory_index: 0,
}));
f.instruction(&Instruction::I32Const(IO_IOVEC as i32));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::I32Store(wasm_encoder::MemArg {
offset: 4,
align: 2,
memory_index: 0,
}));
f.instruction(&Instruction::I32Const(1)); f.instruction(&Instruction::I32Const(IO_IOVEC as i32));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Const(IO_NWRITTEN as i32));
f.instruction(&Instruction::Call(rt.fd_write_import));
f.instruction(&Instruction::Drop);
f.instruction(&Instruction::End);
}
}
f
}
pub(super) fn emit_int_to_str() -> Function {
let mut f = Function::new(vec![
(1, ValType::I64),
(1, ValType::I32),
(1, ValType::I32),
]);
f.instruction(&Instruction::LocalGet(0));
f.instruction(&Instruction::LocalSet(2));
f.instruction(&Instruction::LocalGet(2));
f.instruction(&Instruction::I64Eqz);
f.instruction(&Instruction::If(wasm_encoder::BlockType::Result(
ValType::I32,
)));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::I32Const(b'0' as i32));
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::Else);
f.instruction(&Instruction::LocalGet(2));
f.instruction(&Instruction::I64Const(0));
f.instruction(&Instruction::I64LtS);
f.instruction(&Instruction::LocalSet(3));
f.instruction(&Instruction::LocalGet(3));
f.instruction(&Instruction::If(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::I64Const(0));
f.instruction(&Instruction::LocalGet(2));
f.instruction(&Instruction::I64Sub);
f.instruction(&Instruction::LocalSet(2));
f.instruction(&Instruction::End);
f.instruction(&Instruction::I32Const(21));
f.instruction(&Instruction::LocalSet(4));
f.instruction(&Instruction::Block(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(2));
f.instruction(&Instruction::I64Eqz);
f.instruction(&Instruction::BrIf(1));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(4));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::LocalGet(2));
f.instruction(&Instruction::I64Const(10));
f.instruction(&Instruction::I64RemU);
f.instruction(&Instruction::I32WrapI64);
f.instruction(&Instruction::I32Const(b'0' as i32));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::LocalGet(2));
f.instruction(&Instruction::I64Const(10));
f.instruction(&Instruction::I64DivU);
f.instruction(&Instruction::LocalSet(2));
f.instruction(&Instruction::Br(0));
f.instruction(&Instruction::End); f.instruction(&Instruction::End); f.instruction(&Instruction::LocalGet(3));
f.instruction(&Instruction::If(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(4));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Const(b'-' as i32));
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::End);
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I32Const(16));
f.instruction(&Instruction::I32Shl);
f.instruction(&Instruction::I32Const(21));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::I32Or);
f.instruction(&Instruction::End); f.instruction(&Instruction::End); f
}
pub(super) fn emit_float_to_str() -> Function {
let mut f = Function::new(vec![
(1, ValType::I32), (1, ValType::F64), (1, ValType::I64), (1, ValType::I32), (1, ValType::I32), (1, ValType::F64), (1, ValType::I32), (1, ValType::I64), (1, ValType::I64), (1, ValType::I32), (1, ValType::I32), ]);
f.instruction(&Instruction::LocalGet(0));
f.instruction(&Instruction::F64Const(0.0));
f.instruction(&Instruction::F64Lt);
f.instruction(&Instruction::LocalSet(2));
f.instruction(&Instruction::LocalGet(0));
f.instruction(&Instruction::F64Abs);
f.instruction(&Instruction::LocalSet(3));
f.instruction(&Instruction::LocalGet(3));
f.instruction(&Instruction::F64Floor);
f.instruction(&Instruction::I64TruncF64S);
f.instruction(&Instruction::LocalSet(4));
f.instruction(&Instruction::I32Const(21));
f.instruction(&Instruction::LocalSet(5));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I64Eqz);
f.instruction(&Instruction::If(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(5));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(5));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::LocalGet(5));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Const(b'0' as i32));
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::Else);
f.instruction(&Instruction::Block(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I64Eqz);
f.instruction(&Instruction::BrIf(1));
f.instruction(&Instruction::LocalGet(5));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(5));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::LocalGet(5));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I64Const(10));
f.instruction(&Instruction::I64RemU);
f.instruction(&Instruction::I32WrapI64);
f.instruction(&Instruction::I32Const(b'0' as i32));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::LocalGet(4));
f.instruction(&Instruction::I64Const(10));
f.instruction(&Instruction::I64DivU);
f.instruction(&Instruction::LocalSet(4));
f.instruction(&Instruction::Br(0));
f.instruction(&Instruction::End); f.instruction(&Instruction::End); f.instruction(&Instruction::End);
f.instruction(&Instruction::LocalGet(2));
f.instruction(&Instruction::If(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(5));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(5));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::LocalGet(5));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Const(b'-' as i32));
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::End);
f.instruction(&Instruction::LocalGet(5));
f.instruction(&Instruction::LocalSet(6));
f.instruction(&Instruction::LocalGet(3));
f.instruction(&Instruction::LocalGet(3));
f.instruction(&Instruction::F64Floor);
f.instruction(&Instruction::F64Eq);
f.instruction(&Instruction::If(wasm_encoder::BlockType::Result(
ValType::I32,
)));
f.instruction(&Instruction::LocalGet(6));
f.instruction(&Instruction::I32Const(16));
f.instruction(&Instruction::I32Shl);
f.instruction(&Instruction::I32Const(21));
f.instruction(&Instruction::LocalGet(6));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::I32Or);
f.instruction(&Instruction::Else);
f.instruction(&Instruction::F64Const(1.0));
f.instruction(&Instruction::LocalSet(7));
f.instruction(&Instruction::I32Const(0));
f.instruction(&Instruction::LocalSet(8));
f.instruction(&Instruction::Block(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(8));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::LocalSet(8));
f.instruction(&Instruction::LocalGet(7));
f.instruction(&Instruction::F64Const(10.0));
f.instruction(&Instruction::F64Mul);
f.instruction(&Instruction::LocalSet(7));
f.instruction(&Instruction::LocalGet(3));
f.instruction(&Instruction::LocalGet(7));
f.instruction(&Instruction::F64Mul);
f.instruction(&Instruction::F64Floor);
f.instruction(&Instruction::I64TruncF64S);
f.instruction(&Instruction::LocalSet(9));
f.instruction(&Instruction::LocalGet(9));
f.instruction(&Instruction::F64ConvertI64S);
f.instruction(&Instruction::LocalGet(7));
f.instruction(&Instruction::F64Div);
f.instruction(&Instruction::LocalGet(3));
f.instruction(&Instruction::F64Eq);
f.instruction(&Instruction::BrIf(1)); f.instruction(&Instruction::LocalGet(8));
f.instruction(&Instruction::I32Const(15));
f.instruction(&Instruction::I32GeS);
f.instruction(&Instruction::BrIf(1));
f.instruction(&Instruction::Br(0)); f.instruction(&Instruction::End); f.instruction(&Instruction::End);
f.instruction(&Instruction::LocalGet(9));
f.instruction(&Instruction::LocalGet(7));
f.instruction(&Instruction::I64TruncF64S);
f.instruction(&Instruction::I64RemS);
f.instruction(&Instruction::LocalGet(7));
f.instruction(&Instruction::I64TruncF64S);
f.instruction(&Instruction::I64Add);
f.instruction(&Instruction::LocalGet(7));
f.instruction(&Instruction::I64TruncF64S);
f.instruction(&Instruction::I64RemS);
f.instruction(&Instruction::LocalSet(10));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::I32Const(b'.' as i32));
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 21,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::I32Const(22));
f.instruction(&Instruction::LocalGet(8));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(11));
f.instruction(&Instruction::LocalGet(8));
f.instruction(&Instruction::LocalSet(12));
f.instruction(&Instruction::Block(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(12));
f.instruction(&Instruction::I32Eqz);
f.instruction(&Instruction::BrIf(1));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::LocalGet(11));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::LocalGet(10));
f.instruction(&Instruction::I64Const(10));
f.instruction(&Instruction::I64RemU);
f.instruction(&Instruction::I32WrapI64);
f.instruction(&Instruction::I32Const(b'0' as i32));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Store8(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::LocalGet(10));
f.instruction(&Instruction::I64Const(10));
f.instruction(&Instruction::I64DivU);
f.instruction(&Instruction::LocalSet(10));
f.instruction(&Instruction::LocalGet(11));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(11));
f.instruction(&Instruction::LocalGet(12));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(12));
f.instruction(&Instruction::Br(0));
f.instruction(&Instruction::End); f.instruction(&Instruction::End);
f.instruction(&Instruction::I32Const(22));
f.instruction(&Instruction::LocalGet(8));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::LocalSet(11));
f.instruction(&Instruction::Block(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty));
f.instruction(&Instruction::LocalGet(11));
f.instruction(&Instruction::I32Const(22));
f.instruction(&Instruction::I32LeS);
f.instruction(&Instruction::BrIf(1));
f.instruction(&Instruction::LocalGet(1));
f.instruction(&Instruction::LocalGet(11));
f.instruction(&Instruction::I32Add);
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::I32Load8U(wasm_encoder::MemArg {
offset: 0,
align: 0,
memory_index: 0,
}));
f.instruction(&Instruction::I32Const(b'0' as i32));
f.instruction(&Instruction::I32Ne);
f.instruction(&Instruction::BrIf(1)); f.instruction(&Instruction::LocalGet(11));
f.instruction(&Instruction::I32Const(1));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::LocalSet(11));
f.instruction(&Instruction::Br(0));
f.instruction(&Instruction::End); f.instruction(&Instruction::End);
f.instruction(&Instruction::LocalGet(6));
f.instruction(&Instruction::I32Const(16));
f.instruction(&Instruction::I32Shl);
f.instruction(&Instruction::LocalGet(11));
f.instruction(&Instruction::LocalGet(6));
f.instruction(&Instruction::I32Sub);
f.instruction(&Instruction::I32Or);
f.instruction(&Instruction::End); f.instruction(&Instruction::End); f
}