diff options
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/simd-lane-memory64.js')
-rw-r--r-- | deps/v8/test/mjsunit/wasm/simd-lane-memory64.js | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/wasm/simd-lane-memory64.js b/deps/v8/test/mjsunit/wasm/simd-lane-memory64.js new file mode 100644 index 0000000000..77c81206e8 --- /dev/null +++ b/deps/v8/test/mjsunit/wasm/simd-lane-memory64.js @@ -0,0 +1,93 @@ +// Copyright 2023 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: --experimental-wasm-memory64 + +d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); + +const GB = 1024 * 1024 * 1024; +const SRC_OFFSET = 4294970000n; // 0x100000a90n +const SRC_OFFSET_LEB = [0x90, 0x95, 0x80, 0x80, 0x10]; +const DST_OFFSET = 4294970160n; +const DST_OFFSET_LEB = [0xb0, 0x96, 0x80, 0x80, 0x10]; + +var builder = new WasmModuleBuilder(); +builder.addMemory64(5 * GB / kPageSize).exportMemoryAs("memory"); + +// Here we make a global of type v128 to be the target +// for loading lanes and the source for storing lanes. +var g = builder.addGlobal( + kWasmS128, true, + [kSimdPrefix, kExprS128Const, + 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0]); + +for (let i = 0; i < 4; ++i) { + builder.addFunction(`load_lane_${i}`, kSig_v_l) + .addBody([kExprLocalGet, 0, + kExprGlobalGet, g.index, + kSimdPrefix, kExprS128Load32Lane, 0, 0, i, + kExprGlobalSet, g.index]) + .exportFunc(); + + builder.addFunction(`store_lane_${i}`, kSig_v_l) + .addBody([kExprLocalGet, 0, + kExprGlobalGet, g.index, + kSimdPrefix, kExprS128Store32Lane, 0, 0, i]) + .exportFunc(); + + builder.addFunction(`Load_Lane_${i}`, kSig_v_l) + .addBody([kExprLocalGet, 0, + kExprGlobalGet, g.index, + kSimdPrefix, kExprS128Load32Lane, 0, ...SRC_OFFSET_LEB, i, + kExprGlobalSet, g.index]) + .exportFunc(); + + builder.addFunction(`Store_Lane_${i}`, kSig_v_l) + .addBody([kExprLocalGet, 0, + kExprGlobalGet, g.index, + kSimdPrefix, kExprS128Store32Lane, 0, ...DST_OFFSET_LEB, i]) + .exportFunc(); +} + +(function TestLoadStoreLaneExternalOffset(){ + print(arguments.callee.name); + + var instance = builder.instantiate({}); + var buffer = instance.exports.memory.buffer; + + var src_view = new Uint32Array(buffer, Number(SRC_OFFSET), 4); + var dst_view = new Uint32Array(buffer, Number(DST_OFFSET), 4); + var values = [ 0x01234567, 0x89abcdef, 0x76543210, 0xfedcba98 ]; + var expected_values = [ 0, 0, 0, 0 ]; + src_view.set(values, 0); + + for (let i = 0n; i < 4n; ++i) { + expected_values[i] = values[i]; + const offset = 4n * i; + instance.exports[`load_lane_${i}`](SRC_OFFSET + offset); + instance.exports[`store_lane_${i}`](DST_OFFSET + offset); + assertEquals(expected_values, Array.from(dst_view.values())); + } +})(); + +(function TestLoadStoreLaneInternalOffset(){ + print(arguments.callee.name); + + var instance = builder.instantiate({}); + var buffer = instance.exports.memory.buffer; + + var src_view = new Uint32Array(buffer, Number(SRC_OFFSET), 4); + var dst_view = new Uint32Array(buffer, Number(DST_OFFSET), 4); + var values = [ 0x01234567, 0x89abcdef, 0x76543210, 0xfedcba98 ]; + var expected_values = [ 0, 0, 0, 0 ]; + src_view.set(values, 0); + + for (let i = 0n; i < 4n; ++i) { + expected_values[i] = values[i]; + const offset = 4n * i; + instance.exports[`Load_Lane_${i}`](offset); + instance.exports[`Store_Lane_${i}`](offset); + assertEquals(expected_values, Array.from(dst_view.values())); + } +})(); |