OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --harmony-simd --harmony-tostring --harmony-reflect | 5 // Flags: --harmony-simd --harmony-tostring --harmony-reflect |
6 // Flags: --allow-natives-syntax --expose-natives-as natives --noalways-opt | 6 // Flags: --allow-natives-syntax --expose-natives-as natives --noalways-opt |
7 | 7 |
8 function lanesForType(typeName) { | 8 function lanesForType(typeName) { |
9 // The lane count follows the first 'x' in the type name, which begins with | 9 // The lane count follows the first 'x' in the type name, which begins with |
10 // 'float', 'int', or 'bool'. | 10 // 'float', 'int', or 'bool'. |
11 return Number.parseInt(typeName[typeName.indexOf('x') + 1]); | 11 return Number.parseInt(typeName[typeName.indexOf('x') + 1]); |
12 } | 12 } |
13 | 13 |
14 | 14 |
15 function isValidSimdString(string, value, type, lanes) { | 15 function isValidSimdString(string, value, type, lanes) { |
16 var simdFn = SIMD[type], | 16 var simdFn = SIMD[type], |
17 parseFn = | 17 parseFn = |
18 type.indexOf('float') === 0 ? Number.parseFloat : Number.parseInt, | 18 type.indexOf('Float') === 0 ? Number.parseFloat : Number.parseInt, |
19 indexOfOpenParen = string.indexOf('('); | 19 indexOfOpenParen = string.indexOf('('); |
20 // Check prefix for correct type name. | 20 // Check prefix (e.g. SIMD.Float32x4.) |
21 if (string.substr(0, indexOfOpenParen).toUpperCase() !== type.toUpperCase()) | 21 if (string.substr(0, indexOfOpenParen) !== 'SIMD.' + type) |
22 return false; | 22 return false; |
23 // Remove type name and open parenthesis. | 23 // Remove type name (e.g. SIMD.Float32x4) and open parenthesis. |
24 string = string.substr(indexOfOpenParen + 1); | 24 string = string.substr(indexOfOpenParen + 1); |
25 var laneStrings = string.split(','); | 25 var laneStrings = string.split(','); |
26 if (laneStrings.length !== lanes) | 26 if (laneStrings.length !== lanes) |
27 return false; | 27 return false; |
28 for (var i = 0; i < lanes; i++) { | 28 for (var i = 0; i < lanes; i++) { |
29 var fromString = parseFn(laneStrings[i]), | 29 var fromString = parseFn(laneStrings[i]), |
30 fromValue = simdFn.extractLane(value, i); | 30 fromValue = simdFn.extractLane(value, i); |
31 if (Math.abs(fromString - fromValue) > Number.EPSILON) | 31 if (Math.abs(fromString - fromValue) > Number.EPSILON) |
32 return false; | 32 return false; |
33 } | 33 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 function TestConstructor(type, lanes) { | 83 function TestConstructor(type, lanes) { |
84 var simdFn = SIMD[type]; | 84 var simdFn = SIMD[type]; |
85 assertFalse(Object === simdFn.prototype.constructor) | 85 assertFalse(Object === simdFn.prototype.constructor) |
86 assertFalse(simdFn === Object.prototype.constructor) | 86 assertFalse(simdFn === Object.prototype.constructor) |
87 assertSame(simdFn, simdFn.prototype.constructor) | 87 assertSame(simdFn, simdFn.prototype.constructor) |
88 | 88 |
89 values = [] | 89 values = [] |
90 | 90 |
91 // The constructor expects values for all lanes. | 91 // The constructor expects values for all lanes. |
92 switch (type) { | 92 switch (type) { |
93 case 'float32x4': | 93 case 'Float32x4': |
94 // The constructor expects values for all lanes. | 94 // The constructor expects values for all lanes. |
95 assertThrows(function () { simdFn() }, TypeError) | 95 assertThrows(function () { simdFn() }, TypeError) |
96 assertThrows(function () { simdFn(0) }, TypeError) | 96 assertThrows(function () { simdFn(0) }, TypeError) |
97 assertThrows(function () { simdFn(0, 1) }, TypeError) | 97 assertThrows(function () { simdFn(0, 1) }, TypeError) |
98 assertThrows(function () { simdFn(0, 1, 2) }, TypeError) | 98 assertThrows(function () { simdFn(0, 1, 2) }, TypeError) |
99 | 99 |
100 values.push(simdFn(1, 2, 3, 4)) | 100 values.push(simdFn(1, 2, 3, 4)) |
101 values.push(simdFn(1, 2, 3, 4)) // test structural equivalence | 101 values.push(simdFn(1, 2, 3, 4)) // test structural equivalence |
102 values.push(simdFn(-0, NaN, 0, 0.5)) | 102 values.push(simdFn(-0, NaN, 0, 0.5)) |
103 values.push(simdFn(-0, NaN, 0, 0.5)) // test structural equivalence | 103 values.push(simdFn(-0, NaN, 0, 0.5)) // test structural equivalence |
104 values.push(simdFn(3, 2, 1, 0)) | 104 values.push(simdFn(3, 2, 1, 0)) |
105 values.push(simdFn(0, 0, 0, 0)) | 105 values.push(simdFn(0, 0, 0, 0)) |
106 break | 106 break |
107 } | 107 } |
108 for (var i in values) { | 108 for (var i in values) { |
109 assertSame(simdFn, values[i].__proto__.constructor) | 109 assertSame(simdFn, values[i].__proto__.constructor) |
110 assertSame(simdFn, Object(values[i]).__proto__.constructor) | 110 assertSame(simdFn, Object(values[i]).__proto__.constructor) |
111 assertSame(simdFn.prototype, values[i].__proto__) | 111 assertSame(simdFn.prototype, values[i].__proto__) |
112 assertSame(simdFn.prototype, Object(values[i]).__proto__) | 112 assertSame(simdFn.prototype, Object(values[i]).__proto__) |
113 } | 113 } |
114 } | 114 } |
115 | 115 |
116 | 116 |
117 function TestType(type, lanes) { | 117 function TestType(type, lanes) { |
| 118 var typeofString = type.charAt(0).toLowerCase() + type.slice(1); |
118 for (var i in values) { | 119 for (var i in values) { |
119 assertEquals(type, typeof values[i]) | 120 assertEquals(typeofString, typeof values[i]) |
120 assertTrue(typeof values[i] === type) | 121 assertTrue(typeof values[i] === typeofString) |
121 assertTrue(typeof Object(values[i]) === 'object') | 122 assertTrue(typeof Object(values[i]) === 'object') |
122 assertEquals(null, %_ClassOf(values[i])) | 123 assertEquals(null, %_ClassOf(values[i])) |
123 assertEquals("Float32x4", %_ClassOf(Object(values[i]))) | 124 assertEquals(type, %_ClassOf(Object(values[i]))) |
124 } | 125 } |
125 } | 126 } |
126 | 127 |
127 | 128 |
128 function TestPrototype(type, lanes) { | 129 function TestPrototype(type, lanes) { |
129 var simdFn = SIMD[type]; | 130 var simdFn = SIMD[type]; |
130 assertSame(Object.prototype, simdFn.prototype.__proto__) | 131 assertSame(Object.prototype, simdFn.prototype.__proto__) |
131 for (var i in values) { | 132 for (var i in values) { |
132 assertSame(simdFn.prototype, values[i].__proto__) | 133 assertSame(simdFn.prototype, values[i].__proto__) |
133 assertSame(simdFn.prototype, Object(values[i]).__proto__) | 134 assertSame(simdFn.prototype, Object(values[i]).__proto__) |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 assertFalse(others[j] == values[i]) | 239 assertFalse(others[j] == values[i]) |
239 } | 240 } |
240 } | 241 } |
241 } | 242 } |
242 | 243 |
243 | 244 |
244 function TestSameValue(type, lanes) { | 245 function TestSameValue(type, lanes) { |
245 // SIMD value types. | 246 // SIMD value types. |
246 // All lanes checked. | 247 // All lanes checked. |
247 // TODO(bbudge): use loops to test lanes when replaceLane is defined. | 248 // TODO(bbudge): use loops to test lanes when replaceLane is defined. |
248 assertTrue(sameValueBoth(SIMD.float32x4(1, 2, 3, 4), | 249 assertTrue(sameValueBoth(SIMD.Float32x4(1, 2, 3, 4), |
249 SIMD.float32x4(1, 2, 3, 4))); | 250 SIMD.Float32x4(1, 2, 3, 4))); |
250 assertFalse(sameValueBoth(SIMD.float32x4(1, 2, 3, 4), | 251 assertFalse(sameValueBoth(SIMD.Float32x4(1, 2, 3, 4), |
251 SIMD.float32x4(NaN, 2, 3, 4))); | 252 SIMD.Float32x4(NaN, 2, 3, 4))); |
252 assertFalse(sameValueBoth(SIMD.float32x4(1, 2, 3, 4), | 253 assertFalse(sameValueBoth(SIMD.Float32x4(1, 2, 3, 4), |
253 SIMD.float32x4(1, NaN, 3, 4))); | 254 SIMD.Float32x4(1, NaN, 3, 4))); |
254 assertFalse(sameValueBoth(SIMD.float32x4(1, 2, 3, 4), | 255 assertFalse(sameValueBoth(SIMD.Float32x4(1, 2, 3, 4), |
255 SIMD.float32x4(1, 2, NaN, 4))); | 256 SIMD.Float32x4(1, 2, NaN, 4))); |
256 assertFalse(sameValueBoth(SIMD.float32x4(1, 2, 3, 4), | 257 assertFalse(sameValueBoth(SIMD.Float32x4(1, 2, 3, 4), |
257 SIMD.float32x4(1, 2, 3, NaN))); | 258 SIMD.Float32x4(1, 2, 3, NaN))); |
258 // Special values. | 259 // Special values. |
259 // TODO(bbudge): use loops to test lanes when replaceLane is defined. | 260 // TODO(bbudge): use loops to test lanes when replaceLane is defined. |
260 assertTrue(sameValueBoth(SIMD.float32x4(NaN, 2, 3, 4), | 261 assertTrue(sameValueBoth(SIMD.Float32x4(NaN, 2, 3, 4), |
261 SIMD.float32x4(NaN, 2, 3, 4))); | 262 SIMD.Float32x4(NaN, 2, 3, 4))); |
262 assertTrue(sameValueBoth(SIMD.float32x4(+0, 2, 3, 4), | 263 assertTrue(sameValueBoth(SIMD.Float32x4(+0, 2, 3, 4), |
263 SIMD.float32x4(+0, 2, 3, 4))); | 264 SIMD.Float32x4(+0, 2, 3, 4))); |
264 assertTrue(sameValueBoth(SIMD.float32x4(-0, 2, 3, 4), | 265 assertTrue(sameValueBoth(SIMD.Float32x4(-0, 2, 3, 4), |
265 SIMD.float32x4(-0, 2, 3, 4))); | 266 SIMD.Float32x4(-0, 2, 3, 4))); |
266 assertTrue(sameValueZeroOnly(SIMD.float32x4(+0, 2, 3, 4), | 267 assertTrue(sameValueZeroOnly(SIMD.Float32x4(+0, 2, 3, 4), |
267 SIMD.float32x4(-0, 2, 3, 4))); | 268 SIMD.Float32x4(-0, 2, 3, 4))); |
268 assertTrue(sameValueZeroOnly(SIMD.float32x4(-0, 2, 3, 4), | 269 assertTrue(sameValueZeroOnly(SIMD.Float32x4(-0, 2, 3, 4), |
269 SIMD.float32x4(+0, 2, 3, 4))); | 270 SIMD.Float32x4(+0, 2, 3, 4))); |
270 } | 271 } |
271 | 272 |
272 | 273 |
273 function TestComparison(type, lanes) { | 274 function TestComparison(type, lanes) { |
274 var a = values[0], b = values[1]; | 275 var a = values[0], b = values[1]; |
275 | 276 |
276 function lt() { a < b; } | 277 function lt() { a < b; } |
277 function gt() { a > b; } | 278 function gt() { a > b; } |
278 function le() { a <= b; } | 279 function le() { a <= b; } |
279 function ge() { a >= b; } | 280 function ge() { a >= b; } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 function() { Reflect.apply(values[i]); }, TypeError); | 376 function() { Reflect.apply(values[i]); }, TypeError); |
376 assertThrows( | 377 assertThrows( |
377 function() { Reflect.apply(noopStrict, R, values[i]); }, TypeError); | 378 function() { Reflect.apply(noopStrict, R, values[i]); }, TypeError); |
378 assertThrows( | 379 assertThrows( |
379 function() { Reflect.apply(noop, R, values[i]); }, TypeError); | 380 function() { Reflect.apply(noop, R, values[i]); }, TypeError); |
380 } | 381 } |
381 } | 382 } |
382 | 383 |
383 | 384 |
384 function TestSIMDTypes() { | 385 function TestSIMDTypes() { |
385 var types = [ 'float32x4' ]; | 386 var types = [ 'Float32x4' ]; |
386 for (var i = 0; i < types.length; ++i) { | 387 for (var i = 0; i < types.length; ++i) { |
387 var type = types[i], | 388 var type = types[i], |
388 lanes = lanesForType(type); | 389 lanes = lanesForType(type); |
389 TestConstructor(type, lanes); | 390 TestConstructor(type, lanes); |
390 TestType(type, lanes); | 391 TestType(type, lanes); |
391 TestPrototype(type, lanes); | 392 TestPrototype(type, lanes); |
392 TestValueOf(type, lanes); | 393 TestValueOf(type, lanes); |
393 TestGet(type, lanes); | 394 TestGet(type, lanes); |
394 TestToBoolean(type, lanes); | 395 TestToBoolean(type, lanes); |
395 TestToString(type, lanes); | 396 TestToString(type, lanes); |
396 TestToNumber(type, lanes); | 397 TestToNumber(type, lanes); |
397 TestEquality(type, lanes); | 398 TestEquality(type, lanes); |
398 TestSameValue(type, lanes); | 399 TestSameValue(type, lanes); |
399 TestComparison(type, lanes); | 400 TestComparison(type, lanes); |
400 TestCall(type, lanes); | 401 TestCall(type, lanes); |
401 TestAsSetKey(type, lanes, new Set); | 402 TestAsSetKey(type, lanes, new Set); |
402 TestAsSetKey(type, lanes, new WeakSet); | 403 TestAsSetKey(type, lanes, new WeakSet); |
403 TestAsMapKey(type, lanes, new Map); | 404 TestAsMapKey(type, lanes, new Map); |
404 TestAsMapKey(type, lanes, new WeakMap); | 405 TestAsMapKey(type, lanes, new WeakMap); |
405 TestReflectApply(type); | 406 TestReflectApply(type); |
406 } | 407 } |
407 } | 408 } |
408 TestSIMDTypes(); | 409 TestSIMDTypes(); |
OLD | NEW |