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