blob: 39164c7763e3dd9e5284dd9c9fa7689840f7f979 [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// 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 sig = new Array();
Ben Murdochc5610432016-08-08 18:44:38 +010030 sig.push(args);
Ben Murdochda12d292016-06-02 14:46:10 +010031 for (var i = 0; i < args; i++) sig.push(type);
Ben Murdochc5610432016-08-08 18:44:38 +010032 sig.push(1);
33 sig.push(type);
Ben Murdochda12d292016-06-02 14:46:10 +010034 builder.addFunction("select", sig)
35 .addBody([kExprGetLocal, which])
36 .exportFunc();
37
38 return builder.instantiate().exports.select;
39}
40
41const inputs = [
42 -1, 0, 2.2, 3.3, 3000.11, Infinity, -Infinity, NaN
43];
44
45(function TestInt1() {
46 print("i32 1(0)...");
47 var C = function(v) { return v | 0; }
48 var select1 = makeSelect(kAstI32, 1, 0);
49
50 for (val of inputs) {
51 assertEquals(C(val), select1(val));
52
53 // under args
54 assertEquals(C(undefined), select1());
55 // over args
56 assertEquals(C(val), select1(val, WRONG1));
57 assertEquals(C(val), select1(val, WRONG1, WRONG2));
58 }
59})();
60
61(function TestInt2() {
62 print("i32 2(0)...");
63 var C = function(v) { return v | 0; }
64 var select = makeSelect(kAstI32, 2, 0);
65
66 for (val of inputs) {
67 assertEquals(C(val), select(val, WRONG1));
68
69 // under args
70 assertEquals(C(undefined), select());
71 assertEquals(C(val), select(val));
72 // over args
73 assertEquals(C(val), select(val, WRONG1, WRONG2));
74 assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
75 }
76
77 print("i32 2(1)...");
78 var select = makeSelect(kAstI32, 2, 1);
79
80 for (val of inputs) {
81 assertEquals(C(val), select(WRONG1, val));
82
83 // under args
84 assertEquals(C(undefined), select());
85 assertEquals(C(undefined), select(val));
86 // over args
87 assertEquals(C(val), select(WRONG1, val));
88 assertEquals(C(val), select(WRONG1, val, WRONG2));
89 assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
90 }
91})();
92
93(function TestInt3() {
94 print("i32 3(0)...");
95 var C = function(v) { return v | 0; }
96 var select = makeSelect(kAstI32, 3, 0);
97
98 for (val of inputs) {
99 assertEquals(C(val), select(val, WRONG1, WRONG2));
100
101 // under args
102 assertEquals(C(undefined), select());
103 assertEquals(C(val), select(val));
104 assertEquals(C(val), select(val, WRONG1));
105 // over args
106 assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
107 }
108
109 print("i32 3(1)...");
110 var select = makeSelect(kAstI32, 3, 1);
111
112 for (val of inputs) {
113 assertEquals(val | 0, select(WRONG1, val, WRONG2));
114
115 // under args
116 assertEquals(C(undefined), select());
117 assertEquals(C(undefined), select(0xDEDFACE));
118 assertEquals(C(val), select(WRONG1, val));
119 // over args
120 assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
121 }
122
123 print("i32 3(2)...");
124 var select = makeSelect(kAstI32, 3, 2);
125
126 for (val of inputs) {
127 assertEquals(C(val), select(WRONG1, WRONG2, val));
128
129 // under args
130 assertEquals(C(undefined), select());
131 assertEquals(C(undefined), select(0xDEDFACE));
132 assertEquals(C(undefined), select(WRONG1, WRONG2));
133 // over args
134 assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
135 }
136})();
137
138(function TestFloat32_1() {
139 print("f32 1(0)...");
140 var C = function(v) { return Math.fround(v); }
141 var select1 = makeSelect(kAstF32, 1, 0);
142
143 for (val of inputs) {
144 assertEquals(C(val), select1(val));
145
146 // under args
147 assertEquals(C(undefined), select1());
148 // over args
149 assertEquals(C(val), select1(val, WRONG1));
150 assertEquals(C(val), select1(val, WRONG1, WRONG2));
151 }
152})();
153
154(function TestFloat32_2() {
155 print("f32 2(0)...");
156 var C = function(v) { return Math.fround(v); }
157 var select = makeSelect(kAstF32, 2, 0);
158
159 for (val of inputs) {
160 assertEquals(C(val), select(val, WRONG1));
161
162 // under args
163 assertEquals(C(undefined), select());
164 assertEquals(C(val), select(val));
165 // over args
166 assertEquals(C(val), select(val, WRONG1, WRONG2));
167 assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
168 }
169
170 print("f32 2(1)...");
171 var select = makeSelect(kAstF32, 2, 1);
172
173 for (val of inputs) {
174 assertEquals(C(val), select(WRONG1, val));
175
176 // under args
177 assertEquals(C(undefined), select());
178 assertEquals(C(undefined), select(val));
179 // over args
180 assertEquals(C(val), select(WRONG1, val));
181 assertEquals(C(val), select(WRONG1, val, WRONG2));
182 assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
183 }
184})();
185
186(function TestFloat32_2() {
187 print("f32 3(0)...");
188 var C = function(v) { return Math.fround(v); }
189 var select = makeSelect(kAstF32, 3, 0);
190
191 for (val of inputs) {
192 assertEquals(C(val), select(val, WRONG1, WRONG2));
193
194 // under args
195 assertEquals(C(undefined), select());
196 assertEquals(C(val), select(val));
197 assertEquals(C(val), select(val, WRONG1));
198 // over args
199 assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
200 }
201
202 print("f32 3(1)...");
203 var select = makeSelect(kAstF32, 3, 1);
204
205 for (val of inputs) {
206 assertEquals(C(val), select(WRONG1, val, WRONG2));
207
208 // under args
209 assertEquals(C(undefined), select());
210 assertEquals(C(undefined), select(0xDEDFACE));
211 assertEquals(C(val), select(WRONG1, val));
212 // over args
213 assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
214 }
215
216 print("f32 3(2)...");
217 var select = makeSelect(kAstF32, 3, 2);
218
219 for (val of inputs) {
220 assertEquals(C(val), select(WRONG1, WRONG2, val));
221
222 // under args
223 assertEquals(C(undefined), select());
224 assertEquals(C(undefined), select(0xDEDFACE));
225 assertEquals(C(undefined), select(WRONG1, WRONG2));
226 // over args
227 assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
228 }
229})();
230
231
232(function TestFloat64_1() {
233 print("f64 1(0)...");
234 var C = function(v) { return +v; }
235 var select1 = makeSelect(kAstF64, 1, 0);
236
237 for (val of inputs) {
238 assertEquals(C(val), select1(val));
239
240 // under args
241 assertEquals(C(undefined), select1());
242 // over args
243 assertEquals(C(val), select1(val, WRONG1));
244 assertEquals(C(val), select1(val, WRONG1, WRONG2));
245 }
246})();
247
248(function TestFloat64_2() {
249 print("f64 2(0)...");
250 var C = function(v) { return +v; }
251 var select = makeSelect(kAstF64, 2, 0);
252
253 for (val of inputs) {
254 assertEquals(C(val), select(val, WRONG1));
255
256 // under args
257 assertEquals(C(undefined), select());
258 assertEquals(C(val), select(val));
259 // over args
260 assertEquals(C(val), select(val, WRONG1, WRONG2));
261 assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
262 }
263
264 print("f64 2(1)...");
265 var select = makeSelect(kAstF64, 2, 1);
266
267 for (val of inputs) {
268 assertEquals(C(val), select(WRONG1, val));
269
270 // under args
271 assertEquals(C(undefined), select());
272 assertEquals(C(undefined), select(val));
273 // over args
274 assertEquals(C(val), select(WRONG1, val));
275 assertEquals(C(val), select(WRONG1, val, WRONG2));
276 assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
277 }
278})();
279
280(function TestFloat64_2() {
281 print("f64 3(0)...");
282 var C = function(v) { return +v; }
283 var select = makeSelect(kAstF64, 3, 0);
284
285 for (val of inputs) {
286 assertEquals(C(val), select(val, WRONG1, WRONG2));
287
288 // under args
289 assertEquals(C(undefined), select());
290 assertEquals(C(val), select(val));
291 assertEquals(C(val), select(val, WRONG1));
292 // over args
293 assertEquals(C(val), select(val, WRONG1, WRONG2, WRONG3));
294 }
295
296 print("f64 3(1)...");
297 var select = makeSelect(kAstF64, 3, 1);
298
299 for (val of inputs) {
300 assertEquals(C(val), select(WRONG1, val, WRONG2));
301
302 // under args
303 assertEquals(C(undefined), select());
304 assertEquals(C(undefined), select(0xDEDFACE));
305 assertEquals(C(val), select(WRONG1, val));
306 // over args
307 assertEquals(C(val), select(WRONG1, val, WRONG2, WRONG3));
308 }
309
310 print("f64 3(2)...");
311 var select = makeSelect(kAstF64, 3, 2);
312
313 for (val of inputs) {
314 assertEquals(C(val), select(WRONG1, WRONG2, val));
315
316 // under args
317 assertEquals(C(undefined), select());
318 assertEquals(C(undefined), select(0xDEDFACE));
319 assertEquals(C(undefined), select(WRONG1, WRONG2));
320 // over args
321 assertEquals(C(val), select(WRONG1, WRONG2, val, WRONG3));
322 }
323})();