Fibonacci
//! fibonacci example.
#![no_std]
// for the panic handler.
#[cfg(not(test))]
extern crate zink;
/// Calculates the nth fibonacci number.
#[no_mangle]
pub extern "C" fn fibonacci(n: usize) -> usize {
recursion(n)
}
/// Calculates the nth fibonacci number using recursion.
#[no_mangle]
pub extern "C" fn recursion(n: usize) -> usize {
if n < 2 {
n
} else {
recursion(n - 1) + recursion(n - 2)
}
}
A recursion example, complex in bytecode
(module
(type (;0;) (func (param i32) (result i32)))
(func (;0;) (type 0) (param i32) (result i32)
local.get 0
call 1)
(func (;1;) (type 0) (param i32) (result i32)
(local i32)
local.get 0
i32.const 2
i32.ge_u
if ;; label = @1
loop ;; label = @2
local.get 0 ;; 1
i32.const 1 ;; 2
i32.sub ;; 1
call 1 ;; 1
local.get 1 ;; 2
i32.add ;; 1
local.set 1 ;; 0
local.get 0 ;; 1
i32.const 2 ;; 2
i32.sub ;; 1
local.tee 0 ;; 1
i32.const 1 ;; 2
i32.gt_u ;; 1
br_if 0 (;@2;) ;; 2 -> 0
end
end
local.get 0
local.get 1
i32.add))
A more complex implementation of locals ( params + local variables) is introduced in this example,
control flow br_if
and loop
are compiled as well.
600035586010565b60005260206000f35b906000816002600190031015603d575b8160019003586010565b8101905081600290038092506001106020575b8181019150509060040156