如何在WASM中进行条件返回?

huangapple go评论57阅读模式
英文:

How do I make a conditional return in WASM?

问题

以下是要翻译的内容:

我正在编写一个 WebAssembly 模块。

所以代码如下:

(module
  (func (export "someCheck")
    (param $n f64)
    (result i32)

    local.get $n
    f64.const 2
    f64.eq
  )
)

这是一个简单的模块,返回 $n 是否等于 2 的结果。如果 $n 等于 2,则返回 1,否则返回 0。
这里对我来说一切都很清楚。

以下是用 JavaScript 编写的类似函数:

const someCheck = (n) => Number(n === 2)

但如何实现条件返回呢?

像这样,在 WebAssembly 中:

const someCheck = (n) => {
  if (Number(n === 2))
    return 1;

  // 其他逻辑
  return someRez;
}

谢谢!


注意
我认为有人可能需要这个表格。她对我很有帮助,尤其是关于栈的提示。

英文:

I am writing a wasm module.

So the code is:

(module
  (func (export "someCheck")
    (param $n f64)
    (result i32)

    local.get $n
    f64.const 2
    f64.eq
  )
)

This is a simple module that returns the result of $n being equal to 2. If $n is 2 then return 1, otherwise return 0.
Here everything is clear to me.

Here is a similar function written in JavaScript:

const someCheck = (n) => Number(n === 2)

But how do I make a conditional return?

Like this, but in wasm:

const someCheck = (n) => {
  if (Number(n === 2))
    return 1;

  // other logic
  return someRez;
}

Thanks!


NOTE
I think someone might need this table. She helps me a lot. Especially stack hints

答案1

得分: 2

这可以通过0F操作(return查看表格)来完成。

以下是一个示例,如果传入的参数是2,则返回数字5,否则返回数字10。

(module
  (func (export "func")
  (param $n i32)
  (result i32)

  local.get $n
  i32.const 2
  i32.eq

  (if
    (then
      i32.const 5
      return
     )
  )

  i32.const 10
)

以下是JavaScript 的等效代码:

const func = (n) => {
  if (n === 2) {
    return 5;
  }

  return 10;
}

稍微复杂一点的示例,包括多个if/return语句:

(module
  (func (export "func")
    (param $n i32)
    (result i32)

    local.get $n
    i32.const 2
    i32.eq

    (if
      (then
        i32.const 1
        return
      )
    )

    local.get $n
    i32.const 3
    i32.eq

    (if
      (then
        i32.const 2
        return
      )
    )

    i32.const 3
  )
)

以及其JavaScript 等效代码:

const func = (n) => {
  if (n === 2) {
    return 1
  }

  if (n === 3) {
    return 2
  }

  return 3
}
英文:

This can be done with the 0F operation (return, see table).

Here is an example of a function that returns the number 5 if the passed parameter is 2, otherwise it returns the number 10.

(module
  (func (export "func")
  (param $n i32)
  (result i32)

  local.get $n
  i32.const 2
  i32.eq

  (if
    (then
      i32.const 5
      return
     )
  )

  i32.const 10
)

Here is a JavaScript equivalent

const func = (n) => {
  if (n === 2) {
    return 5;
  }

  return 10;
}

A slightly more complex example with multiple if/returns:

(module
  (func (export "func")
    (param $n i32)
    (result i32)

    local.get $n
    i32.const 2
    i32.eq

    (if
      (then
        i32.const 1
        return
      )
    )

    local.get $n
    i32.const 3
    i32.eq

    (if
      (then
        i32.const 2
        return
      )
    )

    i32.const 3
  )
)

And its JavaScript counterpart:

const func = (n) => {
  if (n === 2) {
    return 1
  }

  if (n === 3) {
    return 2
  }

  return 3
}

答案2

得分: 1

WebAssembly有if/else控制结构的概念。

https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/Control_flow/if...else

英文:

WebAssembly has the concept of if/else control structures.

https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/Control_flow/if...else

huangapple
  • 本文由 发表于 2023年2月6日 17:24:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75359428.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定