2016-03-24 13:23:54 +00:00
|
|
|
// Copyright 2015 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: --expose-wasm
|
|
|
|
|
|
|
|
load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
|
|
|
|
|
const JS = false; // for testing the tests.
|
|
|
|
const WRONG1 = 0x0DEDFACE;
|
|
|
|
const WRONG2 = 0x0DEDBABE;
|
|
|
|
const WRONG3 = 0x0DEDD011
|
|
|
|
|
|
|
|
function makeSelect(type, args, which) {
|
|
|
|
if (JS) {
|
|
|
|
// For testing the tests.
|
|
|
|
return function() {
|
|
|
|
var val = +arguments[which];
|
|
|
|
print(" " + val);
|
2016-12-21 13:43:00 +00:00
|
|
|
if (type == kWasmI32) return val | 0;
|
|
|
|
if (type == kWasmF32) return Math.fround(val);
|
|
|
|
if (type == kWasmF64) return val;
|
2016-03-24 13:23:54 +00:00
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var builder = new WasmModuleBuilder();
|
2016-06-21 19:47:51 +00:00
|
|
|
var params = [];
|
|
|
|
for (var i = 0; i < args; i++) params.push(type);
|
|
|
|
builder.addFunction("select", makeSig(params, [type]))
|
2016-03-24 13:23:54 +00:00
|
|
|
.addBody([kExprGetLocal, which])
|
|
|
|
.exportFunc();
|
|
|
|
|
|
|
|
return builder.instantiate().exports.select;
|
|
|
|
}
|
|
|
|
|
|
|
|
const inputs = [
|
|
|
|
-1, 0, 2.2, 3.3, 3000.11, Infinity, -Infinity, NaN
|
|
|
|
];
|
|
|
|
|
|
|
|
(function TestInt1() {
|
|
|
|
print("i32 1(0)...");
|
|
|
|
var C = function(v) { return v | 0; }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select1 = makeSelect(kWasmI32, 1, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select1(val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select1());
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select1(val, WRONG1));
|
|
|
|
assertEquals(C(val), select1(val, WRONG1, WRONG2));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
(function TestInt2() {
|
|
|
|
print("i32 2(0)...");
|
|
|
|
var C = function(v) { return v | 0; }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmI32, 2, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(val, WRONG1));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(val), select(val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2));
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("i32 2(1)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmI32, 2, 1);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2));
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
(function TestInt3() {
|
|
|
|
print("i32 3(0)...");
|
|
|
|
var C = function(v) { return v | 0; }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmI32, 3, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(val), select(val));
|
|
|
|
assertEquals(C(val), select(val, WRONG1));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("i32 3(1)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmI32, 3, 1);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(val | 0, select(WRONG1, val, WRONG2));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(0xDEDFACE));
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("i32 3(2)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmI32, 3, 2);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, WRONG2, val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(0xDEDFACE));
|
|
|
|
assertEquals(C(undefined), select(WRONG1, WRONG2));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
(function TestFloat32_1() {
|
|
|
|
print("f32 1(0)...");
|
|
|
|
var C = function(v) { return Math.fround(v); }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select1 = makeSelect(kWasmF32, 1, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select1(val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select1());
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select1(val, WRONG1));
|
|
|
|
assertEquals(C(val), select1(val, WRONG1, WRONG2));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
(function TestFloat32_2() {
|
|
|
|
print("f32 2(0)...");
|
|
|
|
var C = function(v) { return Math.fround(v); }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF32, 2, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(val, WRONG1));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(val), select(val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2));
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("f32 2(1)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF32, 2, 1);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2));
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
(function TestFloat32_2() {
|
|
|
|
print("f32 3(0)...");
|
|
|
|
var C = function(v) { return Math.fround(v); }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF32, 3, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(val), select(val));
|
|
|
|
assertEquals(C(val), select(val, WRONG1));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("f32 3(1)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF32, 3, 1);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(0xDEDFACE));
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("f32 3(2)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF32, 3, 2);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, WRONG2, val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(0xDEDFACE));
|
|
|
|
assertEquals(C(undefined), select(WRONG1, WRONG2));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function TestFloat64_1() {
|
|
|
|
print("f64 1(0)...");
|
|
|
|
var C = function(v) { return +v; }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select1 = makeSelect(kWasmF64, 1, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select1(val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select1());
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select1(val, WRONG1));
|
|
|
|
assertEquals(C(val), select1(val, WRONG1, WRONG2));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
(function TestFloat64_2() {
|
|
|
|
print("f64 2(0)...");
|
|
|
|
var C = function(v) { return +v; }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF64, 2, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(val, WRONG1));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(val), select(val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2));
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("f64 2(1)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF64, 2, 1);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2));
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
|
|
|
(function TestFloat64_2() {
|
|
|
|
print("f64 3(0)...");
|
|
|
|
var C = function(v) { return +v; }
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF64, 3, 0);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(val), select(val));
|
|
|
|
assertEquals(C(val), select(val, WRONG1));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("f64 3(1)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF64, 3, 1);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(0xDEDFACE));
|
|
|
|
assertEquals(C(val), select(WRONG1, val));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
|
|
|
|
}
|
|
|
|
|
|
|
|
print("f64 3(2)...");
|
2016-12-21 13:43:00 +00:00
|
|
|
var select = makeSelect(kWasmF64, 3, 2);
|
2016-03-24 13:23:54 +00:00
|
|
|
|
|
|
|
for (val of inputs) {
|
|
|
|
assertEquals(C(val), select(WRONG1, WRONG2, val));
|
|
|
|
|
|
|
|
// under args
|
|
|
|
assertEquals(C(undefined), select());
|
|
|
|
assertEquals(C(undefined), select(0xDEDFACE));
|
|
|
|
assertEquals(C(undefined), select(WRONG1, WRONG2));
|
|
|
|
// over args
|
|
|
|
assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
|
|
|
|
}
|
|
|
|
})();
|