之前 asm.js 时代用 emscripten 编译了一些网页程序。最近更新下算法,编译时发现 emscripten 居然不再支持 asm.js 了,只能生成 WebAssembly 。由于之前一直支持 IE10+,因此还是希望使用 asm.js 版本。
虽然使用 -s WASM=0
选项还是可以生成 js 版本,但发现内部是先生成 wasm 文件,然后再用 wasm2js 转成 JS 代码。
由于 wasm 默认是 64bit 的,因此很多数字运算、指针都按 64bit 处理,即使 32bit 足够用。
这导致最终转出来的 JS 里有大量的 __wasm_i64_mul 、__wasm_i64_xxx 等 32bit 模拟 64bit 的代码,不仅不美观,还严重影响了计算效率。这些代码之前都是没有的。
打算将 emscripten 退回到支持 asm.js 的版本(fastcomp backend),但发现居然装不上了,而且那个版本好几年前就不再维护了。
尝试在编译时加上 -m32 等参数,但都没效果。wasm 只能使用 64bit 的架构?
1
tool2d 353 天前
要不就用以前的老编译器,要不就放弃 ie10 算了。
wasm 的代码转译成 js 运行,还是挺影响运行效率的。 |
2
pursuer 353 天前
"由于 wasm 默认是 64bit 的,因此很多数字运算、指针都按 64bit 处理,即使 32bit 足够用。"
就我了解到的情况,wasm 的 64 位内存模型 Memory64 还未进入标准,emscripten 也需要指定 -sMEMORY64 才会启用。 |
3
iqoo OP @pursuer Memory64 是内存寻址扩展到 64 位,可以用 4G 以上的内存。寄存器一直都是 64 位的,这也是 wasm 比 asm.js 性能高的一个特点。
|
6
agagega 347 天前
试试-target wasm32-unknown-emscripten ?
|