| // 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. |
| |
| load('test/mjsunit/wasm/wasm-module-builder.js'); |
| |
| let types = [kWasmI32, kWasmF32, kWasmF64]; |
| let type_names = ["i32", "f32", "f64"]; |
| let type_const = [wasmI32Const, wasmF32Const, wasmF64Const]; |
| |
| function f(values, shift, num_const_params, ...args) { |
| assertEquals( |
| values.length + num_const_params, args.length, 'number of arguments'); |
| const expected = idx => |
| idx < values.length ? values[(idx + shift) % values.length] : idx; |
| const msg = 'shifted by ' + shift + ': ' + |
| 'expected [' + args.map((_, i) => expected(i)).join(', ') + '], got [' + |
| args.join(', ') + ']'; |
| args.forEach((arg_val, idx) => { |
| assertEquals(expected(idx), arg_val, 'arg #' + idx + ', ' + msg); |
| }); |
| } |
| |
| types.forEach((type, type_idx) => { |
| for (let num_params = 3; num_params < 32; num_params += 4) { |
| print( |
| 'Testing ' + num_params + ' parameters of type ' + |
| type_names[type_idx] + '...'); |
| for (let num_const_params = 0; num_const_params <= 3; ++num_const_params) { |
| for (let shift = 2; shift <= 5; shift += 3) { |
| let builder = new WasmModuleBuilder(); |
| |
| let params_outer = new Array(num_params).fill(type); |
| sig_outer = makeSig(params_outer, []); |
| let params_inner = new Array(num_params + num_const_params).fill(type); |
| sig_inner = makeSig(params_inner, []); |
| |
| let body = []; |
| for (let i = 0; i < num_params; ++i) |
| body.push(kExprLocalGet, (i + shift) % num_params); |
| for (let i = 0; i < num_const_params; ++i) |
| body.push(...type_const[type_idx](num_params + i)); |
| body.push(kExprCallFunction, 0); |
| |
| builder.addImport('', 'f', sig_inner); |
| builder.addFunction(undefined, sig_outer) |
| .addBody(body) |
| .exportAs('main'); |
| let values = new Array(num_params).fill(0).map((_, i) => 123 - 3 * i); |
| |
| instance = builder.instantiate( |
| {'': {'f': f.bind(null, values, shift, num_const_params)}}); |
| instance.exports.main(...values); |
| } |
| } |
| } |
| }); |