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 | |
) |