1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --expose-wasm
6
7load("test/mjsunit/wasm/wasm-constants.js");
8load("test/mjsunit/wasm/wasm-module-builder.js");
9
10const JS = false;  // for testing the tests.
11const WRONG1 = 0x0DEDFACE;
12const WRONG2 = 0x0DEDBABE;
13const WRONG3 = 0x0DEDD011
14
15function makeSelect(type, args, which) {
16  if (JS) {
17    // For testing the tests.
18    return function() {
19      var val = +arguments[which];
20      print("  " + val);
21      if (type == kAstI32) return val | 0;
22      if (type == kAstF32) return Math.fround(val);
23      if (type == kAstF64) return val;
24      return undefined;
25    }
26  }
27
28  var builder = new WasmModuleBuilder();
29  var params = [];
30  for (var i = 0; i < args; i++) params.push(type);
31  builder.addFunction("select", makeSig(params, [type]))
32    .addBody([kExprGetLocal, which])
33    .exportFunc();
34
35  return builder.instantiate().exports.select;
36}
37
38const inputs = [
39  -1, 0, 2.2, 3.3, 3000.11, Infinity, -Infinity, NaN
40];
41
42(function TestInt1() {
43  print("i32 1(0)...");
44  var C = function(v) { return v | 0; }
45  var select1 = makeSelect(kAstI32, 1, 0);
46
47  for (val of inputs) {
48    assertEquals(C(val), select1(val));
49
50    // under args
51    assertEquals(C(undefined), select1());
52    // over args
53    assertEquals(C(val), select1(val, WRONG1));
54    assertEquals(C(val), select1(val, WRONG1, WRONG2));
55  }
56})();
57
58(function TestInt2() {
59  print("i32 2(0)...");
60  var C = function(v) { return v | 0; }
61  var select = makeSelect(kAstI32, 2, 0);
62
63  for (val of inputs) {
64    assertEquals(C(val), select(val, WRONG1));
65
66    // under args
67    assertEquals(C(undefined), select());
68    assertEquals(C(val), select(val));
69    // over args
70    assertEquals(C(val), select(val, WRONG1, WRONG2));
71    assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
72  }
73
74  print("i32 2(1)...");
75  var select = makeSelect(kAstI32, 2, 1);
76
77  for (val of inputs) {
78    assertEquals(C(val), select(WRONG1, val));
79
80    // under args
81    assertEquals(C(undefined), select());
82    assertEquals(C(undefined), select(val));
83    // over args
84    assertEquals(C(val), select(WRONG1, val));
85    assertEquals(C(val), select(WRONG1, val, WRONG2));
86    assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
87  }
88})();
89
90(function TestInt3() {
91  print("i32 3(0)...");
92  var C = function(v) { return v | 0; }
93  var select = makeSelect(kAstI32, 3, 0);
94
95  for (val of inputs) {
96    assertEquals(C(val), select(val, WRONG1, WRONG2));
97
98    // under args
99    assertEquals(C(undefined), select());
100    assertEquals(C(val), select(val));
101    assertEquals(C(val), select(val, WRONG1));
102    // over args
103    assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
104  }
105
106  print("i32 3(1)...");
107  var select = makeSelect(kAstI32, 3, 1);
108
109  for (val of inputs) {
110    assertEquals(val | 0, select(WRONG1, val, WRONG2));
111
112    // under args
113    assertEquals(C(undefined), select());
114    assertEquals(C(undefined), select(0xDEDFACE));
115    assertEquals(C(val), select(WRONG1, val));
116    // over args
117    assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
118  }
119
120  print("i32 3(2)...");
121  var select = makeSelect(kAstI32, 3, 2);
122
123  for (val of inputs) {
124    assertEquals(C(val), select(WRONG1, WRONG2, val));
125
126    // under args
127    assertEquals(C(undefined), select());
128    assertEquals(C(undefined), select(0xDEDFACE));
129    assertEquals(C(undefined), select(WRONG1, WRONG2));
130    // over args
131    assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
132  }
133})();
134
135(function TestFloat32_1() {
136  print("f32 1(0)...");
137  var C = function(v) { return Math.fround(v); }
138  var select1 = makeSelect(kAstF32, 1, 0);
139
140  for (val of inputs) {
141    assertEquals(C(val), select1(val));
142
143    // under args
144    assertEquals(C(undefined), select1());
145    // over args
146    assertEquals(C(val), select1(val, WRONG1));
147    assertEquals(C(val), select1(val, WRONG1, WRONG2));
148  }
149})();
150
151(function TestFloat32_2() {
152  print("f32 2(0)...");
153  var C = function(v) { return Math.fround(v); }
154  var select = makeSelect(kAstF32, 2, 0);
155
156  for (val of inputs) {
157    assertEquals(C(val), select(val, WRONG1));
158
159    // under args
160    assertEquals(C(undefined), select());
161    assertEquals(C(val), select(val));
162    // over args
163    assertEquals(C(val), select(val, WRONG1, WRONG2));
164    assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
165  }
166
167  print("f32 2(1)...");
168  var select = makeSelect(kAstF32, 2, 1);
169
170  for (val of inputs) {
171    assertEquals(C(val), select(WRONG1, val));
172
173    // under args
174    assertEquals(C(undefined), select());
175    assertEquals(C(undefined), select(val));
176    // over args
177    assertEquals(C(val), select(WRONG1, val));
178    assertEquals(C(val), select(WRONG1, val, WRONG2));
179    assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
180  }
181})();
182
183(function TestFloat32_2() {
184  print("f32 3(0)...");
185  var C = function(v) { return Math.fround(v); }
186  var select = makeSelect(kAstF32, 3, 0);
187
188  for (val of inputs) {
189    assertEquals(C(val), select(val, WRONG1, WRONG2));
190
191    // under args
192    assertEquals(C(undefined), select());
193    assertEquals(C(val), select(val));
194    assertEquals(C(val), select(val, WRONG1));
195    // over args
196    assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
197  }
198
199  print("f32 3(1)...");
200  var select = makeSelect(kAstF32, 3, 1);
201
202  for (val of inputs) {
203    assertEquals(C(val), select(WRONG1, val, WRONG2));
204
205    // under args
206    assertEquals(C(undefined), select());
207    assertEquals(C(undefined), select(0xDEDFACE));
208    assertEquals(C(val), select(WRONG1, val));
209    // over args
210    assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
211  }
212
213  print("f32 3(2)...");
214  var select = makeSelect(kAstF32, 3, 2);
215
216  for (val of inputs) {
217    assertEquals(C(val), select(WRONG1, WRONG2, val));
218
219    // under args
220    assertEquals(C(undefined), select());
221    assertEquals(C(undefined), select(0xDEDFACE));
222    assertEquals(C(undefined), select(WRONG1, WRONG2));
223    // over args
224    assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
225  }
226})();
227
228
229(function TestFloat64_1() {
230  print("f64 1(0)...");
231  var C = function(v) { return +v; }
232  var select1 = makeSelect(kAstF64, 1, 0);
233
234  for (val of inputs) {
235    assertEquals(C(val), select1(val));
236
237    // under args
238    assertEquals(C(undefined), select1());
239    // over args
240    assertEquals(C(val), select1(val, WRONG1));
241    assertEquals(C(val), select1(val, WRONG1, WRONG2));
242  }
243})();
244
245(function TestFloat64_2() {
246  print("f64 2(0)...");
247  var C = function(v) { return +v; }
248  var select = makeSelect(kAstF64, 2, 0);
249
250  for (val of inputs) {
251    assertEquals(C(val), select(val, WRONG1));
252
253    // under args
254    assertEquals(C(undefined), select());
255    assertEquals(C(val), select(val));
256    // over args
257    assertEquals(C(val), select(val, WRONG1, WRONG2));
258    assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
259  }
260
261  print("f64 2(1)...");
262  var select = makeSelect(kAstF64, 2, 1);
263
264  for (val of inputs) {
265    assertEquals(C(val), select(WRONG1, val));
266
267    // under args
268    assertEquals(C(undefined), select());
269    assertEquals(C(undefined), select(val));
270    // over args
271    assertEquals(C(val), select(WRONG1, val));
272    assertEquals(C(val), select(WRONG1, val, WRONG2));
273    assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
274  }
275})();
276
277(function TestFloat64_2() {
278  print("f64 3(0)...");
279  var C = function(v) { return +v; }
280  var select = makeSelect(kAstF64, 3, 0);
281
282  for (val of inputs) {
283    assertEquals(C(val), select(val, WRONG1, WRONG2));
284
285    // under args
286    assertEquals(C(undefined), select());
287    assertEquals(C(val), select(val));
288    assertEquals(C(val), select(val, WRONG1));
289    // over args
290    assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
291  }
292
293  print("f64 3(1)...");
294  var select = makeSelect(kAstF64, 3, 1);
295
296  for (val of inputs) {
297    assertEquals(C(val), select(WRONG1, val, WRONG2));
298
299    // under args
300    assertEquals(C(undefined), select());
301    assertEquals(C(undefined), select(0xDEDFACE));
302    assertEquals(C(val), select(WRONG1, val));
303    // over args
304    assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
305  }
306
307  print("f64 3(2)...");
308  var select = makeSelect(kAstF64, 3, 2);
309
310  for (val of inputs) {
311    assertEquals(C(val), select(WRONG1, WRONG2, val));
312
313    // under args
314    assertEquals(C(undefined), select());
315    assertEquals(C(undefined), select(0xDEDFACE));
316    assertEquals(C(undefined), select(WRONG1, WRONG2));
317    // over args
318    assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
319  }
320})();
321