Select
select 指令根据其第三个操作数是否为零来选择其前两个操作数中的一个。它与许多其他语言中的三元运算符(例如 false ? 10 : 20)有一些相似之处,但它不会 短路。该指令后面可以跟一个即时值类型:select (result T)。select (result T) 使用不同的二进制操作码,并允许除了 WebAssembly MVP 引入的类型(i32、i64、f32、f64)之外的类型,例如,它允许在两个 externref 值之间进行选择。
试一试
(module
(func (export "select_simple") (result i32)
;; load two values onto the stack
i32.const 10
i32.const 20
;; change to `1` (true) to get the first value (`10`)
i32.const 0
select
)
(func (export "select_externref") (param $value externref) (param $condition i32) (result externref)
;; this is "select t", the explicitly typed variant
ref.null extern
local.get $value
local.get $condition
select (result externref)
)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url)).then((result) => {
const { select_simple, select_externref } = result.instance.exports;
console.log(select_simple());
// Expected output: 20
// If the second parameter is zero, returns the first parameter (which may be an arbitrary JS value)
const map = new Map();
console.log(select_externref(map, 0));
// Expected output: [object Map]
console.log(select_externref(map, -1));
// Expected output: null
});
语法
wat
;; push two values onto the stack
i32.const 10
i32.const 20
;; change to `1` (true) to get the first value (`10`)
i32.const 0
select
f32.const nan f32.const -54.1 ;; change to `1` (true) to get the first value (`nan`) i32.const 0 select (result f32)
| 指令 | 二进制操作码 |
|---|---|
select |
0x1b |
select t |
0x1c |