1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 // Flags: --simd_object --allow-natives-syntax
30 function testConstructor() {
31 var u4 = SIMD.int32x4(1, 2, 3, 4);
32 assertEquals(1, u4.x);
33 assertEquals(2, u4.y);
34 assertEquals(3, u4.z);
35 assertEquals(4, u4.w);
40 function testZeroConstructor() {
41 var u4 = SIMD.int32x4.zero();
42 assertEquals(0, u4.x);
43 assertEquals(0, u4.y);
44 assertEquals(0, u4.z);
45 assertEquals(0, u4.w);
48 testZeroConstructor();
49 testZeroConstructor();
50 %OptimizeFunctionOnNextCall(testZeroConstructor);
51 testZeroConstructor();
53 function testBoolConstructor() {
54 var u4 = SIMD.int32x4.bool(true, false, true, false);
55 assertEquals(-1, u4.x);
56 assertEquals(0, u4.y);
57 assertEquals(-1, u4.z);
58 assertEquals(0, u4.w);
61 testBoolConstructor();
62 testBoolConstructor();
63 %OptimizeFunctionOnNextCall(testBoolConstructor);
64 testBoolConstructor();
66 function testSplatConstructor() {
67 var u4 = SIMD.int32x4.splat(4);
68 assertEquals(4, u4.x);
69 assertEquals(4, u4.y);
70 assertEquals(4, u4.z);
71 assertEquals(4, u4.w);
74 testSplatConstructor();
75 testSplatConstructor();
76 %OptimizeFunctionOnNextCall(testSplatConstructor);
77 testSplatConstructor();
79 function testTypeof() {
80 var u4 = SIMD.int32x4(1, 2, 3, 4);
81 assertEquals(typeof(u4), "object");
83 var new_u4 = new SIMD.int32x4(1, 2, 3, 4);
84 assertEquals(typeof(new_u4), "object");
85 assertEquals(typeof(new_u4.valueOf()), "object");
86 assertEquals(Object.prototype.toString.call(new_u4), "[object Object]");
91 function testSignMaskGetter() {
92 var a = SIMD.int32x4(0x80000000 - 0xFFFFFFFF - 1, 0x7000000, -1, 0x0);
93 assertEquals(0x5, a.signMask);
94 var b = SIMD.int32x4(0x0, 0x0, 0x0, 0x0);
95 assertEquals(0x0, b.signMask);
96 var c = SIMD.int32x4(-1, -1, -1, -1);
97 assertEquals(0xf, c.signMask);
100 testSignMaskGetter();
101 testSignMaskGetter();
102 %OptimizeFunctionOnNextCall(testSignMaskGetter);
103 testSignMaskGetter();
106 function testSIMDAnd() {
107 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
108 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
109 var n = SIMD.int32x4(0x55555555, 0x55555555, 0x55555555, 0x55555555);
110 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.x);
111 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.y);
112 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.z);
113 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.w);
114 assertEquals(0x55555555, n.x);
115 assertEquals(0x55555555, n.y);
116 assertEquals(0x55555555, n.z);
117 assertEquals(0x55555555, n.w);
118 assertEquals(true, n.flagX);
119 assertEquals(true, n.flagY);
120 assertEquals(true, n.flagZ);
121 assertEquals(true, n.flagW);
122 o = SIMD.int32x4.and(m,n); // and
123 assertEquals(0x0, o.x);
124 assertEquals(0x0, o.y);
125 assertEquals(0x0, o.z);
126 assertEquals(0x0, o.w);
127 assertEquals(false, o.flagX);
128 assertEquals(false, o.flagY);
129 assertEquals(false, o.flagZ);
130 assertEquals(false, o.flagW);
135 %OptimizeFunctionOnNextCall(testSIMDAnd);
138 function testSIMDOr() {
139 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
140 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
141 var n = SIMD.int32x4(0x55555555, 0x55555555, 0x55555555, 0x55555555);
142 var o = SIMD.int32x4.or(m,n); // or
143 assertEquals(-1, o.x);
144 assertEquals(-1, o.y);
145 assertEquals(-1, o.z);
146 assertEquals(-1, o.w);
147 assertEquals(true, o.flagX);
148 assertEquals(true, o.flagY);
149 assertEquals(true, o.flagZ);
150 assertEquals(true, o.flagW);
155 %OptimizeFunctionOnNextCall(testSIMDOr);
158 function testSIMDInt32x4Or() {
159 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
160 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
161 var n = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
162 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
163 var o = SIMD.int32x4.xor(m,n); // xor
164 assertEquals(0x0, o.x);
165 assertEquals(0x0, o.y);
166 assertEquals(0x0, o.z);
167 assertEquals(0x0, o.w);
168 assertEquals(false, o.flagX);
169 assertEquals(false, o.flagY);
170 assertEquals(false, o.flagZ);
171 assertEquals(false, o.flagW);
176 %OptimizeFunctionOnNextCall(testSIMDInt32x4Or);
179 function testSIMDNot() {
180 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
181 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
182 var n = SIMD.int32x4(0x55555555, 0x55555555, 0x55555555, 0x55555555);
183 m = SIMD.int32x4.not(m);
184 n = SIMD.int32x4.not(n);
185 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.x);
186 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.y);
187 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.z);
188 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.w);
189 assertEquals(0x55555555, m.x);
190 assertEquals(0x55555555, m.y);
191 assertEquals(0x55555555, m.z);
192 assertEquals(0x55555555, m.w);
197 %OptimizeFunctionOnNextCall(testSIMDNot);
200 function testSIMDNegu32() {
201 var m = SIMD.int32x4(-1, 1, -1, 1);
202 m = SIMD.int32x4.neg(m);
203 assertEquals(1, m.x);
204 assertEquals(-1, m.y);
205 assertEquals(1, m.z);
206 assertEquals(-1, m.w);
211 %OptimizeFunctionOnNextCall(testSIMDNegu32);
214 function testSIMDSelect() {
215 var m = SIMD.int32x4.bool(true, true, false, false);
216 var t = SIMD.float32x4(1.0, 2.0, 3.0, 4.0);
217 var f = SIMD.float32x4(5.0, 6.0, 7.0, 8.0);
218 var s = SIMD.int32x4.select(m, t, f);
219 assertEquals(1.0, s.x);
220 assertEquals(2.0, s.y);
221 assertEquals(7.0, s.z);
222 assertEquals(8.0, s.w);
227 %OptimizeFunctionOnNextCall(testSIMDSelect);
231 function testSIMDWithXu32() {
232 var a = SIMD.int32x4(1, 2, 3, 4);
233 var c = SIMD.int32x4.withX(a, 20);
234 assertEquals(20, c.x);
235 assertEquals(2, c.y);
236 assertEquals(3, c.z);
237 assertEquals(4, c.w);
242 %OptimizeFunctionOnNextCall(testSIMDWithXu32);
245 function testSIMDWithYu32() {
246 var a = SIMD.int32x4(1, 2, 3, 4);
247 var c = SIMD.int32x4.withY(a, 20);
248 assertEquals(1, c.x);
249 assertEquals(20, c.y);
250 assertEquals(3, c.z);
251 assertEquals(4, c.w);
256 %OptimizeFunctionOnNextCall(testSIMDWithYu32);
259 function testSIMDWithZu32() {
260 var a = SIMD.int32x4(1, 2, 3, 4);
261 var c = SIMD.int32x4.withZ(a, 20);
262 assertEquals(1, c.x);
263 assertEquals(2, c.y);
264 assertEquals(20, c.z);
265 assertEquals(4, c.w);
270 %OptimizeFunctionOnNextCall(testSIMDWithZu32);
273 function testSIMDWithWu32() {
274 var a = SIMD.int32x4(1, 2, 3, 4);
275 var c = SIMD.int32x4.withW(a, 20);
276 assertEquals(1, c.x);
277 assertEquals(2, c.y);
278 assertEquals(3, c.z);
279 assertEquals(20, c.w);
284 %OptimizeFunctionOnNextCall(testSIMDWithWu32);
287 function testSIMDWithFlagX() {
288 var a = SIMD.int32x4.bool(true, false, true, false);
291 var c = SIMD.int32x4.withFlagX(a, true);
292 assertEquals(true, c.flagX);
293 assertEquals(false, c.flagY);
294 assertEquals(true, c.flagZ);
295 assertEquals(false, c.flagW);
296 c = SIMD.int32x4.withFlagX(a, false);
297 assertEquals(false, c.flagX);
298 assertEquals(false, c.flagY);
299 assertEquals(true, c.flagZ);
300 assertEquals(false, c.flagW);
301 assertEquals(0x0, c.x);
302 assertEquals(0x0, c.y);
303 assertEquals(-1, c.z);
304 assertEquals(0x0, c.w);
307 c = SIMD.int32x4.withFlagX(a, 2);
308 assertEquals(true, c.flagX);
309 assertEquals(false, c.flagY);
310 assertEquals(true, c.flagZ);
311 assertEquals(false, c.flagW);
312 assertEquals(-1, c.x);
313 assertEquals(0x0, c.y);
314 assertEquals(-1, c.z);
315 assertEquals(0x0, c.w);
316 c = SIMD.int32x4.withFlagX(a, 0);
317 assertEquals(false, c.flagX);
318 assertEquals(false, c.flagY);
319 assertEquals(true, c.flagZ);
320 assertEquals(false, c.flagW);
321 assertEquals(0x0, c.x);
322 assertEquals(0x0, c.y);
323 assertEquals(-1, c.z);
324 assertEquals(0x0, c.w);
327 c = SIMD.int32x4.withFlagX(a, 'true');
328 assertEquals(true, c.flagX);
329 assertEquals(false, c.flagY);
330 assertEquals(true, c.flagZ);
331 assertEquals(false, c.flagW);
332 assertEquals(-1, c.x);
333 assertEquals(0x0, c.y);
334 assertEquals(-1, c.z);
335 assertEquals(0x0, c.w);
336 c = SIMD.int32x4.withFlagX(a, '');
337 assertEquals(false, c.flagX);
338 assertEquals(false, c.flagY);
339 assertEquals(true, c.flagZ);
340 assertEquals(false, c.flagW);
341 assertEquals(0x0, c.x);
342 assertEquals(0x0, c.y);
343 assertEquals(-1, c.z);
344 assertEquals(0x0, c.w);
347 c = SIMD.int32x4.withFlagX(a, 3.14);
348 assertEquals(true, c.flagX);
349 assertEquals(false, c.flagY);
350 assertEquals(true, c.flagZ);
351 assertEquals(false, c.flagW);
352 assertEquals(-1, c.x);
353 assertEquals(0x0, c.y);
354 assertEquals(-1, c.z);
355 assertEquals(0x0, c.w);
356 c = SIMD.int32x4.withFlagX(a, 0.0);
357 assertEquals(false, c.flagX);
358 assertEquals(false, c.flagY);
359 assertEquals(true, c.flagZ);
360 assertEquals(false, c.flagW);
361 assertEquals(0x0, c.x);
362 assertEquals(0x0, c.y);
363 assertEquals(-1, c.z);
364 assertEquals(0x0, c.w);
368 c = SIMD.int32x4.withFlagX(a, array);
369 assertEquals(true, c.flagX);
370 assertEquals(false, c.flagY);
371 assertEquals(true, c.flagZ);
372 assertEquals(false, c.flagW);
373 assertEquals(-1, c.x);
374 assertEquals(0x0, c.y);
375 assertEquals(-1, c.z);
376 assertEquals(0x0, c.w);
378 c = SIMD.int32x4.withFlagX(a, undefined);
379 assertEquals(false, c.flagX);
380 assertEquals(false, c.flagY);
381 assertEquals(true, c.flagZ);
382 assertEquals(false, c.flagW);
383 assertEquals(0x0, c.x);
384 assertEquals(0x0, c.y);
385 assertEquals(-1, c.z);
386 assertEquals(0x0, c.w);
391 %OptimizeFunctionOnNextCall(testSIMDWithFlagX);
394 function testSIMDWithFlagY() {
395 var a = SIMD.int32x4.bool(true, false, true, false);
396 var c = SIMD.int32x4.withFlagY(a, true);
397 assertEquals(true, c.flagX);
398 assertEquals(true, c.flagY);
399 assertEquals(true, c.flagZ);
400 assertEquals(false, c.flagW);
401 c = SIMD.int32x4.withFlagY(a, false);
402 assertEquals(true, c.flagX);
403 assertEquals(false, c.flagY);
404 assertEquals(true, c.flagZ);
405 assertEquals(false, c.flagW);
406 assertEquals(-1, c.x);
407 assertEquals(0x0, c.y);
408 assertEquals(-1, c.z);
409 assertEquals(0x0, c.w);
414 %OptimizeFunctionOnNextCall(testSIMDWithFlagY);
417 function testSIMDWithFlagZ() {
418 var a = SIMD.int32x4.bool(true, false, true, false);
419 var c = SIMD.int32x4.withFlagZ(a, true);
420 assertEquals(true, c.flagX);
421 assertEquals(false, c.flagY);
422 assertEquals(true, c.flagZ);
423 assertEquals(false, c.flagW);
424 c = SIMD.int32x4.withFlagZ(a, false);
425 assertEquals(true, c.flagX);
426 assertEquals(false, c.flagY);
427 assertEquals(false, c.flagZ);
428 assertEquals(false, c.flagW);
429 assertEquals(-1, c.x);
430 assertEquals(0x0, c.y);
431 assertEquals(0x0, c.z);
432 assertEquals(0x0, c.w);
437 %OptimizeFunctionOnNextCall(testSIMDWithFlagZ);
440 function testSIMDWithFlagW() {
441 var a = SIMD.int32x4.bool(true, false, true, false);
442 var c = SIMD.int32x4.withFlagW(a, true);
443 assertEquals(true, c.flagX);
444 assertEquals(false, c.flagY);
445 assertEquals(true, c.flagZ);
446 assertEquals(true, c.flagW);
447 c = SIMD.int32x4.withFlagW(a, false);
448 assertEquals(true, c.flagX);
449 assertEquals(false, c.flagY);
450 assertEquals(true, c.flagZ);
451 assertEquals(false, c.flagW);
452 assertEquals(-1, c.x);
453 assertEquals(0x0, c.y);
454 assertEquals(-1, c.z);
455 assertEquals(0x0, c.w);
460 %OptimizeFunctionOnNextCall(testSIMDWithFlagW);
463 function testSIMDAddu32() {
464 var a = SIMD.int32x4(-1, -1, 0x7fffffff, 0x0);
465 var b = SIMD.int32x4(0x1, -1, 0x1, -1);
466 var c = SIMD.int32x4.add(a, b);
467 assertEquals(0x0, c.x);
468 assertEquals(-2, c.y);
469 assertEquals(0x80000000 - 0xFFFFFFFF - 1, c.z);
470 assertEquals(-1, c.w);
475 %OptimizeFunctionOnNextCall(testSIMDAddu32);
478 function testSIMDSubu32() {
479 var a = SIMD.int32x4(-1, -1, 0x80000000 - 0xFFFFFFFF - 1, 0x0);
480 var b = SIMD.int32x4(0x1, -1, 0x1, -1);
481 var c = SIMD.int32x4.sub(a, b);
482 assertEquals(-2, c.x);
483 assertEquals(0x0, c.y);
484 assertEquals(0x7FFFFFFF, c.z);
485 assertEquals(0x1, c.w);
490 %OptimizeFunctionOnNextCall(testSIMDSubu32);
493 function testSIMDMulu32() {
494 var a = SIMD.int32x4(-1, -1, 0x80000000 - 0xFFFFFFFF - 1, 0x0);
495 var b = SIMD.int32x4(0x1, -1, 0x80000000 - 0xFFFFFFFF - 1, -1);
496 var c = SIMD.int32x4.mul(a, b);
497 assertEquals(-1, c.x);
498 assertEquals(0x1, c.y);
499 assertEquals(0x0, c.z);
500 assertEquals(0x0, c.w);
505 %OptimizeFunctionOnNextCall(testSIMDMulu32);
508 function testSIMDShuffleu32() {
509 var m = SIMD.int32x4(1, 2, 3, 4);
510 var xxxx = SIMD.int32x4.shuffle(m, SIMD.XXXX);
511 assertEquals(1, xxxx.x);
512 assertEquals(1, xxxx.y);
513 assertEquals(1, xxxx.z);
514 assertEquals(1, xxxx.w);
515 var yyyy = SIMD.int32x4.shuffle(m, SIMD.YYYY);
516 assertEquals(2, yyyy.x);
517 assertEquals(2, yyyy.y);
518 assertEquals(2, yyyy.z);
519 assertEquals(2, yyyy.w);
520 var zzzz = SIMD.int32x4.shuffle(m, SIMD.ZZZZ);
521 assertEquals(3, zzzz.x);
522 assertEquals(3, zzzz.y);
523 assertEquals(3, zzzz.z);
524 assertEquals(3, zzzz.w);
525 var wwww = SIMD.int32x4.shuffle(m, SIMD.WWWW);
526 assertEquals(4, wwww.x);
527 assertEquals(4, wwww.y);
528 assertEquals(4, wwww.z);
529 assertEquals(4, wwww.w);
530 var wzyx = SIMD.int32x4.shuffle(m, SIMD.WZYX);
531 assertEquals(4, wzyx.x);
532 assertEquals(3, wzyx.y);
533 assertEquals(2, wzyx.z);
534 assertEquals(1, wzyx.w);
535 var wwzz = SIMD.int32x4.shuffle(m, SIMD.WWZZ);
536 assertEquals(4, wwzz.x);
537 assertEquals(4, wwzz.y);
538 assertEquals(3, wwzz.z);
539 assertEquals(3, wwzz.w);
540 var xxyy = SIMD.int32x4.shuffle(m, SIMD.XXYY);
541 assertEquals(1, xxyy.x);
542 assertEquals(1, xxyy.y);
543 assertEquals(2, xxyy.z);
544 assertEquals(2, xxyy.w);
545 var yyww = SIMD.int32x4.shuffle(m, SIMD.YYWW);
546 assertEquals(2, yyww.x);
547 assertEquals(2, yyww.y);
548 assertEquals(4, yyww.z);
549 assertEquals(4, yyww.w);
552 testSIMDShuffleu32();
553 testSIMDShuffleu32();
554 %OptimizeFunctionOnNextCall(testSIMDShuffleu32);
555 testSIMDShuffleu32();
557 function testSIMDComparisons() {
558 var m = SIMD.int32x4(1, 2, 100, 1);
559 var n = SIMD.int32x4(2, 2, 1, 100);
561 cmp = SIMD.int32x4.lessThan(m, n);
562 assertEquals(-1, cmp.x);
563 assertEquals(0x0, cmp.y);
564 assertEquals(0x0, cmp.z);
565 assertEquals(-1, cmp.w);
567 cmp = SIMD.int32x4.equal(m, n);
568 assertEquals(0x0, cmp.x);
569 assertEquals(-1, cmp.y);
570 assertEquals(0x0, cmp.z);
571 assertEquals(0x0, cmp.w);
573 cmp = SIMD.int32x4.greaterThan(m, n);
574 assertEquals(0x0, cmp.x);
575 assertEquals(0x0, cmp.y);
576 assertEquals(-1, cmp.z);
577 assertEquals(0x0, cmp.w);
580 testSIMDComparisons();
581 testSIMDComparisons();
582 %OptimizeFunctionOnNextCall(testSIMDComparisons);
583 testSIMDComparisons();
585 function testSIMDShift() {
586 var m = SIMD.int32x4(1, 2, 100, 0);
588 var a = SIMD.int32x4.shiftLeft(m, 2);
589 assertEquals(4, a.x);
590 assertEquals(8, a.y);
591 assertEquals(400, a.z);
592 assertEquals(0, a.w);
594 var b = SIMD.int32x4.shiftRight(a, 2);
595 assertEquals(1, b.x);
596 assertEquals(2, b.y);
597 assertEquals(100, b.z);
598 assertEquals(0, b.w);
600 var n = SIMD.int32x4(-8, 2, 1, 100);
602 var c = SIMD.int32x4.shiftRightArithmetic(n, 2);
603 assertEquals(-2, c.x);
604 assertEquals(0, c.y);
605 assertEquals(0, c.z);
606 assertEquals(25, c.w);
611 %OptimizeFunctionOnNextCall(testSIMDShift);
614 function testInt32x4ArrayBasic() {
615 var a = new Int32x4Array(1);
616 assertEquals(1, a.length);
617 assertEquals(16, a.byteLength);
618 assertEquals(16, a.BYTES_PER_ELEMENT);
619 assertEquals(16, Int32x4Array.BYTES_PER_ELEMENT);
620 assertEquals(0, a.byteOffset);
621 assertTrue(undefined != a.buffer);
622 var b = new Int32x4Array(4);
623 assertEquals(4, b.length);
624 assertEquals(64, b.byteLength);
625 assertEquals(16, b.BYTES_PER_ELEMENT);
626 assertEquals(16, Int32x4Array.BYTES_PER_ELEMENT);
627 assertEquals(0, b.byteOffset);
628 assertTrue(undefined != b.buffer);
631 testInt32x4ArrayBasic();
633 function testInt32x4ArrayGetAndSet() {
634 var a = new Int32x4Array(4);
635 a[0] = SIMD.int32x4(1, 2, 3, 4);
636 a[1] = SIMD.int32x4(5, 6, 7, 8);
637 a[2] = SIMD.int32x4(9, 10, 11, 12);
638 a[3] = SIMD.int32x4(13, 14, 15, 16);
639 assertEquals(a[0].x, 1);
640 assertEquals(a[0].y, 2);
641 assertEquals(a[0].z, 3);
642 assertEquals(a[0].w, 4);
644 assertEquals(a[1].x, 5);
645 assertEquals(a[1].y, 6);
646 assertEquals(a[1].z, 7);
647 assertEquals(a[1].w, 8);
649 assertEquals(a[2].x, 9);
650 assertEquals(a[2].y, 10);
651 assertEquals(a[2].z, 11);
652 assertEquals(a[2].w, 12);
654 assertEquals(a[3].x, 13);
655 assertEquals(a[3].y, 14);
656 assertEquals(a[3].z, 15);
657 assertEquals(a[3].w, 16);
659 var b = new Int32x4Array(4);
660 b.setAt(0,SIMD.int32x4(1, 2, 3, 4));
661 b.setAt(1,SIMD.int32x4(5, 6, 7, 8));
662 b.setAt(2,SIMD.int32x4(9, 10, 11, 12));
663 b.setAt(3,SIMD.int32x4(13, 14, 15, 16));
665 assertEquals(b.getAt(0).x, 1);
666 assertEquals(b.getAt(0).y, 2);
667 assertEquals(b.getAt(0).z, 3);
668 assertEquals(b.getAt(0).w, 4);
670 assertEquals(b.getAt(1).x, 5);
671 assertEquals(b.getAt(1).y, 6);
672 assertEquals(b.getAt(1).z, 7);
673 assertEquals(b.getAt(1).w, 8);
675 assertEquals(b.getAt(2).x, 9);
676 assertEquals(b.getAt(2).y, 10);
677 assertEquals(b.getAt(2).z, 11);
678 assertEquals(b.getAt(2).w, 12);
680 assertEquals(b.getAt(3).x, 13);
681 assertEquals(b.getAt(3).y, 14);
682 assertEquals(b.getAt(3).z, 15);
683 assertEquals(b.getAt(3).w, 16);
686 testInt32x4ArrayGetAndSet();
688 function testInt32x4ArraySwap() {
689 var a = new Int32x4Array(4);
690 a[0] = SIMD.int32x4(1, 2, 3, 4);
691 a[1] = SIMD.int32x4(5, 6, 7, 8);
692 a[2] = SIMD.int32x4(9, 10, 11, 12);
693 a[3] = SIMD.int32x4(13, 14, 15, 16);
695 // Swap element 0 and element 3
700 assertEquals(a[3].x, 1);
701 assertEquals(a[3].y, 2);
702 assertEquals(a[3].z, 3);
703 assertEquals(a[3].w, 4);
705 assertEquals(a[1].x, 5);
706 assertEquals(a[1].y, 6);
707 assertEquals(a[1].z, 7);
708 assertEquals(a[1].w, 8);
710 assertEquals(a[2].x, 9);
711 assertEquals(a[2].y, 10);
712 assertEquals(a[2].z, 11);
713 assertEquals(a[2].w, 12);
715 assertEquals(a[0].x, 13);
716 assertEquals(a[0].y, 14);
717 assertEquals(a[0].z, 15);
718 assertEquals(a[0].w, 16);
721 testInt32x4ArraySwap();
722 testInt32x4ArraySwap();
723 %OptimizeFunctionOnNextCall(testInt32x4ArraySwap);
724 testInt32x4ArraySwap();
726 function testInt32x4ArrayCopy() {
727 var a = new Int32x4Array(4);
728 a[0] = SIMD.int32x4(1, 2, 3, 4);
729 a[1] = SIMD.int32x4(5, 6, 7, 8);
730 a[2] = SIMD.int32x4(9, 10, 11, 12);
731 a[3] = SIMD.int32x4(13, 14, 15, 16);
732 var b = new Int32x4Array(a);
733 assertEquals(a[0].x, b[0].x);
734 assertEquals(a[0].y, b[0].y);
735 assertEquals(a[0].z, b[0].z);
736 assertEquals(a[0].w, b[0].w);
738 assertEquals(a[1].x, b[1].x);
739 assertEquals(a[1].y, b[1].y);
740 assertEquals(a[1].z, b[1].z);
741 assertEquals(a[1].w, b[1].w);
743 assertEquals(a[2].x, b[2].x);
744 assertEquals(a[2].y, b[2].y);
745 assertEquals(a[2].z, b[2].z);
746 assertEquals(a[2].w, b[2].w);
748 assertEquals(a[3].x, b[3].x);
749 assertEquals(a[3].y, b[3].y);
750 assertEquals(a[3].z, b[3].z);
751 assertEquals(a[3].w, b[3].w);
753 a[2] = SIMD.int32x4(17, 18, 19, 20);
755 assertEquals(a[2].x, 17);
756 assertEquals(a[2].y, 18);
757 assertEquals(a[2].z, 19);
758 assertEquals(a[2].w, 20);
760 assertTrue(a[2].x != b[2].x);
761 assertTrue(a[2].y != b[2].y);
762 assertTrue(a[2].z != b[2].z);
763 assertTrue(a[2].w != b[2].w);
766 testInt32x4ArrayCopy();
768 function testInt32x4ArrayViewBasic() {
769 var a = new Uint32Array(8);
770 // view with no offset.
771 var b = new Int32x4Array(a.buffer, 0);
773 var c = new Int32x4Array(a.buffer, 16);
774 // view with no offset but shorter than original list.
775 var d = new Int32x4Array(a.buffer, 0, 1);
776 assertEquals(a.length, 8);
777 assertEquals(b.length, 2);
778 assertEquals(c.length, 1);
779 assertEquals(d.length, 1);
780 assertEquals(a.byteLength, 32);
781 assertEquals(b.byteLength, 32);
782 assertEquals(c.byteLength, 16);
783 assertEquals(d.byteLength, 16)
784 assertEquals(a.byteOffset, 0);
785 assertEquals(b.byteOffset, 0);
786 assertEquals(c.byteOffset, 16);
787 assertEquals(d.byteOffset, 0);
790 testInt32x4ArrayViewBasic();
792 function testInt32x4ArrayViewValues() {
793 var a = new Uint32Array(8);
794 var b = new Int32x4Array(a.buffer, 0);
795 var c = new Int32x4Array(a.buffer, 16);
796 var d = new Int32x4Array(a.buffer, 0, 1);
798 for (var i = 0; i < b.length; i++) {
799 assertEquals(0, b[i].x);
800 assertEquals(0, b[i].y);
801 assertEquals(0, b[i].z);
802 assertEquals(0, b[i].w);
804 for (var i = 0; i < c.length; i++) {
805 assertEquals(0, c[i].x);
806 assertEquals(0, c[i].y);
807 assertEquals(0, c[i].z);
808 assertEquals(0, c[i].w);
810 for (var i = 0; i < d.length; i++) {
811 assertEquals(0, d[i].x);
812 assertEquals(0, d[i].y);
813 assertEquals(0, d[i].z);
814 assertEquals(0, d[i].w);
816 for (var i = 0; i < a.length; i++) {
819 for (var i = 0; i < b.length; i++) {
820 assertTrue(0 != b[i].x);
821 assertTrue(0 != b[i].y);
822 assertTrue(0 != b[i].z);
823 assertTrue(0 != b[i].w);
825 for (var i = 0; i < c.length; i++) {
826 assertTrue(0 != c[i].x);
827 assertTrue(0 != c[i].y);
828 assertTrue(0 != c[i].z);
829 assertTrue(0 != c[i].w);
831 for (var i = 0; i < d.length; i++) {
832 assertTrue(0 != d[i].x);
833 assertTrue(0 != d[i].y);
834 assertTrue(0 != d[i].z);
835 assertTrue(0 != d[i].w);
837 assertEquals(start+0, b[0].x);
838 assertEquals(start+1, b[0].y);
839 assertEquals(start+2, b[0].z);
840 assertEquals(start+3, b[0].w);
841 assertEquals(start+4, b[1].x);
842 assertEquals(start+5, b[1].y);
843 assertEquals(start+6, b[1].z);
844 assertEquals(start+7, b[1].w);
846 assertEquals(start+4, c[0].x);
847 assertEquals(start+5, c[0].y);
848 assertEquals(start+6, c[0].z);
849 assertEquals(start+7, c[0].w);
851 assertEquals(start+0, d[0].x);
852 assertEquals(start+1, d[0].y);
853 assertEquals(start+2, d[0].z);
854 assertEquals(start+3, d[0].w);
857 testInt32x4ArrayViewValues();
859 function testViewOnInt32x4Array() {
860 var a = new Int32x4Array(4);
861 a[0] = SIMD.int32x4(1, 2, 3, 4);
862 a[1] = SIMD.int32x4(5, 6, 7, 8);
863 a[2] = SIMD.int32x4(9, 10, 11, 12);
864 a[3] = SIMD.int32x4(13, 14, 15, 16);
865 assertEquals(a[0].x, 1);
866 assertEquals(a[0].y, 2);
867 assertEquals(a[0].z, 3);
868 assertEquals(a[0].w, 4);
870 assertEquals(a[1].x, 5);
871 assertEquals(a[1].y, 6);
872 assertEquals(a[1].z, 7);
873 assertEquals(a[1].w, 8);
875 assertEquals(a[2].x, 9);
876 assertEquals(a[2].y, 10);
877 assertEquals(a[2].z, 11);
878 assertEquals(a[2].w, 12);
880 assertEquals(a[3].x, 13);
881 assertEquals(a[3].y, 14);
882 assertEquals(a[3].z, 15);
883 assertEquals(a[3].w, 16);
886 var b = new Uint32Array(a.buffer);
887 assertEquals(b.length, 16);
888 assertEquals(b.byteLength, 64);
892 // Observe changes in "a"
893 assertEquals(a[0].x, 1);
894 assertEquals(a[0].y, 2);
895 assertEquals(a[0].z, 99);
896 assertEquals(a[0].w, 4);
898 assertEquals(a[1].x, 5);
899 assertEquals(a[1].y, 6);
900 assertEquals(a[1].z, 1);
901 assertEquals(a[1].w, 8);
903 assertEquals(a[2].x, 9);
904 assertEquals(a[2].y, 10);
905 assertEquals(a[2].z, 11);
906 assertEquals(a[2].w, 12);
908 assertEquals(a[3].x, 13);
909 assertEquals(a[3].y, 14);
910 assertEquals(a[3].z, 15);
911 assertEquals(a[3].w, 16);
914 testViewOnInt32x4Array();
916 function testArrayOfInt32x4() {
918 var a4 = new Int32x4Array(2);
919 for (var i = 0; i < a4.length; i++) {
920 a[i] = SIMD.int32x4(i, i + 1, i + 2, i + 3);
921 a4[i] = SIMD.int32x4(i, i + 1, i + 2, i + 3);
924 for (var i = 0; i < a4.length; i++) {
925 assertEquals(a[i].x, a4[i].x);
926 assertEquals(a[i].y, a4[i].y);
927 assertEquals(a[i].z, a4[i].z);
928 assertEquals(a[i].w, a4[i].w);
932 testArrayOfInt32x4();