An improvement upon https://github.com/ICME-Lab/zkEngine_dev/blob/main/wasm/nebula/kth_factor.wat
| Upstream | This version | |
|---|---|---|
| Wasm memory size | 1.06 MiB | 64 KiB |
| Wasm bytes | 16001 | 459 |
| WAT lines | 7226 | 81 |
An improvement upon https://github.com/ICME-Lab/zkEngine_dev/blob/main/wasm/nebula/kth_factor.wat
| Upstream | This version | |
|---|---|---|
| Wasm memory size | 1.06 MiB | 64 KiB |
| Wasm bytes | 16001 | 459 |
| WAT lines | 7226 | 81 |
| rustc -C opt-level=3 -C link-arg=-zstack-size=2048 -C panic=abort --target wasm32-unknown-unknown kth_factor.rs |
| #![no_std] | |
| #![no_main] | |
| #[panic_handler] | |
| fn panic_handler(_: &core::panic::PanicInfo) -> ! { | |
| loop {} | |
| } | |
| #[no_mangle] | |
| pub extern "C" fn kth_factor(n: u32, k: usize) -> u32 { | |
| let mut count = 0; | |
| for i in 1..=n { | |
| if n % i == 0 { | |
| count += 1; | |
| if count == k { | |
| return i; | |
| } | |
| } | |
| } | |
| 0xffffffff | |
| } |
| (module $my_kth_factor.wasm | |
| (type $0 (func (param i32 i32) (result i32))) | |
| (global $__stack_pointer (mut i32) (i32.const 2048)) | |
| (global $global$1 i32 (i32.const 2048)) | |
| (global $global$2 i32 (i32.const 2048)) | |
| (memory $0 1) | |
| (export "memory" (memory $0)) | |
| (export "kth_factor" (func $kth_factor)) | |
| (export "__data_end" (global $global$1)) | |
| (export "__heap_base" (global $global$2)) | |
| (func $kth_factor (param $0 i32) (param $1 i32) (result i32) | |
| (local $2 i32) | |
| (local $3 i32) | |
| (local $4 i32) | |
| (local.set $2 | |
| (i32.const -1) | |
| ) | |
| (block $block | |
| (br_if $block | |
| (i32.eqz | |
| (local.get $0) | |
| ) | |
| ) | |
| (local.set $3 | |
| (i32.const 0) | |
| ) | |
| (local.set $4 | |
| (i32.const 1) | |
| ) | |
| (loop $label | |
| (block $block1 | |
| (br_if $block1 | |
| (i32.rem_u | |
| (local.get $0) | |
| (local.get $4) | |
| ) | |
| ) | |
| (br_if $block1 | |
| (i32.ne | |
| (local.tee $3 | |
| (i32.add | |
| (local.get $3) | |
| (i32.const 1) | |
| ) | |
| ) | |
| (local.get $1) | |
| ) | |
| ) | |
| (local.set $2 | |
| (local.get $4) | |
| ) | |
| (br $block) | |
| ) | |
| (br_if $block | |
| (i32.ge_u | |
| (local.get $4) | |
| (local.get $0) | |
| ) | |
| ) | |
| (br_if $label | |
| (i32.le_u | |
| (local.tee $4 | |
| (i32.add | |
| (local.get $4) | |
| (i32.lt_u | |
| (local.get $4) | |
| (local.get $0) | |
| ) | |
| ) | |
| ) | |
| (local.get $0) | |
| ) | |
| ) | |
| ) | |
| ) | |
| (local.get $2) | |
| ) | |
| ;; custom section "producers", size 51 | |
| ;; features section: mutable-globals, nontrapping-float-to-int, bulk-memory, sign-ext, reference-types, multivalue, bulk-memory-opt | |
| ) |