Wasm 规范说明

Wasm specifcation clearification

我目前正在编写一个从前端到后端的玩具编译器,目标是 wasm。我知道一点 x86 和 mips,但或多或​​少我可以编写一小部分代码并阅读其他代码。

我有一个关于 'labels' 的澄清问题。在规范中,标签是相对于execution/nesting点的方式。这让我想到了两个关于如何使用 branching/jumps.

的问题
  1. 循环次数:

    假设我们有一些 while 循环,其中嵌套了 l 个标签,其中 l >= 0。下面的代码是正确的吗? (代码以抽象树表示,不是 wat 的正确格式,不包括块类型,但假设隐式推入和弹出堆栈)

     block(
         loop( 
             // compute condition value
             if(  
                 //  compute the effect of the loop
             )
             else( // if false then break the loop
                br(l + 2) 
             )
         )
     )
    
  2. 跳表:

    如果以上是真的,这对前跳有什么影响? 假设我们要编译一个 switch 语句,其中 subject s 是针对 c 个案例进行测试的。这在 wasm 中如何表达?我知道每个案例应该是一个块,它更多的是标签。

我知道我很可能想多了。

  1. 我相信你只想 br 2br 0 会跳出 if 并且 br 1 会跳出循环并且 br 2 突破障碍)。来自文档 at:

    label 0 refers to the innermost structured control instruction enclosing the referring branch instruction, while increasing indices refer to those farther out.

  1. 我相信您可以为此使用 br_table 指令(可能取决于枚举案例的稀疏程度)。