Skip to content

Memory.atomic.wait instructions fail to account for big-endian hosts #13988

Description

@alexcrichton

This test:

(module
  (memory (export "shared") 1 1 shared)

  (func (export "eq32") (result i32)
    (i32.atomic.store (i32.const 0) (i32.const 1))
    (memory.atomic.wait32 (i32.const 0) (i32.const 1) (i64.const 0)))

  (func (export "ne32") (result i32)
    (i32.atomic.store (i32.const 0) (i32.const 1))
    (memory.atomic.wait32 (i32.const 0) (i32.const 0x01000000) (i64.const 0)))

  (func (export "eq64") (result i32)
    (i64.atomic.store (i32.const 8) (i64.const 1))
    (memory.atomic.wait64 (i32.const 8) (i64.const 1) (i64.const 0)))

  (func (export "ne64") (result i32)
    (i64.atomic.store (i32.const 8) (i64.const 1))
    (memory.atomic.wait64 (i32.const 8) (i64.const 0x0100000000000000) (i64.const 0)))
)

(assert_return (invoke "eq32") (i32.const 2))
(assert_return (invoke "ne32") (i32.const 1))
(assert_return (invoke "eq64") (i32.const 2))
(assert_return (invoke "ne64") (i32.const 1))

passes on little-endian hosts:

$ cargo run wast atomic_wait_endianness.wast
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.15s
     Running `/home/alex/code/wasmtime2/target/debug/wasmtime wast atomic_wait_endianness.wast`

and fails on big-endian hosts:

$ cargo run --target s390x-unknown-linux-gnu wast atomic_wait_endianness.wast
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.20s
     Running `qemu-s390x -L /usr/s390x-linux-gnu -E LD_LIBRARY_PATH=/usr/s390x-linux-gnu/lib -E WASMTIME_TEST_NO_HOG_MEMORY=1 /home/alex/code/wasmtime2/target/s390x-unknown-linux-gnu/debug/wasmtime wast atomic_wait_endianness.wast`
Error: failed to run script file 'atomic_wait_endianness.wast'

Caused by:
    0: failed directive on atomic_wait_endianness.wast:21
    1: result 0 didn't match
    2: expected                  2 / 0x0000000000000002
actual                    1 / 0x0000000000000001

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIncorrect behavior in the current implementation that needs fixingwasm-proposal:threadsIssues related to the WebAssembly threads proposal

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions