如何从C代码中使用i64而不是i32生成Webassembly(WAT)



我试图用i64生成一个.wat文件,但它只是编译到i32。

在C代码中,我使用int和int64_t进行了测试,但没有成功。

这是C代码:

#include <stdio.h>
#include <stdint.h>
#define MAX 64
int main(void) {
int64_t v1[MAX], v2[MAX], v3[MAX];
int64_t i;
for(i = 0; i < MAX; i++)
v3[i] = v1[i] + v2[i];
for(i = 0; i < MAX; i++)
printf("%llun", v3[i]);
return 0;
}

然后我使用CLI编译为.wasm和.wat格式:

$ emcc -Oz ex1.c -s WASM=1 -s SIDE_MODULE=1 -s ONLY_MY_CODE=1 -o ex1.wasm
$ wasm2wat ex1.wasm -o ex1.wat

这是编译的.wat文件:

(module
(type (;0;) (func (result i32)))
(type (;1;) (func (param i32 i32 i32 i32) (result i32)))
(type (;2;) (func (param i32 i32) (result i32)))
(type (;3;) (func))
(import "env" "getTempRet0" (func (;0;) (type 0)))
(import "env" "_i64Add" (func (;1;) (type 1)))
(import "env" "_printf" (func (;2;) (type 2)))
(import "env" "memoryBase" (global (;0;) i32))
(import "env" "memory" (memory (;0;) 256))
(func (;3;) (type 0) (result i32)
(local i32 i32 i32 i32 i32 i32 i32 i32 i32)
get_global 1
set_local 2
get_global 1
i32.const 1552
i32.add
set_global 1
get_local 2
i32.const 1536
i32.add
set_local 5
get_local 2
i32.const 1024
i32.add
set_local 7
get_local 2
i32.const 512
i32.add
set_local 8
loop  ;; label = @1
get_local 4
i32.const 0
i32.lt_u
get_local 4
i32.eqz
get_local 0
i32.const 64
i32.lt_u
i32.and
i32.or
if  ;; label = @2
get_local 8
get_local 0
i32.const 3
i32.shl
i32.add
tee_local 1
i32.load
get_local 1
i32.load offset=4
get_local 7
get_local 0
i32.const 3
i32.shl
i32.add
tee_local 1
i32.load
get_local 1
i32.load offset=4
call 1
set_local 3
call 0
set_local 6
get_local 2
get_local 0
i32.const 3
i32.shl
i32.add
tee_local 1
get_local 3
i32.store
get_local 1
get_local 6
i32.store offset=4
get_local 0
get_local 4
i32.const 1
i32.const 0
call 1
set_local 0
call 0
set_local 4
br 1 (;@1;)
end
end
i32.const 0
set_local 3
i32.const 0
set_local 0
loop  ;; label = @1
get_local 3
i32.const 0
i32.lt_u
get_local 3
i32.eqz
get_local 0
i32.const 64
i32.lt_u
i32.and
i32.or
if  ;; label = @2
get_local 2
get_local 0
i32.const 3
i32.shl
i32.add
tee_local 6
i32.load offset=4
set_local 1
get_local 5
get_local 6
i32.load
i32.store
get_local 5
get_local 1
i32.store offset=4
get_global 0
get_local 5
call 2
drop
get_local 0
get_local 3
i32.const 1
i32.const 0
call 1
set_local 0
call 0
set_local 3
br 1 (;@1;)
end
end
get_local 2
set_global 1
i32.const 0)
(func (;4;) (type 3)
get_global 0
i32.const 16
i32.add
set_global 1
get_global 1
i32.const 5242880
i32.add
set_global 2)
(global (;1;) (mut i32) (i32.const 0))
(global (;2;) (mut i32) (i32.const 0))
(export "__post_instantiate" (func 4))
(export "_main" (func 3))
(data (get_global 0) "%llua"))

我正在研究mbebenita WebAssembly Explorer代码,但它对我来说有点困惑,但我知道它同时生成i64和x86程序集。

  • https://mbebenita.github.io/WasmExplorer/

我知道我可以使用WebAssembly Explorer生成.wat文件和x86程序集,但在我的情况下,我需要使用CLI进行编译。

当您使用SIDE_MODULE=1进行构建时,默认情况下emscripten将构建一个与asmjs兼容的模块,这意味着它不会假定本机支持64位。

看起来有一个计划来解决这个限制:https://github.com/kripken/emscripten/blob/fd38f3bbf1fdc2f48078f641eb57b1c6fa2a538f/tools/shared.py#L2316https://github.com/kripken/emscripten/blob/fd38f3bbf1fdc2f48078f641eb57b1c6fa2a538f/emscripten.py#L485

看起来,如果你想要本机i64支持,现在就不能使用SIDE_MODULE了。

最新更新