wasker 0.2.2

Wasm compiler for running Wasm on your favorite kernel
Documentation
;; Test `return` operator
(module

  ;; Import our myprint function
  (import "myenv" "print" (func $print (param i64 i32)))

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

  ;; Store strings at byte offset 0
  (data (i32.const 0) "abcdefghijklmnopqrstuvwxyz")
  (data (i32.const 36) "Test Passed\n")
  (data (i32.const 52) "#Test Failed\n")

  ;; Debug function
  (func $printSuccess
    i64.const 36
    i32.const 12
    (call $print)
  )

  (func $printFail
    i64.const 52
    i32.const 16
    (call $print)
  )

  (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)
      )
    )
  )
  (func $i32_align_switch (param i32 i32) (result i32)
    (local i32 i32)
    (local.set 2 (i32.const 10))
    (block $32
      (block $16u
        (block $16s
          (block $8u
            (block $8s
              (block $0
                (br_table $0 $8s $8u $16s $16u $32 (local.get 0))
              ) ;; 0
              (if (i32.eq (local.get 1) (i32.const 0))
                (then
                  (i32.store8 (i32.const 0) (local.get 2))
                  (local.set 3 (i32.load8_s (i32.const 0)))
                )
              )
              (if (i32.eq (local.get 1) (i32.const 1))
                (then
                  (i32.store8 align=1 (i32.const 0) (local.get 2))
                  (local.set 3 (i32.load8_s align=1 (i32.const 0)))
                )
              )
              (br $32)
            ) ;; 8s
            (if (i32.eq (local.get 1) (i32.const 0))
              (then
                (i32.store8 (i32.const 0) (local.get 2))
                (local.set 3 (i32.load8_u (i32.const 0)))
              )
            )
            (if (i32.eq (local.get 1) (i32.const 1))
              (then
                (i32.store8 align=1 (i32.const 0) (local.get 2))
                (local.set 3 (i32.load8_u align=1 (i32.const 0)))
              )
            )
            (br $32)
          ) ;; 8u
          (if (i32.eq (local.get 1) (i32.const 0))
            (then
              (i32.store16 (i32.const 0) (local.get 2))
              (local.set 3 (i32.load16_s (i32.const 0)))
            )
          )
          (if (i32.eq (local.get 1) (i32.const 1))
            (then
              (i32.store16 align=1 (i32.const 0) (local.get 2))
              (local.set 3 (i32.load16_s align=1 (i32.const 0)))
            )
          )
          (if (i32.eq (local.get 1) (i32.const 2))
            (then
              (i32.store16 align=2 (i32.const 0) (local.get 2))
              (local.set 3 (i32.load16_s align=2 (i32.const 0)))
            )
          )
          (br $32)
        ) ;; 16s
        (if (i32.eq (local.get 1) (i32.const 0))
          (then
            (i32.store16 (i32.const 0) (local.get 2))
            (local.set 3 (i32.load16_u (i32.const 0)))
          )
        )
        (if (i32.eq (local.get 1) (i32.const 1))
          (then
            (i32.store16 align=1 (i32.const 0) (local.get 2))
            (local.set 3 (i32.load16_u align=1 (i32.const 0)))
          )
        )
        (if (i32.eq (local.get 1) (i32.const 2))
          (then
            (i32.store16 align=2 (i32.const 0) (local.get 2))
            (local.set 3 (i32.load16_u align=2 (i32.const 0)))
          )
        )
        (br $32)
      ) ;; 16u
      (if (i32.eq (local.get 1) (i32.const 0))
        (then
          (i32.store (i32.const 0) (local.get 2))
          (local.set 3 (i32.load (i32.const 0)))
        )
      )
      (if (i32.eq (local.get 1) (i32.const 1))
        (then
          (i32.store align=1 (i32.const 0) (local.get 2))
          (local.set 3 (i32.load align=1 (i32.const 0)))
        )
      )
      (if (i32.eq (local.get 1) (i32.const 2))
        (then
          (i32.store align=2 (i32.const 0) (local.get 2))
          (local.set 3 (i32.load align=2 (i32.const 0)))
        )
      )
      (if (i32.eq (local.get 1) (i32.const 4))
        (then
          (i32.store align=4 (i32.const 0) (local.get 2))
          (local.set 3 (i32.load align=4 (i32.const 0)))
        )
      )
    ) ;; 32
    (local.get 3)
  )
   (func $i64_align_switch (param i32 i32) (result i64)
    (local i64 i64)
    (local.set 2 (i64.const 10))
    (block $64
      (block $32u
        (block $32s
          (block $16u
            (block $16s
              (block $8u
                (block $8s
                  (block $0
                    (br_table $0 $8s $8u $16s $16u $32s $32u $64 (local.get 0))
                  ) ;; 0
                  (if (i32.eq (local.get 1) (i32.const 0))
                    (then
                      (i64.store8 (i32.const 0) (local.get 2))
                      (local.set 3 (i64.load8_s (i32.const 0)))
                    )
                  )
                  (if (i32.eq (local.get 1) (i32.const 1))
                    (then
                      (i64.store8 align=1 (i32.const 0) (local.get 2))
                      (local.set 3 (i64.load8_s align=1 (i32.const 0)))
                    )
                  )
                  (br $64)
                ) ;; 8s
                (if (i32.eq (local.get 1) (i32.const 0))
                  (then
                    (i64.store8 (i32.const 0) (local.get 2))
                    (local.set 3 (i64.load8_u (i32.const 0)))
                  )
                )
                (if (i32.eq (local.get 1) (i32.const 1))
                  (then
                    (i64.store8 align=1 (i32.const 0) (local.get 2))
                    (local.set 3 (i64.load8_u align=1 (i32.const 0)))
                  )
                )
                (br $64)
              ) ;; 8u
              (if (i32.eq (local.get 1) (i32.const 0))
                (then
                  (i64.store16 (i32.const 0) (local.get 2))
                  (local.set 3 (i64.load16_s (i32.const 0)))
                )
              )
              (if (i32.eq (local.get 1) (i32.const 1))
                (then
                  (i64.store16 align=1 (i32.const 0) (local.get 2))
                  (local.set 3 (i64.load16_s align=1 (i32.const 0)))
                )
              )
              (if (i32.eq (local.get 1) (i32.const 2))
                (then
                  (i64.store16 align=2 (i32.const 0) (local.get 2))
                  (local.set 3 (i64.load16_s align=2 (i32.const 0)))
                )
              )
              (br $64)
            ) ;; 16s
            (if (i32.eq (local.get 1) (i32.const 0))
              (then
                (i64.store16 (i32.const 0) (local.get 2))
                (local.set 3 (i64.load16_u (i32.const 0)))
              )
            )
            (if (i32.eq (local.get 1) (i32.const 1))
              (then
                (i64.store16 align=1 (i32.const 0) (local.get 2))
                (local.set 3 (i64.load16_u align=1 (i32.const 0)))
              )
            )
            (if (i32.eq (local.get 1) (i32.const 2))
              (then
                (i64.store16 align=2 (i32.const 0) (local.get 2))
                (local.set 3 (i64.load16_u align=2 (i32.const 0)))
              )
            )
            (br $64)
          ) ;; 16u
          (if (i32.eq (local.get 1) (i32.const 0))
            (then
              (i64.store32 (i32.const 0) (local.get 2))
              (local.set 3 (i64.load32_s (i32.const 0)))
            )
          )
          (if (i32.eq (local.get 1) (i32.const 1))
            (then
              (i64.store32 align=1 (i32.const 0) (local.get 2))
              (local.set 3 (i64.load32_s align=1 (i32.const 0)))
            )
          )
          (if (i32.eq (local.get 1) (i32.const 2))
            (then
              (i64.store32 align=2 (i32.const 0) (local.get 2))
              (local.set 3 (i64.load32_s align=2 (i32.const 0)))
            )
          )
          (if (i32.eq (local.get 1) (i32.const 4))
            (then
              (i64.store32 align=4 (i32.const 0) (local.get 2))
              (local.set 3 (i64.load32_s align=4 (i32.const 0)))
            )
          )
          (br $64)
        ) ;; 32s
        (if (i32.eq (local.get 1) (i32.const 0))
          (then
            (i64.store32 (i32.const 0) (local.get 2))
            (local.set 3 (i64.load32_u (i32.const 0)))
          )
        )
        (if (i32.eq (local.get 1) (i32.const 1))
          (then
            (i64.store32 align=1 (i32.const 0) (local.get 2))
            (local.set 3 (i64.load32_u align=1 (i32.const 0)))
          )
        )
        (if (i32.eq (local.get 1) (i32.const 2))
          (then
            (i64.store32 align=2 (i32.const 0) (local.get 2))
            (local.set 3 (i64.load32_u align=2 (i32.const 0)))
          )
        )
        (if (i32.eq (local.get 1) (i32.const 4))
          (then
            (i64.store32 align=4 (i32.const 0) (local.get 2))
            (local.set 3 (i64.load32_u align=4 (i32.const 0)))
          )
        )
        (br $64)
      ) ;; 32u
      (if (i32.eq (local.get 1) (i32.const 0))
        (then
          (i64.store (i32.const 0) (local.get 2))
          (local.set 3 (i64.load (i32.const 0)))
        )
      )
      (if (i32.eq (local.get 1) (i32.const 1))
        (then
          (i64.store align=1 (i32.const 0) (local.get 2))
          (local.set 3 (i64.load align=1 (i32.const 0)))
        )
      )
      (if (i32.eq (local.get 1) (i32.const 2))
        (then
          (i64.store align=2 (i32.const 0) (local.get 2))
          (local.set 3 (i64.load align=2 (i32.const 0)))
        )
      )
      (if (i32.eq (local.get 1) (i32.const 4))
        (then
          (i64.store align=4 (i32.const 0) (local.get 2))
          (local.set 3 (i64.load align=4 (i32.const 0)))
        )
      )
      (if (i32.eq (local.get 1) (i32.const 8))
        (then
          (i64.store align=8 (i32.const 0) (local.get 2))
          (local.set 3 (i64.load align=8 (i32.const 0)))
        )
      )
    ) ;; 64
    (local.get 3)
  )
  
  (func (export "_start")
    (call $assert_test_i32 (call $i32_align_switch (i32.const 0) (i32.const 0)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 0) (i32.const 1)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 1) (i32.const 0)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 1) (i32.const 1)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 2) (i32.const 0)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 2) (i32.const 1)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 2) (i32.const 2)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 3) (i32.const 0)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 3) (i32.const 1)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 3) (i32.const 2)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 4) (i32.const 0)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 4) (i32.const 1)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 4) (i32.const 2)) (i32.const 10))
    (call $assert_test_i32 (call $i32_align_switch (i32.const 4) (i32.const 4)) (i32.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 0) (i32.const 0)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 0) (i32.const 1)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 1) (i32.const 0)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 1) (i32.const 1)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 2) (i32.const 0)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 2) (i32.const 1)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 2) (i32.const 2)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 3) (i32.const 0)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 3) (i32.const 1)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 3) (i32.const 2)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 4) (i32.const 0)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 4) (i32.const 1)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 4) (i32.const 2)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 4) (i32.const 4)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 5) (i32.const 0)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 5) (i32.const 1)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 5) (i32.const 2)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 5) (i32.const 4)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 6) (i32.const 0)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 6) (i32.const 1)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 6) (i32.const 2)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 6) (i32.const 4)) (i64.const 10))
    (call $assert_test_i64 (call $i64_align_switch (i32.const 6) (i32.const 8)) (i64.const 10))
  )
)