【问题标题】:How this piece of ASM.js code should be evaluated by the engine?引擎应该如何评估这段 ASM.js 代码?
【发布时间】:2020-08-12 17:12:04
【问题描述】:

根据规范,ASM.js 中的“int”类型没有签名。

int 类型是符号未知的 32 位整数类型。在 asm.js 中,变量的类型从来没有已知的符号。这允许它们被编译为 32 位整数寄存器和内存字。但是,这种表示会在有符号和无符号数字之间产生重叠,这会导致在确定它们代表哪个 JavaScript 数字时产生歧义。例如,位模式 0xffffffff 可以表示 4294967295 或 -1,具体取决于符号。因此,不允许 int 类型的值转义到外部(非 asm.js)JavaScript 代码中。

那么引擎如何评估以下 ASM.js 代码?因为如果参数 x 和 y 具有不同的符号,结果可能会不同。我们如何为它生成 AOT 代码?

function foo(start, end) {
  start = start|0;  // start is int.
  end = end|0;  // start is int.

  return +((end - start)|0);
}

【问题讨论】:

    标签: emscripten asm.js


    【解决方案1】:

    |0 转换为有符号整数。所以该函数中的所有值和操作都是有符号的。

    (但是,对于减法,符号无论如何都无关紧要 - 对于有符号或无符号,它都是一条 CPU 指令,请参阅 How the value of type "i32" is evaluated in WebAssembly?

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2011-01-25
      • 2015-09-22
      • 2014-02-09
      • 2017-11-24
      • 1970-01-01
      相关资源
      最近更新 更多