`select` 与 wasm 中的 `if then else`
`select` vs `if then else` in wasm
wasm中的if
和select
有什么区别,这些命令的最佳应用是什么?
wat2wasm中的示例:
WAT代码:
(module
(func (export "Select") (param i32) (result i32)
(select (i32.const 3)
(i32.const 5)
(local.get 0) ))
(func (export "If") (param i32) (result i32)
(if (result i32) (local.get 0)
(then (i32.const 7))
(else (i32.const 11)) )) )
JS代码:
const wasmInstance = new WebAssembly.Instance(wasmModule, {});
const { Select, If } = wasmInstance.exports;
console.log(Select(1)); // => 3
console.log(Select(0)); // => 5
console.log(If(1)); // => 7
console.log(If(0)); // => 11
根据文档:
select
运算符根据其第三个操作数是否为零来选择其前两个操作数之一。
block
、loop
和if
指令是结构化指令。它们将嵌套的指令序列括起来,称为块,以 end 或伪指令终止或分隔。正如语法所规定的,它们必须嵌套良好。结构化指令可以生成注释结果类型所描述的值。
然而,select
运算符可能包含 block
并执行多条指令。
(select (i32.const 3)
(block (result i32)
(i32.const 5) )
(local.get 0) )
select
指令是严格的,即它始终计算其所有操作数,而 if
仅执行其中一个分支。因此,如果操作数很简单(例如,只有值),select
是更有效的选择,因为它不需要执行任何分支。它直接编译为单个硬件指令。
Select 从堆栈中取出所有三个操作数,而 if 仅从堆栈中取出决定,然后有条件地执行两个块之一。 s-expressions 在您的示例中的书写方式隐藏了这一事实。 Select 将所选值放回堆栈,而 for 如果内部块可能具有 return 值,但也可能为空。
wasm中的if
和select
有什么区别,这些命令的最佳应用是什么?
wat2wasm中的示例:
WAT代码:
(module
(func (export "Select") (param i32) (result i32)
(select (i32.const 3)
(i32.const 5)
(local.get 0) ))
(func (export "If") (param i32) (result i32)
(if (result i32) (local.get 0)
(then (i32.const 7))
(else (i32.const 11)) )) )
JS代码:
const wasmInstance = new WebAssembly.Instance(wasmModule, {});
const { Select, If } = wasmInstance.exports;
console.log(Select(1)); // => 3
console.log(Select(0)); // => 5
console.log(If(1)); // => 7
console.log(If(0)); // => 11
根据文档:
select
运算符根据其第三个操作数是否为零来选择其前两个操作数之一。
block
、loop
和if
指令是结构化指令。它们将嵌套的指令序列括起来,称为块,以 end 或伪指令终止或分隔。正如语法所规定的,它们必须嵌套良好。结构化指令可以生成注释结果类型所描述的值。
然而,select
运算符可能包含 block
并执行多条指令。
(select (i32.const 3)
(block (result i32)
(i32.const 5) )
(local.get 0) )
select
指令是严格的,即它始终计算其所有操作数,而 if
仅执行其中一个分支。因此,如果操作数很简单(例如,只有值),select
是更有效的选择,因为它不需要执行任何分支。它直接编译为单个硬件指令。
Select 从堆栈中取出所有三个操作数,而 if 仅从堆栈中取出决定,然后有条件地执行两个块之一。 s-expressions 在您的示例中的书写方式隐藏了这一事实。 Select 将所选值放回堆栈,而 for 如果内部块可能具有 return 值,但也可能为空。