gpt4 book ai didi

docx-wasm - wasm中的br_if怎么理解?

转载 作者:行者123 更新时间:2023-12-05 06:21:13 27 4
gpt4 key购买 nike

br_if 是如何工作的。我已经阅读了文档,但我没有找到任何关于 br_if 的结果值的信息。我用 WebAssembly Studio .我有这段代码,但我不明白为什么会这样。

(func $f (param $a i32) (result i32)
(block (result i32)
(br_if 0 (i32.const 5) (get_local $a))
))

我认为 br_if 仅在条件不为 0 时执行,但此函数始终返回 5,即使参数 a 为 0。我认为 br_if 可选返回值并在 block 后尝试设置值,但未编译。请向我解释它是如何工作的。

(func $f (param $a i32) (result i32)
(block (result i32)
(br_if 0 (i32.const 5) (get_local $a))
)
(i32.const 10))

我还想问一下从 block 或循环中返回值的问题,因为在文档中我没有看到任何关于它的句子。当函数在所有分支中返回值时,我可以从循环或 block 中选择返回值吗?

最佳答案

您的示例使用 folded instructions ,在我现在查看它们之前,我什至不知道这是一回事。让我们把它重写成更通用的语法,然后会变得更清楚:

(func $f (param $a i32) (result i32)
block (result i32)
i32.const 5
local.get $a
br_if 0
end)

您的函数接受一个 i32 并返回一个 i32。函数的整个主体是一个嵌套 block ,“返回”一个 i32 - 即当您跳转到该 block 的末尾时,一个值将保存在堆栈顶部(除了进入此 block 时堆栈上有 0 个条目)。

前 5 个被压入。然后 $a,函数参数,被压入。然后我们有分支。分支做你期望的事情——它从堆栈中消耗$a,如果非零则分支到 block 的末尾。然而,之后的结果在这两种情况之间是无法区分的:如果分支被采用,堆栈中将剩下 5。如果该分支被采用,您将在堆栈中留下 5。

退出 block 后,堆栈上的单个值 (5) 就是返回值。

这是我认为您正在寻找的代码(一种可能的方式):

(func $f (param $a i32) (result i32)
local.get $a
if (result i32)
i32.const 5
else
i32.const 0
end)

编辑:要回答第二部分,WASM 中的每条指令(或指令序列)对堆栈都有静态已知的影响,因此 block 中没有“可选返回”——如果它返回一个值路径,它必须在所有路径中返回该类型的值。这就是为什么编译后的代码根本不倾向于在 block 上返回值,而是使用局部变量的条件设置。

关于docx-wasm - wasm中的br_if怎么理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59954281/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com