nodejs/deps/v8/test/mjsunit/wasm/redundant-shuffle-lanes.js
Michaël Zasso 918fe04351
deps: update V8 to 13.6.233.8
PR-URL: https://github.com/nodejs/node/pull/58070
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
2025-05-02 15:06:53 +02:00

942 lines
33 KiB
JavaScript

// Copyright 2025 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --no-liftoff
// Flags: --experimental-wasm-simd-opt
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
d8.file.execute('test/mjsunit/value-helper.js');
(function LowLeftHighHighRightLow() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // args: [0, 0, 1, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 4, 5]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // args: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // high half of right into low.
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // low half of left into high.
kExprLocalTee, 8, // 3, 3, 0, 0
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 2,
kExprI32Sub,
];
const scalar = [
kExprLocalGet, 3,
kExprLocalGet, 0,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(b, b, a, a),
wasm.scalar(b, b, a, a));
}
}
})();
(function HighLeftHighHighRightLow() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // args: [0, 0, 1, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 4, 5]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // args: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // high half of right into low.
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // high half of left into high.
kExprLocalTee, 8, // 3, 3, 1, 1
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 2,
kExprI32Sub,
];
const scalar = [
kExprLocalGet, 3,
kExprLocalGet, 1,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(b, a, a, b),
wasm.scalar(b, a, a, b));
}
}
})();
(function HighLeftHighLowRightLow() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // args: [0, 0, 1, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 4, 5]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // args: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // low half of right into low.
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // high half of left into high.
kExprLocalTee, 8, // 2, 2, 1, 1
kSimdPrefix, kExprI32x4ExtractLane, 1,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Sub,
];
const scalar = [
kExprLocalGet, 2,
kExprLocalGet, 1,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(b, a, b, a),
wasm.scalar(b, a, b, a));
}
}
})();
(function LowLeftLowLowRightHigh() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // args: [0, 0, 1, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 4, 5]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // args: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // low half of left into low.
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // low half of right into high.
kExprLocalTee, 8, // 0, 0, 2, 2
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Sub,
];
const scalar = [
kExprLocalGet, 0,
kExprLocalGet, 2,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(a, a, a, b),
wasm.scalar(a, a, a, b));
}
}
})();
(function HighLeftLowLowRightHigh() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // args: [0, 0, 1, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 4, 5]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // args: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // high half of left into low.
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // low half of right into high.
kExprLocalTee, 8, // 1, 1, 2, 2
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Sub,
];
const scalar = [
kExprLocalGet, 1,
kExprLocalGet, 2,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(b, b, a, a),
wasm.scalar(b, b, a, a));
}
}
})();
(function LowLeftLowHighRightHigh() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // args: [0, 0, 1, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 4, 5]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // args: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // low half of left into low.
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // high half of right into high.
kExprLocalTee, 8, // 0, 0, 3, 3
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Sub,
];
const scalar = [
kExprLocalGet, 0,
kExprLocalGet, 3,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(a, a, a, b),
wasm.scalar(a, a, a, b));
}
}
})();
(function HighLeftLowHighRightHigh() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // args: [0, 0, 1, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 4, 5]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // args: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // high half of left into low.
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // high half of right into high.
kExprLocalTee, 8, // 1, 1, 3, 3
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Sub,
];
const scalar = [
kExprLocalGet, 1,
kExprLocalGet, 3,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(b, a, a, b),
wasm.scalar(b, a, a, b));
}
}
})();
(function ThreeLayerShuffle() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprF64x2Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprF64x2Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprF64x2Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprF64x2Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // lanes: [0, 2]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // res: [0, 1]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // lanes: [1, 3]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // res: [2, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // lanes: [0, 2]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // res: [0, 2]
kExprLocalGet, 5,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle, // args: 1, 0
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // lanes: [0, 2]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // res: [1, 0]
kExprLocalGet, 7,
kExprLocalGet, 6,
kSimdPrefix, kExprI8x16Shuffle, // args: 3, 2
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // lanes: [1, 3]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // res: [3, 1]
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // lanes: [0, 2]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // res: [1, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // lanes: [0, 2]
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // res: [0, 1]
kExprLocalTee, 8,
kSimdPrefix, kExprF64x2ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprF64x2ExtractLane, 1,
kExprF64Sub,
];
const scalar = [
kExprLocalGet, 0,
kExprLocalGet, 1,
kExprF64Sub,
];
builder.addFunction("simd", kSig_d_dddd).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_d_dddd).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of float64_array) {
for (let b of float64_array) {
assertEquals(wasm.simd(a, b, b, a),
wasm.scalar(a, b, b, a));
}
}
})();
(function InterleaveFour() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 4, // 4: arg 0
kExprLocalGet, 1,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 5, // 5: arg 1
kExprLocalGet, 2,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 6, // 6: arg 2
kExprLocalGet, 3,
kSimdPrefix, kExprI32x4Splat,
kExprLocalSet, 7, // 7: arg 3
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x04, 0x05, 0x06, 0x07, 0x1c, 0x1d, 0x1e, 0x1f, // lanes: [1, 7, 0, 0]
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // res: [0, 1, 0, 0]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // res: [2, 2, 3, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // lanes: [0, 1, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // res: [0, 1, 3, 3]
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle, // args: 0, 1
0x00, 0x01, 0x02, 0x03, 0x18, 0x19, 0x1a, 0x1b, // lanes: [0, 6, 0, 0]
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // res: [0, 1, 0, 0]
kExprLocalGet, 6,
kExprLocalGet, 7,
kSimdPrefix, kExprI8x16Shuffle, // args: 2, 3
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, // lanes: [0, 0, 0, 6]
0x00, 0x01, 0x02, 0x03, 0x18, 0x19, 0x1a, 0x1b, // res: [2, 2, 2, 3]
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // lanes: [0, 1, 6, 7]
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // res: [0, 1, 2, 3]
...SimdInstr(kExprI32x4Sub), // [0 - 0, 1 - 1, 3 - 2, 3 - 3]
kExprLocalTee, 8,
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 1,
kExprI32Add,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 2,
kExprLocalGet, 8,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Add,
kExprI32Add,
];
const scalar = [
kExprLocalGet, 3,
kExprLocalGet, 2,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 5).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int32_array) {
for (let b of int32_array) {
assertEquals(wasm.simd(a, b, b, a),
wasm.scalar(a, b, b, a));
}
}
})();
(function ShuffleU8x8ConvertLow() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16Splat,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 1,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 2,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 3,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 5,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 6,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 7,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 9,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 10,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 11,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 13,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 14,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 15,
kExprLocalTee, 4,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16Splat,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 1,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 2,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 3,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 5,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 6,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 7,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 9,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 10,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 11,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 13,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 14,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 15,
kExprLocalTee, 5,
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13,
0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17,
...SimdInstr(kExprI16x8UConvertI8x16Low),
...SimdInstr(kExprI32x4ExtAddPairwiseI16x8U),
...SimdInstr(kExprI64x2UConvertI32x4High),
kExprLocalTee, 6,
kSimdPrefix, kExprI64x2ExtractLane, 0,
kExprLocalGet, 6,
kSimdPrefix, kExprI64x2ExtractLane, 1,
kExprI64Add,
];
const byte_mask = wasmI32Const(0xFF);
const scalar = wasmI32Const(0xFF).concat([
kExprLocalTee, 4,
kExprLocalGet, 0,
kExprI32And,
kExprLocalGet, 4,
kExprLocalGet, 1,
kExprI32And,
kExprI32Add,
kExprLocalGet, 4,
kExprLocalGet, 2,
kExprI32And,
kExprLocalGet, 4,
kExprLocalGet, 3,
kExprI32And,
kExprI32Add,
kExprI32Add,
kExprI64UConvertI32,
]);
builder.addFunction("simd", kSig_l_iiii).addLocals(kWasmS128, 3).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_l_iiii).addLocals(kWasmI32, 1).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int8_array) {
for (let b of int8_array) {
for (let c of int8_array) {
for (let d of int8_array) {
assertEquals(wasm.simd(a, b, c, d),
wasm.scalar(a, b, c, d));
}
}
}
}
})();
(function InterleaveU8x4Add() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = wasmI32Const(0x0).concat([
kSimdPrefix, kExprI8x16Splat,
kExprLocalTee, 5,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16Splat,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 1,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 2,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 3,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 5,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 6,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 7,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 9,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 10,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 11,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 13,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 14,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 15,
kExprLocalTee, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x03, 0x07, 0x0b, 0x0f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI16x8UConvertI8x16Low),
...SimdInstr(kExprI32x4UConvertI16x8Low),
...SimdInstr(kExprI32x4Add),
kExprLocalGet, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x02, 0x06, 0x0a, 0x0e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI16x8UConvertI8x16Low),
...SimdInstr(kExprI32x4UConvertI16x8Low),
...SimdInstr(kExprI32x4Add),
kExprLocalGet, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x01, 0x05, 0x09, 0x0d, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI16x8UConvertI8x16Low),
...SimdInstr(kExprI32x4UConvertI16x8Low),
...SimdInstr(kExprI32x4Add),
kExprLocalGet, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x04, 0x08, 0x0c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI16x8UConvertI8x16Low),
...SimdInstr(kExprI32x4UConvertI16x8Low),
...SimdInstr(kExprI32x4Add),
kSimdPrefix, kExprI32x4ExtractLane, 0,
]);
const byte_mask = wasmI32Const(0xFF);
const scalar = wasmI32Const(0xFF).concat([
kExprLocalTee, 4,
kExprLocalGet, 0,
kExprI32And,
kExprLocalGet, 1,
kExprLocalGet, 4,
kExprI32And,
kExprI32Add,
kExprLocalGet, 2,
kExprLocalGet, 4,
kExprI32And,
kExprLocalGet, 3,
kExprLocalGet, 4,
kExprI32And,
kExprI32Add,
kExprI32Add,
]);
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 2).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addLocals(kWasmI32, 1).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int8_array) {
for (let b of int8_array) {
for (let c of int8_array) {
for (let d of int8_array) {
assertEquals(wasm.simd(a, b, c, d),
wasm.scalar(a, b, c, d));
}
}
}
}
})();
(function ShuffleS8x4MulTo64x2() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16Splat,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 1,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 2,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 3,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 5,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 6,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 7,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 9,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 10,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 11,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 13,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 14,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16ReplaceLane, 15,
kExprLocalTee, 4,
kExprLocalGet, 3,
kSimdPrefix, kExprI8x16Splat,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 1,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 2,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 3,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 5,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 6,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 7,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 9,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 10,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 11,
kExprLocalGet, 2,
kSimdPrefix, kExprI8x16ReplaceLane, 13,
kExprLocalGet, 1,
kSimdPrefix, kExprI8x16ReplaceLane, 14,
kExprLocalGet, 0,
kSimdPrefix, kExprI8x16ReplaceLane, 15,
kExprLocalTee, 5,
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI16x8SConvertI8x16Low),
kExprLocalGet, 4,
kExprLocalGet, 5,
kSimdPrefix, kExprI8x16Shuffle,
0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI16x8SConvertI8x16Low),
...SimdInstr(kExprI32x4ExtMulLowI16x8S),
...SimdInstr(kExprI64x2SConvertI32x4Low),
kExprLocalTee, 6,
kSimdPrefix, kExprI64x2ExtractLane, 0,
kExprLocalGet, 6,
kSimdPrefix, kExprI64x2ExtractLane, 1,
kExprI64Add,
];
const scalar = [
kExprLocalGet, 0,
kExprI32SExtendI8,
kExprLocalGet, 3,
kExprI32SExtendI8,
kExprI32Mul,
kExprI64SConvertI32,
kExprLocalGet, 1,
kExprI32SExtendI8,
kExprLocalGet, 2,
kExprI32SExtendI8,
kExprI32Mul,
kExprI64SConvertI32,
kExprI64Add,
];
builder.addFunction("simd", kSig_l_iiii).addLocals(kWasmS128, 3).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_l_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int8_array) {
for (let b of int8_array) {
for (let c of int8_array) {
for (let d of int8_array) {
assertEquals(wasm.simd(a, b, c, d),
wasm.scalar(a, b, c, d));
}
}
}
}
})();
(function ShuffleS16x4MulLowTo32x4() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI16x8Splat,
kExprLocalGet, 1,
kSimdPrefix, kExprI16x8ReplaceLane, 1,
kExprLocalGet, 2,
kSimdPrefix, kExprI16x8ReplaceLane, 2,
kExprLocalGet, 3,
kSimdPrefix, kExprI16x8ReplaceLane, 3,
kExprLocalGet, 1,
kSimdPrefix, kExprI16x8ReplaceLane, 5,
kExprLocalGet, 2,
kSimdPrefix, kExprI16x8ReplaceLane, 6,
kExprLocalGet, 3,
kSimdPrefix, kExprI16x8ReplaceLane, 7,
kExprLocalTee, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
kExprLocalGet, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b, 0x0e, 0x0f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI32x4ExtMulLowI16x8S),
kExprLocalTee, 5,
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 5,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Sub
];
const scalar = [
kExprLocalGet, 0,
kExprI32SExtendI16,
kExprLocalGet, 1,
kExprI32SExtendI16,
kExprI32Mul,
kExprLocalGet, 2,
kExprI32SExtendI16,
kExprLocalGet, 3,
kExprI32SExtendI16,
kExprI32Mul,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 2).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int16_array) {
for (let b of int16_array) {
for (let c of int16_array) {
for (let d of int16_array) {
assertEquals(wasm.simd(a, b, c, d),
wasm.scalar(a, b, c, d));
}
}
}
}
})();
(function ShuffleS16x4ConvertHighLowTo32x4() {
print(arguments.callee.name);
const builder = new WasmModuleBuilder();
const simd = [
kExprLocalGet, 0,
kSimdPrefix, kExprI16x8Splat,
kExprLocalGet, 1,
kSimdPrefix, kExprI16x8ReplaceLane, 1,
kExprLocalGet, 2,
kSimdPrefix, kExprI16x8ReplaceLane, 2,
kExprLocalGet, 3,
kSimdPrefix, kExprI16x8ReplaceLane, 3,
kExprLocalGet, 1,
kSimdPrefix, kExprI16x8ReplaceLane, 5,
kExprLocalGet, 2,
kSimdPrefix, kExprI16x8ReplaceLane, 6,
kExprLocalGet, 3,
kSimdPrefix, kExprI16x8ReplaceLane, 7,
kExprLocalTee, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...SimdInstr(kExprI32x4SConvertI16x8Low),
kExprLocalGet, 4,
kExprLocalGet, 4,
kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x03, 0x06, 0x07, 0x0a, 0x0b, 0x0e, 0x0f,
...SimdInstr(kExprI32x4SConvertI16x8High),
...SimdInstr(kExprS128Xor),
kExprLocalTee, 5,
kSimdPrefix, kExprI32x4ExtractLane, 0,
kExprLocalGet, 5,
kSimdPrefix, kExprI32x4ExtractLane, 3,
kExprI32Sub
];
const scalar = [
kExprLocalGet, 0,
kExprI32SExtendI16,
kExprLocalGet, 1,
kExprI32SExtendI16,
kExprI32Xor,
kExprLocalGet, 2,
kExprI32SExtendI16,
kExprLocalGet, 3,
kExprI32SExtendI16,
kExprI32Xor,
kExprI32Sub,
];
builder.addFunction("simd", kSig_i_iiii).addLocals(kWasmS128, 2).addBody(simd).exportFunc();
builder.addFunction("scalar", kSig_i_iiii).addBody(scalar).exportFunc();
const wasm = builder.instantiate().exports;
for (let a of int16_array) {
for (let b of int16_array) {
for (let c of int16_array) {
for (let d of int16_array) {
assertEquals(wasm.simd(a, b, c, d),
wasm.scalar(a, b, c, d));
}
}
}
}
})();