From 32d2519d2d93d06a049bf01426d9e7d887605f0c Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sat, 6 Nov 2021 18:52:52 +0100 Subject: [PATCH] add simple rust example --- examples/rust/build.sh | 2 ++ examples/rust/readme.txt | 25 +++++++++++++++++++++++++ examples/rust/tunnel.rs | 31 +++++++++++++++++++++++++++++++ examples/rust/tunnel.uw8 | Bin 0 -> 137 bytes uw8-tool/src/pack.rs | 4 ++-- 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100755 examples/rust/build.sh create mode 100644 examples/rust/readme.txt create mode 100644 examples/rust/tunnel.rs create mode 100644 examples/rust/tunnel.uw8 diff --git a/examples/rust/build.sh b/examples/rust/build.sh new file mode 100755 index 0000000..98f511e --- /dev/null +++ b/examples/rust/build.sh @@ -0,0 +1,2 @@ +rustc --target=wasm32-unknown-unknown --crate-type cdylib -C opt-level="z" -C "link-args=--import-memory --initial-memory=262144 -zstack-size=65536" -o tunnel.wasm tunnel.rs && \ +wasm-opt -Oz -o tunnel.wasm tunnel.wasm diff --git a/examples/rust/readme.txt b/examples/rust/readme.txt new file mode 100644 index 0000000..c3ed732 --- /dev/null +++ b/examples/rust/readme.txt @@ -0,0 +1,25 @@ +A small example how to produce somewhat reasonably small MicroW8 +carts in rust. + +A nightly rust compiler is needed for the unstable sqrtf32 +intrinsic. + +Simply compiling with rustc as shown in build.sh results in a +339 byte tunnel.wasm. Using wasm-opt this can be reduced to +244 bytes. + +When you disassemble this wasm file using wasm2wat you can see +these globals and exports: + +(global (;0;) i32 (i32.const 65536)) +(global (;1;) i32 (i32.const 65536)) +(export "__data_end" (global 0)) +(export "__heap_base" (global 1)) + +They are meant to be used for heap allocations and stack for any +values that are not simple scalars (i32, f32, etc.). Since our +code doesn't actually use any of that, we can just delete them +in a text editor and assemble the code again with wat2wasm. + +This gives us a 200 byte wasm file. Running this through +uw8-tool pack brings us to the final size of 137 bytes. \ No newline at end of file diff --git a/examples/rust/tunnel.rs b/examples/rust/tunnel.rs new file mode 100644 index 0000000..a030f4f --- /dev/null +++ b/examples/rust/tunnel.rs @@ -0,0 +1,31 @@ +#![no_std] +#![feature(core_intrinsics)] + +#[link(wasm_import_module = "math")] +extern "C" { + fn atan2(x: f32, y: f32) -> f32; +} + +fn sqrt(v: f32) -> f32 { + unsafe { core::intrinsics::sqrtf32(v) } +} + +#[no_mangle] +pub fn tic(time: i32) { + unsafe { + for i in 0..320 * 256 { + let t = time as f32 / 10 as f32; + let x = (i % 320 - 160) as f32; + let y = (i / 320 - 128) as f32; + let d = 20000 as f32 / sqrt(x * x + y * y + 1 as f32); + let u = atan2(x, y) * 512f32 / 3.141; + let c = ((d + t).to_int_unchecked::() ^ (u + t).to_int_unchecked::()) as u8; + *((120 + i) as *mut u8) = c; + } + } +} + +#[panic_handler] +fn panic(_: &core::panic::PanicInfo) -> ! { + loop {} +} diff --git a/examples/rust/tunnel.uw8 b/examples/rust/tunnel.uw8 new file mode 100644 index 0000000000000000000000000000000000000000..36d523383a61215dc042aadbd7de2f44835d2883 GIT binary patch literal 137 zcmZSNYGq_>Vq|2lRbbfU%)p@FI8~9+kwKAx*+GH9v7v$0odv}B!H}iE2&5m>0f_@l zc|e?#owZ4c3Ce9?%-*ELEWiddfx%^pvnrdX!_-MD6d0Wu9Ok$wFexxiQD9bJo-zq2 a-(Wv!B2cc_3TPRFBV(2#0}mrNH#Y!T93Q#> literal 0 HcmV?d00001 diff --git a/uw8-tool/src/pack.rs b/uw8-tool/src/pack.rs index 269d75d..84bf73e 100644 --- a/uw8-tool/src/pack.rs +++ b/uw8-tool/src/pack.rs @@ -440,10 +440,10 @@ fn remap_function( De::BrTable { .. } => todo!(), De::Return => En::Return, De::Call { function_index } => En::Call( - dbg!(*function_map + *function_map .get(&function_index) .ok_or_else(|| anyhow!("Function index out of range: {}", function_index))?, - )), + ), De::CallIndirect { .. } | De::ReturnCall { .. } | De::ReturnCallIndirect { .. }