blob: e595c3fb89e363626d90dc6dfe4339bec580d25f [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();
Ben Murdoch61f157c2016-09-16 13:49:30 +010029 var params = [];
30 for (var i = 0; i < args; i++) params.push(type);
31 builder.addFunction("select", makeSig(params, [type]))
Ben Murdochda12d292016-06-02 14:46:10 +010032 .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})();