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 test1ArgumentConstructor() {
41 var u4 = SIMD.int32x4(1, 2, 3, 4);
42 var u4_new = SIMD.int32x4(u4);
43 assertEquals(u4_new.x, u4.x);
44 assertEquals(u4_new.y, u4.y);
45 assertEquals(u4_new.z, u4.z);
46 assertEquals(u4_new.w, u4.w);
49 test1ArgumentConstructor();
50 test1ArgumentConstructor();
51 %OptimizeFunctionOnNextCall(test1ArgumentConstructor);
52 test1ArgumentConstructor();
54 function testZeroConstructor() {
55 var u4 = SIMD.int32x4.zero();
56 assertEquals(0, u4.x);
57 assertEquals(0, u4.y);
58 assertEquals(0, u4.z);
59 assertEquals(0, u4.w);
62 testZeroConstructor();
63 testZeroConstructor();
64 %OptimizeFunctionOnNextCall(testZeroConstructor);
65 testZeroConstructor();
67 function testBoolConstructor() {
68 var u4 = SIMD.int32x4.bool(true, false, true, false);
69 assertEquals(-1, u4.x);
70 assertEquals(0, u4.y);
71 assertEquals(-1, u4.z);
72 assertEquals(0, u4.w);
75 testBoolConstructor();
76 testBoolConstructor();
77 %OptimizeFunctionOnNextCall(testBoolConstructor);
78 testBoolConstructor();
80 function testSplatConstructor() {
81 var u4 = SIMD.int32x4.splat(4);
82 assertEquals(4, u4.x);
83 assertEquals(4, u4.y);
84 assertEquals(4, u4.z);
85 assertEquals(4, u4.w);
88 testSplatConstructor();
89 testSplatConstructor();
90 %OptimizeFunctionOnNextCall(testSplatConstructor);
91 testSplatConstructor();
93 function testTypeof() {
94 var u4 = SIMD.int32x4(1, 2, 3, 4);
95 assertEquals(typeof(u4), "object");
97 var new_u4 = new SIMD.int32x4(1, 2, 3, 4);
98 assertEquals(typeof(new_u4), "object");
99 assertEquals(typeof(new_u4.valueOf()), "object");
100 assertEquals(Object.prototype.toString.call(new_u4), "[object Object]");
105 function testSignMaskGetter() {
106 var a = SIMD.int32x4(0x80000000 - 0xFFFFFFFF - 1, 0x7000000, -1, 0x0);
107 assertEquals(0x5, a.signMask);
108 var b = SIMD.int32x4(0x0, 0x0, 0x0, 0x0);
109 assertEquals(0x0, b.signMask);
110 var c = SIMD.int32x4(-1, -1, -1, -1);
111 assertEquals(0xf, c.signMask);
114 testSignMaskGetter();
115 testSignMaskGetter();
116 %OptimizeFunctionOnNextCall(testSignMaskGetter);
117 testSignMaskGetter();
120 function testSIMDAnd() {
121 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
122 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
123 var n = SIMD.int32x4(0x55555555, 0x55555555, 0x55555555, 0x55555555);
124 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.x);
125 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.y);
126 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.z);
127 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, m.w);
128 assertEquals(0x55555555, n.x);
129 assertEquals(0x55555555, n.y);
130 assertEquals(0x55555555, n.z);
131 assertEquals(0x55555555, n.w);
132 assertEquals(true, n.flagX);
133 assertEquals(true, n.flagY);
134 assertEquals(true, n.flagZ);
135 assertEquals(true, n.flagW);
136 o = SIMD.int32x4.and(m,n); // and
137 assertEquals(0x0, o.x);
138 assertEquals(0x0, o.y);
139 assertEquals(0x0, o.z);
140 assertEquals(0x0, o.w);
141 assertEquals(false, o.flagX);
142 assertEquals(false, o.flagY);
143 assertEquals(false, o.flagZ);
144 assertEquals(false, o.flagW);
149 %OptimizeFunctionOnNextCall(testSIMDAnd);
152 function testSIMDOr() {
153 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
154 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
155 var n = SIMD.int32x4(0x55555555, 0x55555555, 0x55555555, 0x55555555);
156 var o = SIMD.int32x4.or(m,n); // or
157 assertEquals(-1, o.x);
158 assertEquals(-1, o.y);
159 assertEquals(-1, o.z);
160 assertEquals(-1, o.w);
161 assertEquals(true, o.flagX);
162 assertEquals(true, o.flagY);
163 assertEquals(true, o.flagZ);
164 assertEquals(true, o.flagW);
169 %OptimizeFunctionOnNextCall(testSIMDOr);
172 function testSIMDInt32x4Or() {
173 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
174 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
175 var n = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
176 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
177 var o = SIMD.int32x4.xor(m,n); // xor
178 assertEquals(0x0, o.x);
179 assertEquals(0x0, o.y);
180 assertEquals(0x0, o.z);
181 assertEquals(0x0, o.w);
182 assertEquals(false, o.flagX);
183 assertEquals(false, o.flagY);
184 assertEquals(false, o.flagZ);
185 assertEquals(false, o.flagW);
190 %OptimizeFunctionOnNextCall(testSIMDInt32x4Or);
193 function testSIMDNot() {
194 var m = SIMD.int32x4(0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1,
195 0xAAAAAAAA - 0xFFFFFFFF - 1, 0xAAAAAAAA - 0xFFFFFFFF - 1);
196 var n = SIMD.int32x4(0x55555555, 0x55555555, 0x55555555, 0x55555555);
197 m = SIMD.int32x4.not(m);
198 n = SIMD.int32x4.not(n);
199 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.x);
200 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.y);
201 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.z);
202 assertEquals(0xAAAAAAAA - 0xFFFFFFFF - 1, n.w);
203 assertEquals(0x55555555, m.x);
204 assertEquals(0x55555555, m.y);
205 assertEquals(0x55555555, m.z);
206 assertEquals(0x55555555, m.w);
211 %OptimizeFunctionOnNextCall(testSIMDNot);
214 function testSIMDNegu32() {
215 var m = SIMD.int32x4(-1, 1, -1, 1);
216 m = SIMD.int32x4.neg(m);
217 assertEquals(1, m.x);
218 assertEquals(-1, m.y);
219 assertEquals(1, m.z);
220 assertEquals(-1, m.w);
225 %OptimizeFunctionOnNextCall(testSIMDNegu32);
228 function testSIMDSelect() {
229 var m = SIMD.int32x4.bool(true, true, false, false);
230 var t = SIMD.int32x4(1, 2, 3, 4);
231 var f = SIMD.int32x4(5, 6, 7, 8);
232 var s = SIMD.int32x4.select(m, t, f);
233 assertEquals(1, s.x);
234 assertEquals(2, s.y);
235 assertEquals(7, s.z);
236 assertEquals(8, s.w);
241 %OptimizeFunctionOnNextCall(testSIMDSelect);
245 function testSIMDWithXu32() {
246 var a = SIMD.int32x4(1, 2, 3, 4);
247 var c = SIMD.int32x4.withX(a, 20);
248 assertEquals(20, c.x);
249 assertEquals(2, c.y);
250 assertEquals(3, c.z);
251 assertEquals(4, c.w);
256 %OptimizeFunctionOnNextCall(testSIMDWithXu32);
259 function testSIMDWithYu32() {
260 var a = SIMD.int32x4(1, 2, 3, 4);
261 var c = SIMD.int32x4.withY(a, 20);
262 assertEquals(1, c.x);
263 assertEquals(20, c.y);
264 assertEquals(3, c.z);
265 assertEquals(4, c.w);
270 %OptimizeFunctionOnNextCall(testSIMDWithYu32);
273 function testSIMDWithZu32() {
274 var a = SIMD.int32x4(1, 2, 3, 4);
275 var c = SIMD.int32x4.withZ(a, 20);
276 assertEquals(1, c.x);
277 assertEquals(2, c.y);
278 assertEquals(20, c.z);
279 assertEquals(4, c.w);
284 %OptimizeFunctionOnNextCall(testSIMDWithZu32);
287 function testSIMDWithWu32() {
288 var a = SIMD.int32x4(1, 2, 3, 4);
289 var c = SIMD.int32x4.withW(a, 20);
290 assertEquals(1, c.x);
291 assertEquals(2, c.y);
292 assertEquals(3, c.z);
293 assertEquals(20, c.w);
298 %OptimizeFunctionOnNextCall(testSIMDWithWu32);
301 function testSIMDWithFlagX() {
302 var a = SIMD.int32x4.bool(true, false, true, false);
305 var c = SIMD.int32x4.withFlagX(a, true);
306 assertEquals(true, c.flagX);
307 assertEquals(false, c.flagY);
308 assertEquals(true, c.flagZ);
309 assertEquals(false, c.flagW);
310 c = SIMD.int32x4.withFlagX(a, false);
311 assertEquals(false, c.flagX);
312 assertEquals(false, c.flagY);
313 assertEquals(true, c.flagZ);
314 assertEquals(false, c.flagW);
315 assertEquals(0x0, c.x);
316 assertEquals(0x0, c.y);
317 assertEquals(-1, c.z);
318 assertEquals(0x0, c.w);
321 c = SIMD.int32x4.withFlagX(a, 2);
322 assertEquals(true, c.flagX);
323 assertEquals(false, c.flagY);
324 assertEquals(true, c.flagZ);
325 assertEquals(false, c.flagW);
326 assertEquals(-1, c.x);
327 assertEquals(0x0, c.y);
328 assertEquals(-1, c.z);
329 assertEquals(0x0, c.w);
330 c = SIMD.int32x4.withFlagX(a, 0);
331 assertEquals(false, c.flagX);
332 assertEquals(false, c.flagY);
333 assertEquals(true, c.flagZ);
334 assertEquals(false, c.flagW);
335 assertEquals(0x0, c.x);
336 assertEquals(0x0, c.y);
337 assertEquals(-1, c.z);
338 assertEquals(0x0, c.w);
341 c = SIMD.int32x4.withFlagX(a, 'true');
342 assertEquals(true, c.flagX);
343 assertEquals(false, c.flagY);
344 assertEquals(true, c.flagZ);
345 assertEquals(false, c.flagW);
346 assertEquals(-1, c.x);
347 assertEquals(0x0, c.y);
348 assertEquals(-1, c.z);
349 assertEquals(0x0, c.w);
350 c = SIMD.int32x4.withFlagX(a, '');
351 assertEquals(false, c.flagX);
352 assertEquals(false, c.flagY);
353 assertEquals(true, c.flagZ);
354 assertEquals(false, c.flagW);
355 assertEquals(0x0, c.x);
356 assertEquals(0x0, c.y);
357 assertEquals(-1, c.z);
358 assertEquals(0x0, c.w);
361 c = SIMD.int32x4.withFlagX(a, 3.14);
362 assertEquals(true, c.flagX);
363 assertEquals(false, c.flagY);
364 assertEquals(true, c.flagZ);
365 assertEquals(false, c.flagW);
366 assertEquals(-1, c.x);
367 assertEquals(0x0, c.y);
368 assertEquals(-1, c.z);
369 assertEquals(0x0, c.w);
370 c = SIMD.int32x4.withFlagX(a, 0.0);
371 assertEquals(false, c.flagX);
372 assertEquals(false, c.flagY);
373 assertEquals(true, c.flagZ);
374 assertEquals(false, c.flagW);
375 assertEquals(0x0, c.x);
376 assertEquals(0x0, c.y);
377 assertEquals(-1, c.z);
378 assertEquals(0x0, c.w);
382 c = SIMD.int32x4.withFlagX(a, array);
383 assertEquals(true, c.flagX);
384 assertEquals(false, c.flagY);
385 assertEquals(true, c.flagZ);
386 assertEquals(false, c.flagW);
387 assertEquals(-1, c.x);
388 assertEquals(0x0, c.y);
389 assertEquals(-1, c.z);
390 assertEquals(0x0, c.w);
392 c = SIMD.int32x4.withFlagX(a, undefined);
393 assertEquals(false, c.flagX);
394 assertEquals(false, c.flagY);
395 assertEquals(true, c.flagZ);
396 assertEquals(false, c.flagW);
397 assertEquals(0x0, c.x);
398 assertEquals(0x0, c.y);
399 assertEquals(-1, c.z);
400 assertEquals(0x0, c.w);
405 %OptimizeFunctionOnNextCall(testSIMDWithFlagX);
408 function testSIMDWithFlagY() {
409 var a = SIMD.int32x4.bool(true, false, true, false);
410 var c = SIMD.int32x4.withFlagY(a, true);
411 assertEquals(true, c.flagX);
412 assertEquals(true, c.flagY);
413 assertEquals(true, c.flagZ);
414 assertEquals(false, c.flagW);
415 c = SIMD.int32x4.withFlagY(a, false);
416 assertEquals(true, c.flagX);
417 assertEquals(false, c.flagY);
418 assertEquals(true, c.flagZ);
419 assertEquals(false, c.flagW);
420 assertEquals(-1, c.x);
421 assertEquals(0x0, c.y);
422 assertEquals(-1, c.z);
423 assertEquals(0x0, c.w);
428 %OptimizeFunctionOnNextCall(testSIMDWithFlagY);
431 function testSIMDWithFlagZ() {
432 var a = SIMD.int32x4.bool(true, false, true, false);
433 var c = SIMD.int32x4.withFlagZ(a, true);
434 assertEquals(true, c.flagX);
435 assertEquals(false, c.flagY);
436 assertEquals(true, c.flagZ);
437 assertEquals(false, c.flagW);
438 c = SIMD.int32x4.withFlagZ(a, false);
439 assertEquals(true, c.flagX);
440 assertEquals(false, c.flagY);
441 assertEquals(false, c.flagZ);
442 assertEquals(false, c.flagW);
443 assertEquals(-1, c.x);
444 assertEquals(0x0, c.y);
445 assertEquals(0x0, c.z);
446 assertEquals(0x0, c.w);
451 %OptimizeFunctionOnNextCall(testSIMDWithFlagZ);
454 function testSIMDWithFlagW() {
455 var a = SIMD.int32x4.bool(true, false, true, false);
456 var c = SIMD.int32x4.withFlagW(a, true);
457 assertEquals(true, c.flagX);
458 assertEquals(false, c.flagY);
459 assertEquals(true, c.flagZ);
460 assertEquals(true, c.flagW);
461 c = SIMD.int32x4.withFlagW(a, false);
462 assertEquals(true, c.flagX);
463 assertEquals(false, c.flagY);
464 assertEquals(true, c.flagZ);
465 assertEquals(false, c.flagW);
466 assertEquals(-1, c.x);
467 assertEquals(0x0, c.y);
468 assertEquals(-1, c.z);
469 assertEquals(0x0, c.w);
474 %OptimizeFunctionOnNextCall(testSIMDWithFlagW);
477 function testSIMDAddu32() {
478 var a = SIMD.int32x4(-1, -1, 0x7fffffff, 0x0);
479 var b = SIMD.int32x4(0x1, -1, 0x1, -1);
480 var c = SIMD.int32x4.add(a, b);
481 assertEquals(0x0, c.x);
482 assertEquals(-2, c.y);
483 assertEquals(0x80000000 - 0xFFFFFFFF - 1, c.z);
484 assertEquals(-1, c.w);
489 %OptimizeFunctionOnNextCall(testSIMDAddu32);
492 function testSIMDSubu32() {
493 var a = SIMD.int32x4(-1, -1, 0x80000000 - 0xFFFFFFFF - 1, 0x0);
494 var b = SIMD.int32x4(0x1, -1, 0x1, -1);
495 var c = SIMD.int32x4.sub(a, b);
496 assertEquals(-2, c.x);
497 assertEquals(0x0, c.y);
498 assertEquals(0x7FFFFFFF, c.z);
499 assertEquals(0x1, c.w);
504 %OptimizeFunctionOnNextCall(testSIMDSubu32);
507 function testSIMDMulu32() {
508 var a = SIMD.int32x4(-1, -1, 0x80000000 - 0xFFFFFFFF - 1, 0x0);
509 var b = SIMD.int32x4(0x1, -1, 0x80000000 - 0xFFFFFFFF - 1, -1);
510 var c = SIMD.int32x4.mul(a, b);
511 assertEquals(-1, c.x);
512 assertEquals(0x1, c.y);
513 assertEquals(0x0, c.z);
514 assertEquals(0x0, c.w);
519 %OptimizeFunctionOnNextCall(testSIMDMulu32);
522 function testSIMDShuffleu32() {
523 var m = SIMD.int32x4(1, 2, 3, 4);
524 var xxxx = SIMD.int32x4.shuffle(m, SIMD.XXXX);
525 assertEquals(1, xxxx.x);
526 assertEquals(1, xxxx.y);
527 assertEquals(1, xxxx.z);
528 assertEquals(1, xxxx.w);
529 var yyyy = SIMD.int32x4.shuffle(m, SIMD.YYYY);
530 assertEquals(2, yyyy.x);
531 assertEquals(2, yyyy.y);
532 assertEquals(2, yyyy.z);
533 assertEquals(2, yyyy.w);
534 var zzzz = SIMD.int32x4.shuffle(m, SIMD.ZZZZ);
535 assertEquals(3, zzzz.x);
536 assertEquals(3, zzzz.y);
537 assertEquals(3, zzzz.z);
538 assertEquals(3, zzzz.w);
539 var wwww = SIMD.int32x4.shuffle(m, SIMD.WWWW);
540 assertEquals(4, wwww.x);
541 assertEquals(4, wwww.y);
542 assertEquals(4, wwww.z);
543 assertEquals(4, wwww.w);
544 var wzyx = SIMD.int32x4.shuffle(m, SIMD.WZYX);
545 assertEquals(4, wzyx.x);
546 assertEquals(3, wzyx.y);
547 assertEquals(2, wzyx.z);
548 assertEquals(1, wzyx.w);
549 var wwzz = SIMD.int32x4.shuffle(m, SIMD.WWZZ);
550 assertEquals(4, wwzz.x);
551 assertEquals(4, wwzz.y);
552 assertEquals(3, wwzz.z);
553 assertEquals(3, wwzz.w);
554 var xxyy = SIMD.int32x4.shuffle(m, SIMD.XXYY);
555 assertEquals(1, xxyy.x);
556 assertEquals(1, xxyy.y);
557 assertEquals(2, xxyy.z);
558 assertEquals(2, xxyy.w);
559 var yyww = SIMD.int32x4.shuffle(m, SIMD.YYWW);
560 assertEquals(2, yyww.x);
561 assertEquals(2, yyww.y);
562 assertEquals(4, yyww.z);
563 assertEquals(4, yyww.w);
566 testSIMDShuffleu32();
567 testSIMDShuffleu32();
568 %OptimizeFunctionOnNextCall(testSIMDShuffleu32);
569 testSIMDShuffleu32();
571 function testSIMDComparisons() {
572 var m = SIMD.int32x4(1, 2, 100, 1);
573 var n = SIMD.int32x4(2, 2, 1, 100);
575 cmp = SIMD.int32x4.lessThan(m, n);
576 assertEquals(-1, cmp.x);
577 assertEquals(0x0, cmp.y);
578 assertEquals(0x0, cmp.z);
579 assertEquals(-1, cmp.w);
581 cmp = SIMD.int32x4.equal(m, n);
582 assertEquals(0x0, cmp.x);
583 assertEquals(-1, cmp.y);
584 assertEquals(0x0, cmp.z);
585 assertEquals(0x0, cmp.w);
587 cmp = SIMD.int32x4.greaterThan(m, n);
588 assertEquals(0x0, cmp.x);
589 assertEquals(0x0, cmp.y);
590 assertEquals(-1, cmp.z);
591 assertEquals(0x0, cmp.w);
594 testSIMDComparisons();
595 testSIMDComparisons();
596 %OptimizeFunctionOnNextCall(testSIMDComparisons);
597 testSIMDComparisons();
599 function testSIMDShift() {
600 var m = SIMD.int32x4(1, 2, 100, 0);
602 var a = SIMD.int32x4.shiftLeft(m, 2);
603 assertEquals(4, a.x);
604 assertEquals(8, a.y);
605 assertEquals(400, a.z);
606 assertEquals(0, a.w);
608 var b = SIMD.int32x4.shiftRight(a, 2);
609 assertEquals(1, b.x);
610 assertEquals(2, b.y);
611 assertEquals(100, b.z);
612 assertEquals(0, b.w);
614 var n = SIMD.int32x4(-8, 2, 1, 100);
616 var c = SIMD.int32x4.shiftRightArithmetic(n, 2);
617 assertEquals(-2, c.x);
618 assertEquals(0, c.y);
619 assertEquals(0, c.z);
620 assertEquals(25, c.w);
625 %OptimizeFunctionOnNextCall(testSIMDShift);
628 function testInt32x4ArrayBasic() {
629 var a = new Int32x4Array(1);
630 assertEquals(1, a.length);
631 assertEquals(16, a.byteLength);
632 assertEquals(16, a.BYTES_PER_ELEMENT);
633 assertEquals(16, Int32x4Array.BYTES_PER_ELEMENT);
634 assertEquals(0, a.byteOffset);
635 assertTrue(undefined != a.buffer);
636 var b = new Int32x4Array(4);
637 assertEquals(4, b.length);
638 assertEquals(64, b.byteLength);
639 assertEquals(16, b.BYTES_PER_ELEMENT);
640 assertEquals(16, Int32x4Array.BYTES_PER_ELEMENT);
641 assertEquals(0, b.byteOffset);
642 assertTrue(undefined != b.buffer);
645 testInt32x4ArrayBasic();
647 function testInt32x4ArrayGetAndSet() {
648 var a = new Int32x4Array(4);
649 a[0] = SIMD.int32x4(1, 2, 3, 4);
650 a[1] = SIMD.int32x4(5, 6, 7, 8);
651 a[2] = SIMD.int32x4(9, 10, 11, 12);
652 a[3] = SIMD.int32x4(13, 14, 15, 16);
653 assertEquals(a[0].x, 1);
654 assertEquals(a[0].y, 2);
655 assertEquals(a[0].z, 3);
656 assertEquals(a[0].w, 4);
658 assertEquals(a[1].x, 5);
659 assertEquals(a[1].y, 6);
660 assertEquals(a[1].z, 7);
661 assertEquals(a[1].w, 8);
663 assertEquals(a[2].x, 9);
664 assertEquals(a[2].y, 10);
665 assertEquals(a[2].z, 11);
666 assertEquals(a[2].w, 12);
668 assertEquals(a[3].x, 13);
669 assertEquals(a[3].y, 14);
670 assertEquals(a[3].z, 15);
671 assertEquals(a[3].w, 16);
673 var b = new Int32x4Array(4);
674 b.setAt(0,SIMD.int32x4(1, 2, 3, 4));
675 b.setAt(1,SIMD.int32x4(5, 6, 7, 8));
676 b.setAt(2,SIMD.int32x4(9, 10, 11, 12));
677 b.setAt(3,SIMD.int32x4(13, 14, 15, 16));
679 assertEquals(b.getAt(0).x, 1);
680 assertEquals(b.getAt(0).y, 2);
681 assertEquals(b.getAt(0).z, 3);
682 assertEquals(b.getAt(0).w, 4);
684 assertEquals(b.getAt(1).x, 5);
685 assertEquals(b.getAt(1).y, 6);
686 assertEquals(b.getAt(1).z, 7);
687 assertEquals(b.getAt(1).w, 8);
689 assertEquals(b.getAt(2).x, 9);
690 assertEquals(b.getAt(2).y, 10);
691 assertEquals(b.getAt(2).z, 11);
692 assertEquals(b.getAt(2).w, 12);
694 assertEquals(b.getAt(3).x, 13);
695 assertEquals(b.getAt(3).y, 14);
696 assertEquals(b.getAt(3).z, 15);
697 assertEquals(b.getAt(3).w, 16);
700 testInt32x4ArrayGetAndSet();
702 function testInt32x4ArraySwap() {
703 var a = new Int32x4Array(4);
704 a[0] = SIMD.int32x4(1, 2, 3, 4);
705 a[1] = SIMD.int32x4(5, 6, 7, 8);
706 a[2] = SIMD.int32x4(9, 10, 11, 12);
707 a[3] = SIMD.int32x4(13, 14, 15, 16);
709 // Swap element 0 and element 3
714 assertEquals(a[3].x, 1);
715 assertEquals(a[3].y, 2);
716 assertEquals(a[3].z, 3);
717 assertEquals(a[3].w, 4);
719 assertEquals(a[1].x, 5);
720 assertEquals(a[1].y, 6);
721 assertEquals(a[1].z, 7);
722 assertEquals(a[1].w, 8);
724 assertEquals(a[2].x, 9);
725 assertEquals(a[2].y, 10);
726 assertEquals(a[2].z, 11);
727 assertEquals(a[2].w, 12);
729 assertEquals(a[0].x, 13);
730 assertEquals(a[0].y, 14);
731 assertEquals(a[0].z, 15);
732 assertEquals(a[0].w, 16);
735 testInt32x4ArraySwap();
736 testInt32x4ArraySwap();
737 %OptimizeFunctionOnNextCall(testInt32x4ArraySwap);
738 testInt32x4ArraySwap();
740 function testInt32x4ArrayCopy() {
741 var a = new Int32x4Array(4);
742 a[0] = SIMD.int32x4(1, 2, 3, 4);
743 a[1] = SIMD.int32x4(5, 6, 7, 8);
744 a[2] = SIMD.int32x4(9, 10, 11, 12);
745 a[3] = SIMD.int32x4(13, 14, 15, 16);
746 var b = new Int32x4Array(a);
747 assertEquals(a[0].x, b[0].x);
748 assertEquals(a[0].y, b[0].y);
749 assertEquals(a[0].z, b[0].z);
750 assertEquals(a[0].w, b[0].w);
752 assertEquals(a[1].x, b[1].x);
753 assertEquals(a[1].y, b[1].y);
754 assertEquals(a[1].z, b[1].z);
755 assertEquals(a[1].w, b[1].w);
757 assertEquals(a[2].x, b[2].x);
758 assertEquals(a[2].y, b[2].y);
759 assertEquals(a[2].z, b[2].z);
760 assertEquals(a[2].w, b[2].w);
762 assertEquals(a[3].x, b[3].x);
763 assertEquals(a[3].y, b[3].y);
764 assertEquals(a[3].z, b[3].z);
765 assertEquals(a[3].w, b[3].w);
767 a[2] = SIMD.int32x4(17, 18, 19, 20);
769 assertEquals(a[2].x, 17);
770 assertEquals(a[2].y, 18);
771 assertEquals(a[2].z, 19);
772 assertEquals(a[2].w, 20);
774 assertTrue(a[2].x != b[2].x);
775 assertTrue(a[2].y != b[2].y);
776 assertTrue(a[2].z != b[2].z);
777 assertTrue(a[2].w != b[2].w);
780 testInt32x4ArrayCopy();
782 function testInt32x4ArrayViewBasic() {
783 var a = new Uint32Array(8);
784 // view with no offset.
785 var b = new Int32x4Array(a.buffer, 0);
787 var c = new Int32x4Array(a.buffer, 16);
788 // view with no offset but shorter than original list.
789 var d = new Int32x4Array(a.buffer, 0, 1);
790 assertEquals(a.length, 8);
791 assertEquals(b.length, 2);
792 assertEquals(c.length, 1);
793 assertEquals(d.length, 1);
794 assertEquals(a.byteLength, 32);
795 assertEquals(b.byteLength, 32);
796 assertEquals(c.byteLength, 16);
797 assertEquals(d.byteLength, 16)
798 assertEquals(a.byteOffset, 0);
799 assertEquals(b.byteOffset, 0);
800 assertEquals(c.byteOffset, 16);
801 assertEquals(d.byteOffset, 0);
804 testInt32x4ArrayViewBasic();
806 function testInt32x4ArrayViewValues() {
807 var a = new Uint32Array(8);
808 var b = new Int32x4Array(a.buffer, 0);
809 var c = new Int32x4Array(a.buffer, 16);
810 var d = new Int32x4Array(a.buffer, 0, 1);
812 for (var i = 0; i < b.length; i++) {
813 assertEquals(0, b[i].x);
814 assertEquals(0, b[i].y);
815 assertEquals(0, b[i].z);
816 assertEquals(0, b[i].w);
818 for (var i = 0; i < c.length; i++) {
819 assertEquals(0, c[i].x);
820 assertEquals(0, c[i].y);
821 assertEquals(0, c[i].z);
822 assertEquals(0, c[i].w);
824 for (var i = 0; i < d.length; i++) {
825 assertEquals(0, d[i].x);
826 assertEquals(0, d[i].y);
827 assertEquals(0, d[i].z);
828 assertEquals(0, d[i].w);
830 for (var i = 0; i < a.length; i++) {
833 for (var i = 0; i < b.length; i++) {
834 assertTrue(0 != b[i].x);
835 assertTrue(0 != b[i].y);
836 assertTrue(0 != b[i].z);
837 assertTrue(0 != b[i].w);
839 for (var i = 0; i < c.length; i++) {
840 assertTrue(0 != c[i].x);
841 assertTrue(0 != c[i].y);
842 assertTrue(0 != c[i].z);
843 assertTrue(0 != c[i].w);
845 for (var i = 0; i < d.length; i++) {
846 assertTrue(0 != d[i].x);
847 assertTrue(0 != d[i].y);
848 assertTrue(0 != d[i].z);
849 assertTrue(0 != d[i].w);
851 assertEquals(start+0, b[0].x);
852 assertEquals(start+1, b[0].y);
853 assertEquals(start+2, b[0].z);
854 assertEquals(start+3, b[0].w);
855 assertEquals(start+4, b[1].x);
856 assertEquals(start+5, b[1].y);
857 assertEquals(start+6, b[1].z);
858 assertEquals(start+7, b[1].w);
860 assertEquals(start+4, c[0].x);
861 assertEquals(start+5, c[0].y);
862 assertEquals(start+6, c[0].z);
863 assertEquals(start+7, c[0].w);
865 assertEquals(start+0, d[0].x);
866 assertEquals(start+1, d[0].y);
867 assertEquals(start+2, d[0].z);
868 assertEquals(start+3, d[0].w);
871 testInt32x4ArrayViewValues();
873 function testViewOnInt32x4Array() {
874 var a = new Int32x4Array(4);
875 a[0] = SIMD.int32x4(1, 2, 3, 4);
876 a[1] = SIMD.int32x4(5, 6, 7, 8);
877 a[2] = SIMD.int32x4(9, 10, 11, 12);
878 a[3] = SIMD.int32x4(13, 14, 15, 16);
879 assertEquals(a[0].x, 1);
880 assertEquals(a[0].y, 2);
881 assertEquals(a[0].z, 3);
882 assertEquals(a[0].w, 4);
884 assertEquals(a[1].x, 5);
885 assertEquals(a[1].y, 6);
886 assertEquals(a[1].z, 7);
887 assertEquals(a[1].w, 8);
889 assertEquals(a[2].x, 9);
890 assertEquals(a[2].y, 10);
891 assertEquals(a[2].z, 11);
892 assertEquals(a[2].w, 12);
894 assertEquals(a[3].x, 13);
895 assertEquals(a[3].y, 14);
896 assertEquals(a[3].z, 15);
897 assertEquals(a[3].w, 16);
900 var b = new Uint32Array(a.buffer);
901 assertEquals(b.length, 16);
902 assertEquals(b.byteLength, 64);
906 // Observe changes in "a"
907 assertEquals(a[0].x, 1);
908 assertEquals(a[0].y, 2);
909 assertEquals(a[0].z, 99);
910 assertEquals(a[0].w, 4);
912 assertEquals(a[1].x, 5);
913 assertEquals(a[1].y, 6);
914 assertEquals(a[1].z, 1);
915 assertEquals(a[1].w, 8);
917 assertEquals(a[2].x, 9);
918 assertEquals(a[2].y, 10);
919 assertEquals(a[2].z, 11);
920 assertEquals(a[2].w, 12);
922 assertEquals(a[3].x, 13);
923 assertEquals(a[3].y, 14);
924 assertEquals(a[3].z, 15);
925 assertEquals(a[3].w, 16);
928 testViewOnInt32x4Array();
930 function testArrayOfInt32x4() {
932 var a4 = new Int32x4Array(2);
933 for (var i = 0; i < a4.length; i++) {
934 a[i] = SIMD.int32x4(i, i + 1, i + 2, i + 3);
935 a4[i] = SIMD.int32x4(i, i + 1, i + 2, i + 3);
938 for (var i = 0; i < a4.length; i++) {
939 assertEquals(a[i].x, a4[i].x);
940 assertEquals(a[i].y, a4[i].y);
941 assertEquals(a[i].z, a4[i].z);
942 assertEquals(a[i].w, a4[i].w);
946 testArrayOfInt32x4();