| // Copyright 2017 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-simd --experimental-wasm-mv |
| |
| load("test/mjsunit/wasm/wasm-module-builder.js"); |
| |
| (function MultiReturnS128Test() { |
| print("MultiReturnS128Test"); |
| // Most backends only support 2 fp return registers, so the third v128 |
| // onwards here will written to caller stack slot. |
| let builder = new WasmModuleBuilder(); |
| let sig_v_sssss = builder.addType( |
| makeSig([], [kWasmS128, kWasmS128, kWasmS128, kWasmS128, kWasmS128])); |
| let sig_iiiiiiiiii_v = builder.addType( |
| makeSig([], [kWasmI32, kWasmI32, kWasmI32, kWasmI32, kWasmI32, kWasmI32, |
| kWasmI32, kWasmI32, kWasmI32, kWasmI32] )); |
| |
| let callee = builder.addFunction("callee", sig_v_sssss) |
| .addBody([ |
| kExprI32Const, 0, |
| kSimdPrefix, kExprI32x4Splat, |
| kExprI32Const, 1, |
| kSimdPrefix, kExprI32x4Splat, |
| kExprI32Const, 2, |
| kSimdPrefix, kExprI32x4Splat, |
| kExprI32Const, 3, |
| kSimdPrefix, kExprI32x4Splat, |
| kExprI32Const, 4, |
| kSimdPrefix, kExprI32x4Splat, |
| kExprReturn]); |
| // For each v128 on the stack, we return the first and last lane. This help |
| // catch bugs with reading/writing the wrong stack slots. |
| builder.addFunction("main", sig_iiiiiiiiii_v) |
| .addLocals(kWasmI32, 10).addLocals(kWasmS128, 1) |
| .addBody([ |
| kExprCallFunction, callee.index, |
| |
| kExprLocalTee, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 0, |
| kExprLocalSet, 0, |
| kExprLocalGet, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 3, |
| kExprLocalSet, 1, |
| |
| kExprLocalTee, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 0, |
| kExprLocalSet, 2, |
| kExprLocalGet, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 3, |
| kExprLocalSet, 3, |
| |
| kExprLocalTee, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 0, |
| kExprLocalSet, 4, |
| kExprLocalGet, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 3, |
| kExprLocalSet, 5, |
| |
| kExprLocalTee, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 0, |
| kExprLocalSet, 6, |
| kExprLocalGet, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 3, |
| kExprLocalSet, 7, |
| |
| kExprLocalTee, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 0, |
| kExprLocalSet, 8, |
| kExprLocalGet, 10, |
| kSimdPrefix, kExprI32x4ExtractLane, 3, |
| kExprLocalSet, 9, |
| |
| // Return all the stored locals. |
| kExprLocalGet, 0, |
| kExprLocalGet, 1, |
| kExprLocalGet, 2, |
| kExprLocalGet, 3, |
| kExprLocalGet, 4, |
| kExprLocalGet, 5, |
| kExprLocalGet, 6, |
| kExprLocalGet, 7, |
| kExprLocalGet, 8, |
| kExprLocalGet, 9, |
| ]) |
| .exportAs("main"); |
| |
| let module = new WebAssembly.Module(builder.toBuffer()); |
| let instance = new WebAssembly.Instance(module); |
| assertEquals(instance.exports.main(), [4, 4, 3, 3, 2, 2, 1, 1, 0, 0]); |
| })(); |