(module
;; Import our myprint function
(import "myenv" "print" (func $print (param i64 i32)))
;; Define a single page memory of 64KB.
(memory $0 1)
;; Store the Hello World (null terminated) string at byte offset 0
(data (i32.const 0) "Test Passed\n")
(data (i32.const 16) "#Test Failed\n")
;; Debug function
(func $printd (param $len i32)
i64.const 0
(local.get $len)
(call $print)
)
(func $printSuccess
i64.const 0
i32.const 12
(call $print)
)
(func $printFail
i64.const 16
i32.const 13
(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_f32 (param $expected f32) (param $result f32)
local.get $expected
local.get $result
f32.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)
)
)
)
;; Statement switch
(func $stmt (param $i i32) (result i32)
(local $j i32)
(local.set $j (i32.const 100))
(block $switch
(block $7
(block $default
(block $6
(block $5
(block $4
(block $3
(block $2
(block $1
(block $0
(br_table $0 $1 $2 $3 $4 $5 $6 $7 $default
(local.get $i)
)
) ;; 0
(return (local.get $i))
) ;; 1
(nop)
;; fallthrough
) ;; 2
;; fallthrough
) ;; 3
(local.set $j (i32.sub (i32.const 0) (local.get $i)))
(br $switch)
) ;; 4
(br $switch)
) ;; 5
(local.set $j (i32.const 101))
(br $switch)
) ;; 6
(local.set $j (i32.const 101))
;; fallthrough
) ;; default
(local.set $j (i32.const 102))
) ;; 7
;; fallthrough
)
(return (local.get $j))
)
;; Expression switch
(func $expr (param $i i64) (result i64)
(local $j i64)
(local.set $j (i64.const 100))
(return
(block $switch (result i64)
(block $7
(block $default
(block $4
(block $5
(block $6
(block $3
(block $2
(block $1
(block $0
(br_table $0 $1 $2 $3 $4 $5 $6 $7 $default
(i32.wrap_i64 (local.get $i))
)
) ;; 0
(return (local.get $i))
) ;; 1
(nop)
;; fallthrough
) ;; 2
;; fallthrough
) ;; 3
(br $switch (i64.sub (i64.const 0) (local.get $i)))
) ;; 6
(local.set $j (i64.const 101))
;; fallthrough
) ;; 4
;; fallthrough
) ;; 5
;; fallthrough
) ;; default
(br $switch (local.get $j))
) ;; 7
(i64.const -5)
)
)
)
;; Argument switch
(func $arg (param $i i32) (result i32)
(return
(block $2 (result i32)
(i32.add (i32.const 10)
(block $1 (result i32)
(i32.add (i32.const 100)
(block $0 (result i32)
(i32.add (i32.const 1000)
(block $default (result i32)
(br_table $0 $1 $2 $default
(i32.mul (i32.const 2) (local.get $i))
(i32.and (i32.const 3) (local.get $i))
)
)
)
)
)
)
)
)
)
)
;; Corner cases
(func $corner (result i32)
(block
(br_table 0 (i32.const 0))
)
(i32.const 1)
)
(func (export "_start")
(call $assert_test_i32 (call $stmt (i32.const 0)) (i32.const 0))
(call $assert_test_i32 (call $stmt (i32.const 1)) (i32.const -1))
(call $assert_test_i32 (call $stmt (i32.const 2)) (i32.const -2))
(call $assert_test_i32 (call $stmt (i32.const 3)) (i32.const -3))
(call $assert_test_i32 (call $stmt (i32.const 4)) (i32.const 100))
(call $assert_test_i32 (call $stmt (i32.const 5)) (i32.const 101))
(call $assert_test_i32 (call $stmt (i32.const 6)) (i32.const 102))
(call $assert_test_i32 (call $stmt (i32.const 7)) (i32.const 100))
(call $assert_test_i32 (call $stmt (i32.const -10)) (i32.const 102))
(call $assert_test_i64 (call $expr (i64.const 0)) (i64.const 0))
(call $assert_test_i64 (call $expr (i64.const 1)) (i64.const -1))
(call $assert_test_i64 (call $expr (i64.const 2)) (i64.const -2))
(call $assert_test_i64 (call $expr (i64.const 3)) (i64.const -3))
(call $assert_test_i64 (call $expr (i64.const 6)) (i64.const 101))
(call $assert_test_i64 (call $expr (i64.const 7)) (i64.const -5))
(call $assert_test_i64 (call $expr (i64.const -10)) (i64.const 100))
(call $assert_test_i32 (call $arg (i32.const 0)) (i32.const 110))
(call $assert_test_i32 (call $arg (i32.const 1)) (i32.const 12))
(call $assert_test_i32 (call $arg (i32.const 2)) (i32.const 4))
(call $assert_test_i32 (call $arg (i32.const 3)) (i32.const 1116))
(call $assert_test_i32 (call $arg (i32.const 4)) (i32.const 118))
(call $assert_test_i32 (call $arg (i32.const 5)) (i32.const 20))
(call $assert_test_i32 (call $arg (i32.const 6)) (i32.const 12))
(call $assert_test_i32 (call $arg (i32.const 7)) (i32.const 1124))
(call $assert_test_i32 (call $arg (i32.const 8)) (i32.const 126))
(call $assert_test_i32 (call $corner) (i32.const 1))
)
)