我目前正在编写一个从前端到后端针对wasm的玩具编译器。我对x86和mips略知一二,但在这一点上,我或多或少可以编写一小部分代码,并阅读其他代码。
我有一个关于标签的澄清问题。在规范中,标签是相对于执行/嵌套点的。这就引出了关于如何使用分支/跳跃的两个问题。
-
循环:
假设我们有一些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) ) ) )
-
跳转表:
如果以上是真的,这对向前跳跃有什么影响?假设我们想要编译一个switch语句,其中主题s针对c案例进行测试。这将如何用wasm表达?我知道每个案例都应该是一个区块,它更多的是标签。
我知道我很可能想得太多了。
-
我相信您只需要
br 2
(br 0
将脱离if,br 1
将脱离循环,br 2
将脱离块(。来自以下文档:标签0指的是包含引用分支指令的最内部结构化控制指令,而递增索引指的是更远的索引。
br_table
指令(可能取决于枚举用例的稀疏程度(