wasker 0.2.2

Wasm compiler for running Wasm on your favorite kernel
Documentation
;; Test `return` operator
(module
  (type (;0;) (func (param i32 i32 i32 i32) (result i32)))

  ;; Import fd_write function
  (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (type 0)))

  ;; Define a single page memory of 64KB.
  (memory $0 1)

  ;; Store the Hello World (null terminated) string at byte offset 0
  (data (i32.const 16) "Test Passed\n")
  (data (i32.const 32) "#Test Failed\n")

  ;; Debug function
  (func $printSuccess
    (call $fd_write
            (i32.const 1) ;; file_descriptor - 1 for stdout
            (i32.const 0) ;; *iovs - The pointer to the iov array, which is stored at memory location 0
            (i32.const 1) ;; iovs_len - We're printing 1 string stored in an iov - so one.
            (i32.const 128) ;; nwritten - A place in memory to store the number of bytes written
    )
  )

  (func $printFail
    (call $fd_write
            (i32.const 1) ;; file_descriptor - 1 for stdout
            (i32.const 8) ;; *iovs - The pointer to the iov array, which is stored at memory location 0
            (i32.const 1) ;; iovs_len - We're printing 1 string stored in an iov - so one.
            (i32.const 128) ;; nwritten - A place in memory to store the number of bytes written
    )
  )

  (func $assert_test_i32 (param $expected i32) (param $result i32)
    local.get $expected
    local.get $result
    i32.eq
    (if
      (then
        (call $printSuccess)
      )
      (else
        (call $printFail)
      )
    )
  )

  (func $assert_test_i64 (param $expected i64) (param $result i64)
    local.get $expected
    local.get $result
    i64.eq
    (if
      (then
        (call $printSuccess)
      )
      (else
        (call $printFail)
      )
    )
  )

  ;; TODO
  ;; untested functions
  ;; type-f32-value
  ;; type-f64-value
  ;; nullary
  ;; unary
  ;; as-block-first
  ;; as-block-mid
  ;; as-block-last
  ;; as-br_if-cond
  ;; as-br_table-index
  ;; as-br_table-value
  ;; as-br_table-value-index

  (func $dummy)
  (func $type-i32-value (result i32)
    (block (result i32) (i32.ctz (return (i32.const 1))))
  )
  (func $type-i64-value (result i64)
    (block (result i64) (i64.ctz (return (i64.const 2))))
  )

  (func $as-func-first (result i32)
    (return (i32.const 1)) (i32.const 2)
  )
  (func $as-func-mid (result i32)
    (call $dummy) (return (i32.const 2)) (i32.const 3)
  )
  (func $as-func-value (result i32)
    (nop) (call $dummy) (return (i32.const 3))
  )
  (func $as-block-value (result i32)
    (block (result i32) (nop) (call $dummy) (return (i32.const 2)))
  )
  (func $as-loop-first (result i32)
    (loop (result i32) (return (i32.const 3)) (i32.const 2))
  )
  (func $as-loop-mid (result i32)
    (loop (result i32) (call $dummy) (return (i32.const 4)) (i32.const 2))
  )
  (func $as-loop-last (result i32)
    (loop (result i32) (nop) (call $dummy) (return (i32.const 5)))
  )
  (func $as-br-value (result i32)
    (block (result i32) (br 0 (return (i32.const 9))))
  )
  (func $as-br-if-value (result i32)
    (block (result i32)
      (drop (br_if 0 (return (i32.const 8)) (i32.const 1))) (i32.const 7)
    )
  )
  (func $as-br-if-value-cond (result i32)
    (block (result i32)
      (drop (br_if 0 (i32.const 6) (return (i32.const 9)))) (i32.const 7)
    )
  )
  (func $as-br_table-value (result i32)
    (block (result i32)
      (br_table 0 0 0 (return (i32.const 10)) (i32.const 1)) (i32.const 7)
    )
  )
  (func $as-br_table-value-index (result i32)
    (block (result i32)
      (br_table 0 0 (i32.const 6) (return (i32.const 11))) (i32.const 7)
    )
  )
  (func $as-return-value (result i64)
    (return (return (i64.const 7)))
  )

  (func $as-if-cond (result i32)
    (if (result i32)
      (return (i32.const 2)) (then (i32.const 0)) (else (i32.const 1))
    )
  )
  (func $as-if-then (param i32 i32) (result i32)
    (if (result i32)
      (local.get 0) (then (return (i32.const 3))) (else (local.get 1))
    )
  )
  (func $as-if-else (param i32 i32) (result i32)
    (if (result i32)
      (local.get 0) (then (local.get 1)) (else (return (i32.const 4)))
    )
  )
  (func $as-select-first (param i32 i32) (result i32)
    (select (return (i32.const 5)) (local.get 0) (local.get 1))
  )
  (func $as-select-second (param i32 i32) (result i32)
    (select (local.get 0) (return (i32.const 6)) (local.get 1))
  )
  (func $as-select-cond (result i32)
    (select (i32.const 0) (i32.const 1) (return (i32.const 7)))
  )

  (func $f (param i32 i32 i32) (result i32) (i32.const -1))
  (func $as-call-first (result i32)
    (call $f (return (i32.const 12)) (i32.const 2) (i32.const 3))
  )
  (func $as-call-mid (result i32)
    (call $f (i32.const 1) (return (i32.const 13)) (i32.const 3))
  )
  (func $as-call-last (result i32)
    (call $f (i32.const 1) (i32.const 2) (return (i32.const 14)))
  )
  (func $as-br_table-index (result i64)
    (block (br_table 0 0 0 (return (i64.const 9)))) (i64.const -1)
  )
  (global $a (mut i32) (i32.const 0))
  (func $as-global.set-value (result i32)
    (global.set $a (return (i32.const 1)))
  )

  (func (export "_start")
    ;; iov.iov_base and iov.iov_len for "success"
    (i32.store (i32.const 0) (i32.const 16)) 
    (i32.store (i32.const 4) (i32.const 12))
    ;; iov.iov_base and iov.iov_len for "success"
    (i32.store (i32.const 8) (i32.const 32)) 
    (i32.store (i32.const 12) (i32.const 13))
    (call $assert_test_i32 (call $type-i32-value) (i32.const 1))
    (call $assert_test_i64 (call $type-i64-value) (i64.const 2))
    (call $assert_test_i32 (call $as-func-first) (i32.const 1))
    (call $assert_test_i32 (call $as-func-mid) (i32.const 2))
    (call $assert_test_i32 (call $as-func-value) (i32.const 3))
    (call $assert_test_i32 (call $as-loop-first) (i32.const 3))
    (call $assert_test_i32 (call $as-loop-mid) (i32.const 4))
    (call $assert_test_i32 (call $as-loop-last) (i32.const 5))
    (call $assert_test_i32 (call $as-br-value) (i32.const 9))
    (call $assert_test_i32 (call $as-br-if-value) (i32.const 8))
    (call $assert_test_i32 (call $as-br-if-value-cond) (i32.const 9))
    (call $assert_test_i32 (call $as-br_table-value) (i32.const 10))
    (call $assert_test_i32 (call $as-br_table-value-index) (i32.const 11))
    (call $assert_test_i64 (call $as-return-value) (i64.const 7))
    (call $assert_test_i32 (call $as-if-cond) (i32.const 2))
    (call $assert_test_i32 (call $as-if-then (i32.const 1) (i32.const 6)) (i32.const 3))
    (call $assert_test_i32 (call $as-if-then (i32.const 0) (i32.const 6)) (i32.const 6))
    (call $assert_test_i32 (call $as-if-else (i32.const 0) (i32.const 6)) (i32.const 4))
    (call $assert_test_i32 (call $as-if-else (i32.const 1) (i32.const 6)) (i32.const 6))
    (call $assert_test_i32 (call $as-select-first (i32.const 0) (i32.const 6)) (i32.const 5))
    (call $assert_test_i32 (call $as-select-first (i32.const 1) (i32.const 6)) (i32.const 5))
    (call $assert_test_i32 (call $as-select-second (i32.const 0) (i32.const 6)) (i32.const 6))
    (call $assert_test_i32 (call $as-select-second (i32.const 1) (i32.const 6)) (i32.const 6))
    (call $assert_test_i32 (call $as-select-cond) (i32.const 7))
    (call $assert_test_i32 (call $as-call-first) (i32.const 12))
    (call $assert_test_i32 (call $as-call-mid) (i32.const 13))
    (call $assert_test_i32 (call $as-call-last) (i32.const 14))
    (call $assert_test_i64 (call $as-br_table-index) (i64.const 9));; Fail
  )
)