99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
package vs
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/binary"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/tetratelabs/wazero/internal/testing/require"
|
|
)
|
|
|
|
const (
|
|
i32 = "i32"
|
|
i32ValueMemoryOffset = 32
|
|
i64 = "i64"
|
|
i64ValueMemoryOffset = 64
|
|
inWasmIteration = 100
|
|
)
|
|
|
|
var (
|
|
//go:embed testdata/memory.wasm
|
|
memoryWasm []byte
|
|
memoryConfig *RuntimeConfig
|
|
memoryFunctions = []string{i32, i64}
|
|
)
|
|
|
|
func init() {
|
|
memoryConfig = &RuntimeConfig{
|
|
ModuleName: "memory",
|
|
ModuleWasm: memoryWasm,
|
|
FuncNames: memoryFunctions,
|
|
NeedsMemoryExport: true,
|
|
}
|
|
}
|
|
|
|
func RunTestMemory(t *testing.T, runtime func() Runtime) {
|
|
t.Run(i32, func(t *testing.T) {
|
|
testCall(t, runtime, memoryConfig, func(t *testing.T, m Module, instantiation int, iteration int) {
|
|
buf := m.Memory()
|
|
binary.LittleEndian.PutUint32(buf[i32ValueMemoryOffset:], inWasmIteration)
|
|
err := m.CallV_V(testCtx, i32)
|
|
require.NoError(t, err)
|
|
if 0 != binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:]) {
|
|
panic(fmt.Sprintf("BUG at iteration %d: %d", iteration, binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:])))
|
|
}
|
|
})
|
|
})
|
|
|
|
t.Run(i64, func(t *testing.T) {
|
|
testCall(t, runtime, memoryConfig, func(t *testing.T, m Module, instantiation int, iteration int) {
|
|
buf := m.Memory()
|
|
binary.LittleEndian.PutUint64(buf[i64ValueMemoryOffset:], inWasmIteration)
|
|
err := m.CallV_V(testCtx, i64)
|
|
require.NoError(t, err)
|
|
if 0 != binary.LittleEndian.Uint64(buf[i64ValueMemoryOffset:]) {
|
|
panic(fmt.Sprintf("BUG at iteration %d: %d", iteration, binary.LittleEndian.Uint64(buf[i32ValueMemoryOffset:])))
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
func RunTestBenchmarkMemory_CompilerFastest(t *testing.T, vsRuntime Runtime) {
|
|
t.Run(i32, func(t *testing.T) {
|
|
runTestBenchmark_Call_CompilerFastest(t, memoryConfig, "/memory.i32", memoryI32, vsRuntime)
|
|
})
|
|
t.Run(i64, func(t *testing.T) {
|
|
runTestBenchmark_Call_CompilerFastest(t, memoryConfig, "/memory.i64", memoryI64, vsRuntime)
|
|
})
|
|
}
|
|
|
|
func RunBenchmarkMemory(b *testing.B, runtime func() Runtime) {
|
|
b.Run(i32, func(b *testing.B) {
|
|
benchmark(b, runtime, memoryConfig, memoryI32)
|
|
})
|
|
b.Run(i64, func(b *testing.B) {
|
|
benchmark(b, runtime, memoryConfig, memoryI64)
|
|
})
|
|
}
|
|
|
|
func memoryI32(m Module, iteration int) (err error) {
|
|
buf := m.Memory()
|
|
binary.LittleEndian.PutUint32(buf[i32ValueMemoryOffset:], inWasmIteration)
|
|
err = m.CallV_V(testCtx, i32)
|
|
if 0 != binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:]) {
|
|
panic(fmt.Sprintf("BUG at iteration %d", iteration))
|
|
}
|
|
return
|
|
}
|
|
|
|
func memoryI64(m Module, iteration int) (err error) {
|
|
buf := m.Memory()
|
|
binary.LittleEndian.PutUint64(buf[i64ValueMemoryOffset:], inWasmIteration)
|
|
err = m.CallV_V(testCtx, i64)
|
|
if 0 != binary.LittleEndian.Uint64(buf[i64ValueMemoryOffset:]) {
|
|
panic(fmt.Sprintf("BUG at iteration %d", iteration))
|
|
}
|
|
return
|
|
}
|