WebAssembly:是否可以使用2倍 i32.store 而不是一个 i64.store?



如果堆栈上有一个 i64,是否可以使用两个i32.store到后续内存索引将 i64 写入内存?或者这不再是一个有效的模块?

==i32==|==i32==
======i64======

只要堆栈上有两个值,两个后续 i32.store 操作就有效。但最终结果不会与 i64.store 相同。相反,您需要执行移位操作来存储较低字节而不是较高字节。

;; the value to store 
i64.const 0x11223344556677
;; storage offset
i32.const 0
;; store
i32.store
;; load the value again 
i64.const 0x11223344556677
;; the number of bits to shift by
i32.const 32
;; shift
i32.shr_u
;; storage offset
i32.const 4
;; store
i32.store

您可能会使用本地来避免两次加载相同的数字。

不,您不能假设堆栈操作数位于连续内存中 - 或者根本不存在于内存中,因为实际上它们通常位于单独的CPU寄存器中。因此,从操作数堆栈隐式"合并"两个 i32 操作数是不可能的,就好像它们是单个 i64 一样。您需要单独存储它们。同样,反过来。

相关内容

  • 没有找到相关文章

最新更新