Files
wasmer/tests/wast/spec/proposals/simd/simd_align.wast

356 lines
12 KiB
Plaintext
Vendored

;; Valid alignment
(module (memory 1) (func (drop (v128.load align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load align=8 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load align=16 (i32.const 0)))))
(module (memory 1) (func (v128.store align=1 (i32.const 0) (v128.const i32x4 0 1 2 3))))
(module (memory 1) (func (v128.store align=2 (i32.const 0) (v128.const i32x4 0 1 2 3))))
(module (memory 1) (func (v128.store align=4 (i32.const 0) (v128.const i32x4 0 1 2 3))))
(module (memory 1) (func (v128.store align=8 (i32.const 0) (v128.const i32x4 0 1 2 3))))
(module (memory 1) (func (v128.store align=16 (i32.const 0) (v128.const i32x4 0 1 2 3))))
(module (memory 1) (func (drop (v128.load8x8_s align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8x8_s align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8x8_s align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8x8_s align=8 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8x8_u align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8x8_u align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8x8_u align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8x8_u align=8 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_s align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_s align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_s align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_s align=8 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_u align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_u align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_u align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16x4_u align=8 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_s align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_s align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_s align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_s align=8 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_u align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_u align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_u align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32x2_u align=8 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load8_splat align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16_splat align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load16_splat align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32_splat align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32_splat align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load32_splat align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load64_splat align=1 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load64_splat align=2 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load64_splat align=4 (i32.const 0)))))
(module (memory 1) (func (drop (v128.load64_splat align=8 (i32.const 0)))))
;; Invalid alignment
(assert_invalid
(module (memory 1) (func (drop (v128.load align=32 (i32.const 0)))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 0) (func(v128.store align=32 (i32.const 0) (v128.const i32x4 0 0 0 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load8x8_s align=16 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load8x8_u align=16 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load16x4_s align=16 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load16x4_u align=16 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load32x2_s align=16 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load32x2_u align=16 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load8_splat align=2 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load16_splat align=4 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load32_splat align=8 (i32.const 0))))
"alignment must not be larger than natural"
)
(assert_invalid
(module (memory 1) (func (result v128) (v128.load64_splat align=16 (i32.const 0))))
"alignment must not be larger than natural"
)
;; Malformed alignment
(assert_malformed
(module quote
"(memory 1) (func (drop (v128.load align=-1 (i32.const 0))))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (drop (v128.load align=0 (i32.const 0))))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (drop (v128.load align=7 (i32.const 0))))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (v128.store align=-1 (i32.const 0) (v128.const i32x4 0 0 0 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 0) (func (v128.store align=0 (i32.const 0) (v128.const i32x4 0 0 0 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 0) (func (v128.store align=7 (i32.const 0) (v128.const i32x4 0 0 0 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8x8_s align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8x8_s align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8x8_s align=7 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8x8_u align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8x8_u align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8x8_u align=7 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16x4_s align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16x4_s align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16x4_s align=7 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16x4_u align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16x4_u align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16x4_u align=7 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32x2_s align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32x2_s align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32x2_s align=7 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32x2_u align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32x2_u align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32x2_u align=7 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8_splat align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load8_splat align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16_splat align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load16_splat align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32_splat align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32_splat align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load32_splat align=3 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load64_splat align=-1 (i32.const 0)))"
)
"unknown operator"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load64_splat align=0 (i32.const 0)))"
)
"alignment must be a power of two"
)
(assert_malformed
(module quote
"(memory 1) (func (result v128) (v128.load64_splat align=7 (i32.const 0)))"
)
"alignment must be a power of two"
)
;; Test that misaligned SIMD loads/stores don't trap
(module
(memory 1 1)
(func (export "v128.load align=16") (param $address i32) (result v128)
(v128.load align=16 (local.get $address))
)
(func (export "v128.store align=16") (param $address i32) (param $value v128)
(v128.store align=16 (local.get $address) (local.get $value))
)
)
(assert_return (invoke "v128.load align=16" (i32.const 0)) (v128.const i32x4 0 0 0 0))
(assert_return (invoke "v128.load align=16" (i32.const 1)) (v128.const i32x4 0 0 0 0))
(assert_return (invoke "v128.store align=16" (i32.const 1) (v128.const i8x16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)))
(assert_return (invoke "v128.load align=16" (i32.const 0)) (v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))
;; Test aligned and unaligned read/write
(module
(memory 1)
(func (export "v128_unaligned_read_and_write") (result v128)
(local v128)
(v128.store (i32.const 0) (v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))
(v128.load (i32.const 0))
)
(func (export "v128_aligned_read_and_write") (result v128)
(local v128)
(v128.store align=2 (i32.const 0) (v128.const i16x8 0 1 2 3 4 5 6 7))
(v128.load align=2 (i32.const 0))
)
(func (export "v128_aligned_read_and_unaligned_write") (result v128)
(local v128)
(v128.store (i32.const 0) (v128.const i32x4 0 1 2 3))
(v128.load align=2 (i32.const 0))
)
(func (export "v128_unaligned_read_and_aligned_write") (result v128)
(local v128)
(v128.store align=2 (i32.const 0) (v128.const i32x4 0 1 2 3))
(v128.load (i32.const 0))
)
)
(assert_return (invoke "v128_unaligned_read_and_write") (v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))
(assert_return (invoke "v128_aligned_read_and_write") (v128.const i16x8 0 1 2 3 4 5 6 7))
(assert_return (invoke "v128_aligned_read_and_unaligned_write") (v128.const i32x4 0 1 2 3))
(assert_return (invoke "v128_unaligned_read_and_aligned_write") (v128.const i32x4 0 1 2 3))