blob: ce1530a6be3b6d10817fcf47cad9a240bd181e96 [file] [edit]
//@ requireOptions("--useWasmMultiMemory=1")
import * as assert from "../assert.js";
import { instantiate } from "../wabt-wrapper.js";
// test atomic instructions that access linear memory
let wat = `
(module
(import "js" "memory0" (memory 1))
(import "js" "memory1" (memory 1))
(func (export "i64_load") (param i32) (result i64) (local.get 0) (i64.load 1))
(func (export "i64_store") (param i32 i64) (local.get 0) (local.get 1) (i64.store 1))
;; (load address, store address)
(func (export "test_v128_load") (param i32 i32) (local.get 1) (local.get 0) (v128.load 1) (v128.store 1))
(func (export "test_v128_load8x8_s") (param i32 i32) (local.get 1) (local.get 0) (v128.load8x8_s 1) (v128.store 1))
(func (export "test_v128_load8x8_u") (param i32 i32) (local.get 1) (local.get 0) (v128.load8x8_u 1) (v128.store 1))
(func (export "test_v128_load16x4_s") (param i32 i32) (local.get 1) (local.get 0) (v128.load16x4_s 1) (v128.store 1))
(func (export "test_v128_load16x4_u") (param i32 i32) (local.get 1) (local.get 0) (v128.load16x4_u 1) (v128.store 1))
(func (export "test_v128_load32x2_s") (param i32 i32) (local.get 1) (local.get 0) (v128.load32x2_s 1) (v128.store 1))
(func (export "test_v128_load32x2_u") (param i32 i32) (local.get 1) (local.get 0) (v128.load32x2_u 1) (v128.store 1))
(func (export "test_v128_load8_splat") (param i32 i32) (local.get 1) (local.get 0) (v128.load8_splat 1) (v128.store 1))
(func (export "test_v128_load16_splat") (param i32 i32) (local.get 1) (local.get 0) (v128.load16_splat 1) (v128.store 1))
(func (export "test_v128_load32_splat") (param i32 i32) (local.get 1) (local.get 0) (v128.load32_splat 1) (v128.store 1))
(func (export "test_v128_load64_splat") (param i32 i32) (local.get 1) (local.get 0) (v128.load64_splat 1) (v128.store 1))
;; lane instructions take arguments (memory index, lane)
;; all lanes are handled using the same IPInt code, testing a sample is enough
(func (export "test_v128_load8_lane") (param i32 i32) (local.get 1) (local.get 0) (v128.const i64x2 0 0) (v128.load8_lane 1 13) (v128.store 1))
(func (export "test_v128_load16_lane") (param i32 i32)
(local.get 1) (local.get 0) (v128.const i64x2 0 0) (v128.load16_lane 1 6) (v128.store 1)
)
(func (export "test_v128_load32_lane") (param i32 i32)
(local.get 1) (local.get 0) (v128.const i64x2 0 0) (v128.load32_lane 1 3) (v128.store 1)
)
(func (export "test_v128_load64_lane") (param i32 i32)
(local.get 1) (local.get 0) (v128.const i64x2 0 0) (v128.load64_lane 1 0) (v128.store 1)
)
(func (export "test_v128_load32_zero") (param i32 i32) (local.get 1) (local.get 0) (v128.load32_zero 1) (v128.store 1))
(func (export "test_v128_load64_zero") (param i32 i32) (local.get 1) (local.get 0) (v128.load64_zero 1) (v128.store 1))
;; v128.store is already executed in load tests
(func (export "test_v128_store8_lane") (param i32) (local.get 0) (v128.const i64x2 0x7766554433221100 0xFFEEDDCCBBAA9988) (v128.store8_lane 1 8))
(func (export "test_v128_store16_lane") (param i32) (local.get 0) (v128.const i64x2 0x7766554433221100 0xFFEEDDCCBBAA9988) (v128.store16_lane 1 4))
(func (export "test_v128_store32_lane") (param i32) (local.get 0) (v128.const i64x2 0x7766554433221100 0xFFEEDDCCBBAA9988) (v128.store32_lane 1 2))
(func (export "test_v128_store64_lane") (param i32) (local.get 0) (v128.const i64x2 0x7766554433221100 0xFFEEDDCCBBAA9988) (v128.store64_lane 1 1))
)
`;
// Test:
//
// v128.load
// v128.load{8x8,16x4,32x2}_{s,u}
// v128.load{8,16,32,64}_splat
// v128.load{8,16,32,64}_lane
// v128.load{32,64}_zero
// v128.store
// v128.store{8,16,32,64}_lane
async function test() {
const mem0 = new WebAssembly.Memory({ initial: 1 });
const mem1 = new WebAssembly.Memory({ initial: 1 });
const instance = await instantiate(wat, { js: { memory0: mem0, memory1: mem1 } }, { multi_memory: true });
const m0array = new Uint8Array(mem0.buffer);
const m1array = new Uint8Array(mem1.buffer);
for(let i = 0; i < wasmTestLoopCount; i++) {
instance.exports.i64_store(0, 0x7766554433221100n);
instance.exports.i64_store(8, 0xFFEEDDCCBBAA9988n);
instance.exports.test_v128_load(0, 16);
assert.eq(instance.exports.i64_load(16), 0x7766554433221100n);
assert.eq(instance.exports.i64_load(24), 0xFFEEDDCCBBAA9988n - (1n << 64n));
instance.exports.test_v128_load8x8_s(8, 16);
assert.eq(instance.exports.i64_load(16), 0xFFBBFFAAFF99FF88n - (1n << 64n));
assert.eq(instance.exports.i64_load(24), 0xFFFFFFEEFFDDFFCCn - (1n << 64n));
instance.exports.test_v128_load8x8_u(8, 16);
assert.eq(instance.exports.i64_load(16), 0x00BB00AA00990088n);
assert.eq(instance.exports.i64_load(24), 0x00FF00EE00DD00CCn);
instance.exports.test_v128_load16x4_s(8, 16);
assert.eq(instance.exports.i64_load(16), 0xFFFFBBAAFFFF9988n - (1n << 64n));
assert.eq(instance.exports.i64_load(24), 0xFFFFFFEEFFFFDDCCn - (1n << 64n));
instance.exports.test_v128_load16x4_u(8, 16);
assert.eq(instance.exports.i64_load(16), 0x0000BBAA00009988n);
assert.eq(instance.exports.i64_load(24), 0x0000FFEE0000DDCCn);
instance.exports.test_v128_load32x2_s(8, 16);
assert.eq(instance.exports.i64_load(16), 0xFFFFFFFFBBAA9988n - (1n << 64n));
assert.eq(instance.exports.i64_load(24), 0xFFFFFFFFFFEEDDCCn - (1n << 64n));
instance.exports.test_v128_load32x2_u(8, 16);
assert.eq(instance.exports.i64_load(16), 0x00000000BBAA9988n);
assert.eq(instance.exports.i64_load(24), 0x00000000FFEEDDCCn);
instance.exports.test_v128_load8_splat(1, 16);
assert.eq(instance.exports.i64_load(16), 0x1111111111111111n);
assert.eq(instance.exports.i64_load(24), 0x1111111111111111n);
instance.exports.test_v128_load16_splat(0, 16);
assert.eq(instance.exports.i64_load(16), 0x1100110011001100n);
assert.eq(instance.exports.i64_load(24), 0x1100110011001100n);
instance.exports.test_v128_load32_splat(0, 16);
assert.eq(instance.exports.i64_load(16), 0x3322110033221100n);
assert.eq(instance.exports.i64_load(24), 0x3322110033221100n);
instance.exports.test_v128_load64_splat(0, 16);
assert.eq(instance.exports.i64_load(16), 0x7766554433221100n);
assert.eq(instance.exports.i64_load(24), 0x7766554433221100n);
instance.exports.test_v128_load8_lane(8, 16);
assert.eq(instance.exports.i64_load(16), 0n);
assert.eq(instance.exports.i64_load(24), 0x0000880000000000n);
instance.exports.test_v128_load16_lane(8, 16);
assert.eq(instance.exports.i64_load(16), 0n);
assert.eq(instance.exports.i64_load(24), 0x0000998800000000n);
instance.exports.test_v128_load32_lane(8, 16);
assert.eq(instance.exports.i64_load(16), 0n);
assert.eq(instance.exports.i64_load(24), 0xBBAA998800000000n - (1n << 64n));
instance.exports.test_v128_load64_lane(0, 16);
assert.eq(instance.exports.i64_load(16), 0x7766554433221100n);
assert.eq(instance.exports.i64_load(24), 0n);
instance.exports.test_v128_load32_zero(0, 16);
assert.eq(instance.exports.i64_load(16), 0x33221100n);
assert.eq(instance.exports.i64_load(24), 0n);
instance.exports.test_v128_load64_zero(0, 16);
assert.eq(instance.exports.i64_load(16), 0x7766554433221100n);
assert.eq(instance.exports.i64_load(24), 0n);
instance.exports.i64_store(0, 0n);
instance.exports.test_v128_store8_lane(0);
assert.eq(instance.exports.i64_load(0), 0x88n);
instance.exports.i64_store(0, 0n);
instance.exports.test_v128_store16_lane(0);
assert.eq(instance.exports.i64_load(0), 0x9988n);
instance.exports.i64_store(0, 0n);
instance.exports.test_v128_store32_lane(0);
assert.eq(instance.exports.i64_load(0), 0xBBAA9988n);
instance.exports.i64_store(0, 0n);
instance.exports.test_v128_store64_lane(0);
assert.eq(instance.exports.i64_load(0), 0xFFEEDDCCBBAA9988n - (1n << 64n));
}
}
await assert.asyncTest(test());