diff --git a/internal/engine/compiler/impl_amd64.go b/internal/engine/compiler/impl_amd64.go index c7b13152ba..efd39d8d06 100644 --- a/internal/engine/compiler/impl_amd64.go +++ b/internal/engine/compiler/impl_amd64.go @@ -3799,6 +3799,8 @@ func (c *amd64Compiler) compileFillLoopImpl(destinationOffset, value, fillSize * emptyEightGroupsJump := c.assembler.CompileJump(amd64.JEQ) if replicateByte { + // Truncate value.register to a single byte + c.assembler.CompileConstToRegister(amd64.ANDQ, 0xff, value.register) // Replicate single byte onto full 8-byte register. c.assembler.CompileConstToRegister(amd64.MOVQ, 0x0101010101010101, tmp) c.assembler.CompileRegisterToRegister(amd64.IMULQ, tmp, value.register) diff --git a/internal/integration_test/fuzzcases/fuzzcases_test.go b/internal/integration_test/fuzzcases/fuzzcases_test.go index d896fcbfb4..d85ec3f5b9 100644 --- a/internal/integration_test/fuzzcases/fuzzcases_test.go +++ b/internal/integration_test/fuzzcases/fuzzcases_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/api" "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/internal/testing/require" "github.com/tetratelabs/wazero/internal/wasm" @@ -383,3 +384,22 @@ func Test888(t *testing.T) { require.NoError(t, err) }) } + +func Test1054(t *testing.T) { + if !platform.CompilerSupported() { + return + } + + modules := make([]api.Module, 0, 2) + run(t, func(t *testing.T, r wazero.Runtime) { + mod, err := r.InstantiateModuleFromBinary(ctx, getWasmBinary(t, 1054)) + require.NoError(t, err) + modules = append(modules, mod) + }) + + // Checks if the memory state is the same between engines. + require.Equal(t, + modules[0].Memory().(*wasm.MemoryInstance).Buffer, + modules[1].Memory().(*wasm.MemoryInstance).Buffer, + ) +} diff --git a/internal/integration_test/fuzzcases/testdata/1054.wasm b/internal/integration_test/fuzzcases/testdata/1054.wasm new file mode 100644 index 0000000000..14a845cd1a Binary files /dev/null and b/internal/integration_test/fuzzcases/testdata/1054.wasm differ diff --git a/internal/integration_test/fuzzcases/testdata/1054.wat b/internal/integration_test/fuzzcases/testdata/1054.wat new file mode 100644 index 0000000000..5d96c674bb --- /dev/null +++ b/internal/integration_test/fuzzcases/testdata/1054.wat @@ -0,0 +1,11 @@ +(module + (type (;0;) (func)) + (func (;0;) (type 0) + i32.const 1000 + i32.const 1000 + i32.const 1000 + memory.fill + ) + (memory (;0;) 1 2) + (start 0) +)