blob: 348819f3aca8574595e9bd424d2b10e262274141 [file] [edit]
//@ requireOptions("--useWasmSIMD=1")
//@ skip if !$isSIMDPlatform
import { instantiate } from "../wabt-wrapper.js"
import * as assert from "../assert.js"
let wat = `
(module
(memory 1)
(func (export "shuffle_identity1") (param i32) (result i64 i64)
(local $res v128)
(i8x16.splat (local.get 0))
(v128.const i8x16 11 12 0 3 0 40 0 2 12 10 0 0 33 0 32 4)
(i8x16.shuffle 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) ;; identity for the first operand!
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "shuffle_identity2") (param i32) (result i64 i64)
(local $res v128)
(v128.const i8x16 11 12 0 3 0 40 0 2 12 10 0 0 33 0 32 4)
(i8x16.splat (local.get 0))
(i8x16.shuffle 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31) ;; identity for the second operand!
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i8x16dup1") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i8x16dup2") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i16x8dup1") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i16x8dup2") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 18 19 18 19 18 19 18 19 18 19 18 19 18 19 18 19)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i16x8dup_wrong") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i32x4dup1") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i32x4dup2") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 16 17 18 19 16 17 18 19 16 17 18 19 16 17 18 19)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i32x4dup_wrong") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i64x2dup1") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i64x2dup2") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 24 25 26 27 28 29 30 31 24 25 26 27 28 29 30 31)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
(func (export "i64x2dup_wrong") (param i32 i32) (result i64 i64)
(local $res v128)
(i32x4.splat (local.get 0))
(i32x4.splat (local.get 1))
(i8x16.shuffle 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9)
(local.tee $res)
(i64x2.extract_lane 0)
(local.get $res)
(i64x2.extract_lane 1)
(return)
)
)`
async function test() {
const instance = await instantiate(wat, { imports: { } }, { simd: true })
const {
shuffle_identity1,
shuffle_identity2,
i8x16dup1,
i8x16dup2,
i16x8dup1,
i16x8dup2,
i16x8dup_wrong,
i32x4dup1,
i32x4dup2,
i32x4dup_wrong,
i64x2dup1,
i64x2dup2,
i64x2dup_wrong,
} = instance.exports
for (let i = 0; i < wasmTestLoopCount; ++i) {
assert.eq(shuffle_identity1(0x7f), [0x7f7f7f7f7f7f7f7fn, 0x7f7f7f7f7f7f7f7fn])
assert.eq(shuffle_identity2(0x5e), [0x5e5e5e5e5e5e5e5en, 0x5e5e5e5e5e5e5e5en])
assert.eq(i8x16dup1(0x01020304, 0x05060708), [0x0303030303030303n, 0x0303030303030303n])
assert.eq(i8x16dup2(0x01020304, 0x05060708), [0x0707070707070707n, 0x0707070707070707n])
assert.eq(i16x8dup1(0x01020304, 0x05060708), [0x0102010201020102n, 0x0102010201020102n])
assert.eq(i16x8dup2(0x01020304, 0x05060708), [0x0506050605060506n, 0x0506050605060506n])
assert.eq(i16x8dup_wrong(0x01020304, 0x05060708), [0x0203020302030203n, 0x0203020302030203n])
assert.eq(i32x4dup1(0x01020304, 0x05060708), [0x0102030401020304n, 0x0102030401020304n])
assert.eq(i32x4dup2(0x01020304, 0x05060708), [0x0506070805060708n, 0x0506070805060708n])
assert.eq(i32x4dup_wrong(0x01020304, 0x05060708), [0x0304010203040102n, 0x0304010203040102n])
assert.eq(i64x2dup1(0x01020304, 0x05060708), [0x0102030401020304n, 0x0102030401020304n])
assert.eq(i64x2dup2(0x01020304, 0x05060708), [0x0506070805060708n, 0x0506070805060708n])
assert.eq(i64x2dup_wrong(0x01020304, 0x05060708), [0x0304010203040102n, 0x0304010203040102n])
}
}
assert.asyncTest(test())