| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- function equal(a, b) {
- if (a == b)
- WScript.Echo("Correct");
- else
- WScript.Echo(">> Fail!");
- }
- var bufLanes = 2 * 4; //4 = lane size; Test all alignments.
- var bufSize = bufLanes * 4 + 8; //bufLanes * lane Size + 8; Extra for over-alignment test.
- var ab = new ArrayBuffer(bufSize);
- var buf = new Int32Array(ab);
- function checkBuffer(offset, count) {
- for (var i = 0; i < count; i++) {
- if (buf[offset + i] != i) {
- WScript.Echo(">> Fail!" + "offset + i:" + (offset + i) + "buf:" + buf[offset + i]);
- return false;
- }
- }
- WScript.Echo("Correct");
- return true;
- }
- function testStore() {
- WScript.Echo("Int32x4 store");
- var ta = new Int32Array(8);
- var value = SIMD.Int32x4(1, 2, 3, 4);
- SIMD.Int32x4.store(ta, 0, value);
- equal(ta[0], 1);
- equal(ta[1], 2);
- equal(ta[2], 3);
- equal(ta[3], 4);
- var a = SIMD.Int32x4(0, 1, 2, 3);
- // Test aligned stores.
- for (var i = 0; i < 4; i++) {
- SIMD.Int32x4.store(buf, i, a);
- checkBuffer(i, 4);
- }
- // Test the 2 over-alignments.
- var f64 = new Float64Array(ab);
- var stride = 8 / 4; // 4 = lane Size;
- for (var i = 0; i < 1; i++) {
- SIMD.Int32x4.store(f64, i, a);
- checkBuffer(stride * i, 4);
- }
- // Test the 7 mis-alignments.
- var i8 = new Int8Array(ab);
- for (var misalignment = 1; misalignment < 8; misalignment++) {
- SIMD.Int32x4.store(i8, misalignment, a);
- // Shift the buffer down by misalignment.
- for (var i = 0; i < i8.length - misalignment; i++)
- i8[i] = i8[i + misalignment];
- checkBuffer(0, 4);
- }
- }
- function testStore1() {
- WScript.Echo("Int32x4 store1");
- var ta = new Int32Array(8);
- var value = SIMD.Int32x4(1, 2, 3, 4);
- SIMD.Int32x4.store1(ta, 0, value);
- equal(ta[0], 1);
- equal(ta[1], 0);
- equal(ta[2], 0);
- equal(ta[3], 0);
- var a = SIMD.Int32x4(0, 1, 2, 3);
- // Test aligned stores.
- for (var i = 0; i < 4; i++) {
- SIMD.Int32x4.store1(buf, i, a);
- checkBuffer(i, 1);
- }
- // Test the 2 over-alignments.
- var f64 = new Float64Array(ab);
- var stride = 8 / 4; // 4 = lane Size;
- for (var i = 0; i < 1; i++) {
- SIMD.Int32x4.store1(f64, i, a);
- checkBuffer(stride * i, 1);
- }
- // Test the 7 mis-alignments.
- var i8 = new Int8Array(ab);
- for (var misalignment = 1; misalignment < 8; misalignment++) {
- SIMD.Int32x4.store1(i8, misalignment, a);
- // Shift the buffer down by misalignment.
- for (var i = 0; i < i8.length - misalignment; i++)
- i8[i] = i8[i + misalignment];
- checkBuffer(0, 1);
- }
- }
- function testStore2() {
- WScript.Echo("Int32x4 store2");
- var ta = new Int32Array(8);
- var value = SIMD.Int32x4(1, 2, 3, 4);
- SIMD.Int32x4.store2(ta, 0, value);
- equal(ta[0], 1);
- equal(ta[1], 2);
- equal(ta[2], 0);
- equal(ta[3], 0);
- var a = SIMD.Int32x4(0, 1, 2, 3);
- // Test aligned stores.
- for (var i = 0; i < 4; i++) {
- SIMD.Int32x4.store2(buf, i, a);
- checkBuffer(i, 2);
- }
- // Test the 2 over-alignments.
- var f64 = new Float64Array(ab);
- var stride = 8 / 4; // 4 = lane Size;
- for (var i = 0; i < 1; i++) {
- SIMD.Int32x4.store2(f64, i, a);
- checkBuffer(stride * i, 2);
- }
- // Test the 7 mis-alignments.
- var i8 = new Int8Array(ab);
- for (var misalignment = 1; misalignment < 8; misalignment++) {
- SIMD.Int32x4.store2(i8, misalignment, a);
- // Shift the buffer down by misalignment.
- for (var i = 0; i < i8.length - misalignment; i++)
- i8[i] = i8[i + misalignment];
- checkBuffer(0, 2);
- }
- }
- function testStore3() {
- WScript.Echo("Int32x4 store3");
- var ta = new Int32Array(8);
- var value = SIMD.Int32x4(1, 2, 3, 4);
- SIMD.Int32x4.store3(ta, 0, value);
- equal(ta[0], 1);
- equal(ta[1], 2);
- equal(ta[2], 3);
- equal(ta[3], 0);
- var a = SIMD.Int32x4(0, 1, 2, 3);
- // Test aligned stores.
- for (var i = 0; i < 4; i++) {
- SIMD.Int32x4.store3(buf, i, a);
- checkBuffer(i, 3);
- }
- // Test the 2 over-alignments.
- var f64 = new Float64Array(ab);
- var stride = 8 / 4; // 4 = lane Size;
- for (var i = 0; i < 1; i++) {
- SIMD.Int32x4.store3(f64, i, a);
- checkBuffer(stride * i, 3);
- }
- // Test the 7 mis-alignments.
- var i8 = new Int8Array(ab);
- for (var misalignment = 1; misalignment < 8; misalignment++) {
- SIMD.Int32x4.store3(i8, misalignment, a);
- // Shift the buffer down by misalignment.
- for (var i = 0; i < i8.length - misalignment; i++)
- i8[i] = i8[i + misalignment];
- checkBuffer(0, 3);
- }
- }
- testStore();
- testStore1();
- testStore2();
- testStore3();
|