`select` против` if then else` в wasm - PullRequest
0 голосов
/ 07 июня 2019

В чем разница между if и select в wasm и как лучше всего применять эти команды?

Пример в 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 являются структурированными инструкциями. Они заключают в себе вложенные последовательности инструкций, называемые блоками, оканчивающиеся или разделенные конечными или псевдоинструкциями. Как предписывает грамматика, они должны быть хорошо вложенными. Структурированная инструкция может создавать значение, как описано в аннотированном типе результата.

однако, оператор select может содержать block и выполнять ряд инструкций.

(select (i32.const 3)
        (block (result i32) 
               (i32.const 5) )
        (local.get 0) )

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Выбор берет все три операнда из стека, в то время как только принимает решение из стека и затем условно выполняет один из двух блоков. Этот факт скрыт от того, как в вашем примере пишутся s-выражения. Select помещает выбранное значение обратно в стек, в то время как for, если внутренние блоки могут иметь возвращаемое значение, но также могут быть недействительными.

0 голосов
/ 08 июня 2019

Инструкция select является строгой, то есть она всегда оценивает все свои операнды, в то время как if выполняет только одну из ветвей. Таким образом, select является более эффективным выбором, если операнды просты (например, просто значения), потому что ему не нужно выполнять какое-либо ветвление. Он компилируется непосредственно в одну аппаратную инструкцию.

...