我应该如何在 Wasm 内存中存储连续的 f64 值?



我正在编写一个直接输出Wasm的小型编译器。在我的源语言中,所有值都是f64s,它们可以通过索引写入(和读出(固定大小的缓冲区。

我正在尝试使用(?用于存储该缓冲区的 wasm 内存。

在内存中存储连续的f64值时,我应该通过在运行时通过将索引乘以f64的字节大小来派生地址,还是可以使用align/offset以某种方式实现这一点?

在我最初的方法中(回想起来很愚蠢(假设我只能使用连续索引,并且以某种方式我正在使用f64.store并且f64.load它"只是工作"。

它看起来像这样.wat文件:

(module
(memory 1)
(func (result f64)
;; Write 0 to index 99
i32.const 99
f64.const 0
f64.store
;; Write 1 to index 100
i32.const 100
f64.const 1
f64.store
;; Read from 99
i32.const 99
f64.load
)
(export "run" (func 0))
)

我希望这会输出0但它输出-3.105036184601418e+231我认为这是因为当我开始读取索引 99 时我正在读取的一些字节是在我写入索引 100 时刚刚写入的。

上述.wat文件的"正确"版本(将两个连续的f64值存储到内存中然后读取一个(会是什么样子?

官方f64.load/f64.store规格可以在这里找到。

在内存中存储连续的 f64 值时,我应该通过在运行时通过将索引乘以 f64 的字节大小来派生地址,还是可以使用对齐/偏移以某种方式实现这一点?

不,您无法通过对齐/偏移来获取此值。

您必须将所有索引乘以 8(因为 f64 是 64 位/8 位 = 8(。

您可以直接在每次内存访问中执行此操作,或者另一种方法是定义两个实用程序函数:

  • (结果 F64( myload(索引 i32( 和
  • (( mystore(i32 索引,f64 值(

然后,这些函数将在索引*8处进行加载/存储。

相关内容

  • 没有找到相关文章

最新更新