blob: 128cc35a6a8dc8ae102b7ff4a9444c2e9c332c6c [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft Corporation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
this.WScript.LoadScriptFile("..\\UnitTestFramework\\SimdJsHelpers.js");
function asmModule(stdlib, imports, buffer) {
"use asm";
var i4 = stdlib.SIMD.Int32x4;
var i4check = i4.check;
var i4splat = i4.splat;
var i4fromFloat32x4 = i4.fromFloat32x4;
var i4fromFloat32x4Bits = i4.fromFloat32x4Bits;
//var i4abs = i4.abs;
var i4neg = i4.neg;
var i4add = i4.add;
var i4sub = i4.sub;
var i4mul = i4.mul;
var i4swizzle = i4.swizzle;
var i4shuffle = i4.shuffle;
var i4lessThan = i4.lessThan;
var i4equal = i4.equal;
var i4greaterThan = i4.greaterThan;
var i4select = i4.select;
var i4and = i4.and;
var i4or = i4.or;
var i4xor = i4.xor;
var i4not = i4.not;
var i4shiftLeftByScalar = i4.shiftLeftByScalar;
var i4shiftRightByScalar = i4.shiftRightByScalar;
var f4 = stdlib.SIMD.Float32x4;
var f4check = f4.check;
var f4splat = f4.splat;
var f4fromInt32x4 = f4.fromInt32x4;
var f4fromInt32x4Bits = f4.fromInt32x4Bits;
var f4abs = f4.abs;
var f4neg = f4.neg;
var f4add = f4.add;
var f4sub = f4.sub;
var f4mul = f4.mul;
var f4div = f4.div;
var f4min = f4.min;
var f4max = f4.max;
var f4sqrt = f4.sqrt;
var f4swizzle = f4.swizzle;
var f4shuffle = f4.shuffle;
var f4lessThan = f4.lessThan;
var f4lessThanOrEqual = f4.lessThanOrEqual;
var f4equal = f4.equal;
var f4notEqual = f4.notEqual;
var f4greaterThan = f4.greaterThan;
var f4greaterThanOrEqual = f4.greaterThanOrEqual;
var f4load = f4.load;
var f4load1 = f4.load1;
var f4load2 = f4.load2;
var f4load3 = f4.load3;
var f4store = f4.store;
var f4store1 = f4.store1;
var f4store2 = f4.store2;
var f4store3 = f4.store3;
var f4select = f4.select;
var fround = stdlib.Math.fround;
var globImportF4 = f4check(imports.g1); // global var import
var globImportI4 = i4check(imports.g2); // global var import
var g1 = f4(-5033.2,-3401.0,665.34,32234.1); // global var initialized
var g2 = i4(1065353216, -1073741824, -1077936128, 1082130432); // global var initialized
var gval = 1234;
var gval2 = 1234.0;
var loopCOUNT = 3;
var Int8Array = stdlib.Int8Array;
var Uint8Array = stdlib.Uint8Array;
var Int16Array = stdlib.Int16Array;
var Uint16Array = stdlib.Uint16Array;
var Int32Array = stdlib.Int32Array;
var Uint32Array = stdlib.Uint32Array;
var Float32Array = stdlib.Float32Array;
var Int8Heap = new stdlib.Int8Array (buffer);
var Uint8Heap = new stdlib.Uint8Array (buffer);
var Int16Heap = new stdlib.Int16Array(buffer);
var Uint16Heap = new stdlib.Uint16Array(buffer);
var Int32Heap = new stdlib.Int32Array(buffer);
var Uint32Heap = new stdlib.Uint32Array(buffer);
var Float32Heap = new stdlib.Float32Array(buffer);
var len=stdlib.byteLength;
function ch(newBuffer)
{
if(len(newBuffer) & 0xffffff || len(newBuffer) <= 0xffffff || len(newBuffer) > 0x80000000)
return false;
Int8Heap = new Int8Array(newBuffer);
Uint8Heap = new Uint8Array(newBuffer);
Int16Heap = new Int16Array(newBuffer);
Uint16Heap = new Uint16Array(newBuffer);
Int32Heap = new Int32Array(newBuffer);
Uint32Heap = new Uint32Array(newBuffer);
Float32Heap = new Float32Array(newBuffer);
buffer=newBuffer;
return true;
}
function storeF32(value, idx)
{
value= f4check(value);
idx = idx|0;
idx = idx<<2;
f4store(Float32Heap, (idx>>2), value);
}
function loadF32(idx)
{
idx = idx|0;
idx = idx<<2;
return f4load(Float32Heap, (idx>>2));
}
function storeUI32(value, idx)
{ value= f4check(value); idx = idx|0; idx = idx<<2;
f4store(Uint32Heap, (idx>>2), value);}
function loadUI32(idx)
{ idx = idx|0; idx = idx<<2; return f4load(Uint32Heap, (idx>>2)); }
function storeI32(value, idx)
{ value= f4check(value); idx = idx|0; idx = idx<<2;
f4store(Int32Heap, (idx>>2), value);}
function loadI32(idx)
{ idx = idx|0; idx = idx<<2; return f4load(Int32Heap, (idx>>2)); }
function storeI16(value, idx)
{ value= f4check(value); idx = idx|0; idx = idx<<1;
f4store(Int16Heap, (idx>>1), value);}
function loadI16(idx)
{ idx = idx|0; idx = idx<<1; return f4load(Int16Heap, (idx>>1)); }
function storeUI16(value, idx)
{ value= f4check(value); idx = idx|0; idx = idx<<1;
f4store(Uint16Heap, (idx>>1), value);}
function loadUI16(idx)
{ idx = idx|0; idx = idx<<1; return f4load(Uint16Heap, (idx>>1)); }
function storeI8(value, idx)
{ value= f4check(value); idx = idx|0; idx = idx<<0;
f4store(Int8Heap, (idx>>0), value);}
function loadI8(idx)
{ idx = idx|0; idx = idx<<0; return f4load(Int8Heap, (idx>>0)); }
function storeUI8(value, idx)
{ value= f4check(value); idx = idx|0; idx = idx<<0;
f4store(Uint8Heap, (idx>>0), value);}
function loadUI8(idx)
{ idx = idx|0; idx = idx<<0; return f4load(Uint8Heap, (idx>>0)); }
function loadStoreIndex1()
{
f4store(Float32Heap, 0, f4(-1.0,-2.0,3.1,-4.0));
return f4load(Float32Heap, 0);
}
function store_1(functionPicker) //Function picker to pick store1/store2/store3/store
{
functionPicker = functionPicker|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 256;
while((loopIndex|0) < (loopCOUNT|0))
{
idx = 0;
v0 = f4(5.1,-12.3,-0.0,0.0);
for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
{
switch(functionPicker|0)
{
case 5:
f4store(Float32Heap, idx>>2, v0);
break;
case 6:
f4store1(Float32Heap, idx>>2, v0);
break;
case 7:
f4store2(Float32Heap, idx>>2, v0);
break;
case 8:
f4store3(Float32Heap, idx>>2, v0);
break;
default:
break;
}
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex + 1)|0;
}
//Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
return f4load(Float32Heap, 0);
//Alternate validation
// for(idx = 0; idx << 2 < end << 2; idx = (idx + 4 << 2)|0)
// {
// verify buffer view is as expected.
// 0,0,0,0,1,1,1,1,2,2,2,2...
// }
}
function store_2(functionPicker)
{
functionPicker = functionPicker|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 256;
for (loopIndex = 0; (loopIndex | 0) < (loopCOUNT | 0) ; loopIndex = (loopIndex + 1) | 0)
{
idx = 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
{
switch(functionPicker|0)
{
case 5:
f4store(Float32Heap, idx>>2, v0);
break;
case 6:
f4store1(Float32Heap, idx>>2, v0);
break;
case 7:
f4store2(Float32Heap, idx>>2, v0);
break;
case 8:
f4store3(Float32Heap, idx>>2, v0);
break;
default:
break;
}
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
}
return f4load(Float32Heap, 8);
}
function store_3(functionPicker)
{
functionPicker = functionPicker|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 256;
loopIndex = loopCOUNT | 0;
do {
idx = 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
{
switch(functionPicker|0)
{
case 5:
f4store(Float32Heap, idx>>2, v0);
break;
case 6:
f4store1(Float32Heap, idx>>2, v0);
break;
case 7:
f4store2(Float32Heap, idx>>2, v0);
break;
case 8:
f4store3(Float32Heap, idx>>2, v0);
break;
default:
break;
}
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex - 1) | 0;
}
while ( (loopIndex | 0) > 0);
return f4load(Float32Heap, 8);
}
function store_1_Int8(length)
{
length = length|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 0;
end = (length * 4)|0;
while((loopIndex|0) < (loopCOUNT|0))
{
idx = (end - 4096) | 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 0; (idx|0) < (end|0 << 0); idx = (idx + 16)|0)
{
f4store(Int8Heap, idx>>0, v0);
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex + 1)|0;
}
//Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
return f4load(Float32Heap, 2);
}
function store_1_Uint8(length)
{
length = length|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 0;
end = (length * 4)|0;
while((loopIndex|0) < (loopCOUNT|0))
{
idx = (end - 4096) | 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 0; (idx|0) < (end|0 << 0); idx = (idx + 16)|0)
{
f4store(Uint8Heap, idx>>0, v0);
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex + 1)|0;
}
//Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
return f4load(Float32Heap, 2);
}
function store_1_Int16(length)
{
length = length|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 0;
end = (length * 4)|0;
while((loopIndex|0) < (loopCOUNT|0))
{
idx = (end - 4096) | 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 1; (idx|0) < (end|0 << 1); idx = (idx + 16)|0)
{
f4store(Int16Heap, idx>>1, v0);
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex + 1)|0;
}
//Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
return f4load(Float32Heap, 2);
}
function store_1_Uint16(length)
{
length = length|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 0;
end = (length * 4)|0;
while((loopIndex|0) < (loopCOUNT|0))
{
idx = (end - 4096) | 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 1; (idx|0) < (end|0 << 1); idx = (idx + 16)|0)
{
f4store(Uint16Heap, idx>>1, v0);
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex + 1)|0;
}
//Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
return f4load(Float32Heap, 2);
}
function store_1_Int32(length)
{
length = length|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 0;
end = (length * 4)|0;
while((loopIndex|0) < (loopCOUNT|0))
{
idx = (end - 4096) | 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
{
f4store(Int32Heap, idx>>2, v0);
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex + 1)|0;
}
//Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
return f4load(Float32Heap, 2);
}
function store_1_Uint32(length)
{
length = length|0;
var v0 = f4(0.0,0.0,0.0,0.0);
var loopIndex = 0, idx = 0, end = 0;
end = (length * 4)|0;
while((loopIndex|0) < (loopCOUNT|0))
{
idx = (end - 4096) | 0;
v0 = f4(0.0,0.0,0.0,0.0);
for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
{
f4store(Uint32Heap, idx>>2, v0);
v0 = f4add(v0, f4(1.0,1.0,1.0,1.0));
}
loopIndex = (loopIndex + 1)|0;
}
//Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
return f4load(Float32Heap, 2);
}
////////////////////////////Load////////////////////////////
function load_1(functionPicker)
{
//length = length|0;
functionPicker = functionPicker|0;
var idx=0,end=16;//(length-4)|0;;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
while ( (loopIndex|0) < (loopCOUNT|0)) {
idx=0;
for(idx = idx<<2; (idx|0) <= (end<<2); idx = (idx + 1)|0)
{
switch(functionPicker|0)
{
case 1:
v = f4load(Float32Heap, idx>>2);
break;
case 2:
v = f4load1(Float32Heap, idx>>2);
break;
case 3:
v = f4load2(Float32Heap, idx>>2);
break;
case 4:
v = f4load3(Float32Heap, idx>>2);
break;
default:
break;
}
}
loopIndex = (loopIndex + 1) | 0;
}
return v;
}
function load_2(functionPicker)
{
//length = length|0;
functionPicker = functionPicker|0;
var idx=0,end=16;//(length-4)|0;;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
for (loopIndex = 0; (loopIndex | 0) < (loopCOUNT | 0) ; loopIndex = (loopIndex + 1) | 0)
{
idx=0;
for(idx = idx<<2; (idx|0) <= (end<<2); idx = (idx + 1)|0)
{
switch(functionPicker|0)
{
case 1:
v = f4load(Float32Heap, idx>>2);
break;
case 2:
v = f4load1(Float32Heap, idx>>2);
break;
case 3:
v = f4load2(Float32Heap, idx>>2);
break;
case 4:
v = f4load3(Float32Heap, idx>>2);
break;
default:
break;
}
}
}
return v;
}
function load_3(functionPicker)
{
//length = length|0;
functionPicker = functionPicker|0;
var idx=0,end=16;//(length-4)|0;;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
loopIndex = loopCOUNT | 0;
do {
idx = 0;
for(idx = idx<<2; (idx|0) <= (end<<2); idx = (idx + 1)|0)
{
switch(functionPicker|0)
{
case 1:
v = f4load(Float32Heap, idx>>2);
break;
case 2:
v = f4load1(Float32Heap, idx>>2);
break;
case 3:
v = f4load2(Float32Heap, idx>>2);
break;
case 4:
v = f4load3(Float32Heap, idx>>2);
break;
default:
break;
}
}
loopIndex = (loopIndex - 1) | 0;
}
while ( (loopIndex | 0) > 0);
return v;
}
function load_1_Int8(length)
{
length = length|0;
var idx=0,end=0;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
end = (((length * 4)|0) - 16)|0;
while ( (loopIndex|0) < (loopCOUNT|0)) {
idx= (end - 4096) | 0;
for(idx = idx<<0; (idx|0) <= (end<<0); idx = (idx + 1)|0)
{
v = f4load(Int8Heap, idx>>0);
}
loopIndex = (loopIndex + 1) | 0;
}
return v;
}
function load_1_Uint8(length)
{
length = length|0;
var idx=0,end=0;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
end = (((length * 4)|0) - 16)|0;
while ( (loopIndex|0) < (loopCOUNT|0)) {
idx= (((length * 4)|0) - 4096) | 0;
for(idx = idx<<0; (idx|0) <= (end<<0); idx = (idx + 1)|0)
{
v = f4load(Uint8Heap, idx>>0);
}
loopIndex = (loopIndex + 1) | 0;
}
return v;
}
function load_1_Int16(length)
{
length = length|0;
var idx=0,end=0;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
end = (((length * 2)|0) - 8)|0;
while ( (loopIndex|0) < (loopCOUNT|0)) {
idx= (end - 4096) | 0;
for(idx = idx<<1; (idx|0) <= (end<<1); idx = (idx + 1)|0)
{
v = f4load(Int16Heap, idx>>1);
}
loopIndex = (loopIndex + 1) | 0;
}
return v;
}
function load_1_Uint16(length)
{
length = length|0;
var idx=0,end=120;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
end = (((length * 2)|0) - 8)|0;
while ( (loopIndex|0) < (loopCOUNT|0)) {
idx= (end - 4096) | 0;
for(idx = idx<<1; (idx|0) <= (end<<1); idx = (idx + 1)|0)
{
v = f4load(Uint16Heap, idx>>1);
}
loopIndex = (loopIndex + 1) | 0;
}
return v;
}
function load_1_Int32(length)
{
length = length|0;
var idx=0,end=60;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
end = (((length * 1)|0) - 4)|0;
while ( (loopIndex|0) < (loopCOUNT|0)) {
idx= (end - 4096) | 0;
for(idx = idx<<2; (idx|0) <= (end<<2); idx = (idx + 1)|0)
{
v = f4load(Int32Heap, idx>>2);
}
loopIndex = (loopIndex + 1) | 0;
}
return v;
}
function load_1_Uint32(length)
{
length = length|0;
var idx=0,end=60;
var loopIndex = 0;
var v = f4(0.0,0.0,0.0,0.0);
end = (((length * 1)|0) - 4)|0;
while ( (loopIndex|0) < (loopCOUNT|0)) {
idx= (end - 4096) | 0;
for(idx = idx<<2; (idx|0) <= (end<<2); idx = (idx + 1)|0)
{
v = f4load(Uint32Heap, idx>>2);
}
loopIndex = (loopIndex + 1) | 0;
}
return v;
}
return {
changeHeap:ch
,store1:store_1
,store2:store_2
,store3:store_3
,store1Int8:store_1_Int8
,store1Uint8:store_1_Uint8
,store1Int16:store_1_Int16
,store1Uint16:store_1_Uint16
,store1Int32:store_1_Int32
,store1Uint32:store_1_Uint32
,load1:load_1
,load2:load_2
,load3:load_3
,load1Int8:load_1_Int8
,load1Uint8:load_1_Uint8
,load1Int16:load_1_Int16
,load1Uint16:load_1_Uint16
,load1Int32:load_1_Int32
,load1Uint32:load_1_Uint32
,loadF32:loadF32
,storeF32:storeF32
,storeUI32:storeUI32
,loadUI32:loadUI32
,storeI32:storeI32
,loadI32:loadI32
,storeI16:storeI16
,loadI16:loadI16
,storeUI16:storeUI16
,loadUI16:loadUI16
,storeI8:storeI8
,loadI8:loadI8
,storeUI8:storeUI8
,loadUI8:loadUI8
,loadStoreIndex1:loadStoreIndex1};
}
var buffer = new ArrayBuffer(0x1000000); //16mb min 2^12
//Reset or flush the buffer
function initF32(buffer) {
var values = new Float32Array( buffer );
for( var i=0; i < values.length ; ++i ) {
values[i] = i * 10;
}
return values.length;
}
function printBuffer(buffer, count)
{
var f4;
for (var i = 0; i < count/* * 16*/; i += 16)
{
f4 = SIMD.Float32x4.load(buffer, i);
print(f4.toString());
}
}
function printResults(res)
{
print(typeof(res));
print(res.toString());
}
inputLength = initF32(buffer);
print(inputLength);
//Enumerating SIMD loads to test.
SIMDLoad = 1;
SIMDLoad1 = 2;
SIMDLoad2 = 3;
SIMDLoad3 = 4;
SIMDStore = 5;
SIMDStore1 = 6;
SIMDStore2 = 7;
SIMDStore3 = 8;
//Module initialization
this['byteLength'] =
Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get);
var m = asmModule(this, {g0:initF32(buffer),g1:SIMD.Float32x4(9,9,9,9), g2:SIMD.Int32x4(1, 2, 3, 4)}, buffer);
var values = new Float32Array(buffer);
print("Stores:");
print("Test1");
inputLength = initF32(buffer);
var ret = m.store1(SIMDStore1);//Lane1 store
equalSimd([5.099999904632568, 10, 20, 30], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test2");;
inputLength = initF32(buffer);
var ret = m.store1(SIMDStore2);//Lane 1,2 store
equalSimd([5.099999904632568, -12.300000190734863, 20, 30], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test3");
inputLength = initF32(buffer);
var ret = m.store1(SIMDStore3);//Lane 1,2,3 store
equalSimd([5.099999904632568, -12.300000190734863, 0, 30], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test4");
inputLength = initF32(buffer);
var ret = m.store1(SIMDStore);//Generic Store
equalSimd([5.099999904632568, -12.300000190734863, 0, 0], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test5");
inputLength = initF32(buffer);
var ret = m.store2(SIMDStore);//Generic store
equalSimd([2, 2, 2, 2], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test6");
inputLength = initF32(buffer);
var ret = m.store3(SIMDStore);//Generic store
equalSimd([2,2,2,2], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test7");
inputLength = initF32(buffer);
var ret = m.store1Int8(inputLength);//Int8Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test8");
inputLength = initF32(buffer);
var ret = m.store1Uint8(inputLength);//Uint8Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test9");
inputLength = initF32(buffer);
var ret = m.store1Int16(inputLength);//Int16Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test10");
inputLength = initF32(buffer);
var ret = m.store1Uint16(inputLength);//Uint16Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test12");
inputLength = initF32(buffer);
var ret = m.store1Int32(inputLength);//Int32Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test13");
inputLength = initF32(buffer);
var ret = m.store1Uint32(inputLength);//Uint32Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Test14");
inputLength = initF32(buffer);
var ret = m.loadStoreIndex1();//Uint32Heap store
equalSimd([-1, -2, 3.0999999046325683, -4], ret, SIMD.Float32x4, "ResizeLoadStore");
print("Loads");
print("Test1");
var ret = m.load1(SIMDLoad1);
equalSimd([160, 0, 0, 0], ret, SIMD.Float32x4, "Resize Loads");
print("Test2");
var ret = m.load1(SIMDLoad2);
equalSimd([160, 170, 0, 0], ret, SIMD.Float32x4, "Resize Loads");
print("Test3");
var ret = m.load1(SIMDLoad3);
equalSimd([160, 170, 180, 0], ret, SIMD.Float32x4, "Resize Loads");
print("Test4");
var ret = m.load1(SIMDLoad);
equalSimd([160, 170, 180, 190 ], ret, SIMD.Float32x4, "Resize Loads");
print("Test5");
var ret = m.load2(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "Resize Loads");
print("Test6");
var ret = m.load3(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "Resize Loads");
print("Test7");
var ret = m.load1Int8(inputLength); //Int8Heap load
equalSimd([41943000, 41943008, 41943020, 41943032], ret, SIMD.Float32x4, "Resize Loads");
print("Test8");
var ret = m.load1Uint8(inputLength); //Int8Heap load
equalSimd([41943000, 41943008, 41943020, 41943032], ret, SIMD.Float32x4, "Resize Loads");
print("Test9");
var ret = m.load1Int16(inputLength); //Int16Heap load
equalSimd([41943000, 41943008, 41943020, 41943032], ret, SIMD.Float32x4, "Resize Loads");
print("Test10");
var ret = m.load1Uint16(inputLength); //Int16Heap load
equalSimd([41943000, 41943008, 41943020, 41943032], ret, SIMD.Float32x4, "Resize Loads");
print("Test11");
var ret = m.load1Int32(inputLength); //Int32Heap load
equalSimd([41943000, 41943008, 41943020, 41943032], ret, SIMD.Float32x4, "Resize Loads");
print("Test12");
var ret = m.load1Uint32(inputLength); //Int32Heap load
equalSimd([41943000, 41943008, 41943020, 41943032], ret, SIMD.Float32x4, "Resize Loads");
print("BoundCheck");
var value = SIMD.Float32x4(9.9,1.2,3.4,5.6);
print("Test1");
try {m.storeF32(value, inputLength); print("Wrong");} catch(err) {print("Correct");}
print("Test2");
try {m.loadF32(inputLength); print("Wrong");} catch(err) {print("Correct");}
print("Test3");
try {m.storeF32(value, inputLength-1); print("Wrong");} catch(err) {print("Correct");}
print("Test4");
try {m.loadF32(inputLength-1); print("Wrong");} catch(err) {print("Correct");}
print("Test5");
try {m.storeF32(value, inputLength-4);print("Correct");} catch(err) {print("Wrong");}
print("Test6");
try {var v = m.loadF32(inputLength-4);print("Correct");} catch(err) {print("Wrong");}
print("Test7");
try {m.storeUI32(value, inputLength+1);print("Wrong");} catch(err) {print("Correct");}
print("Test8");
try { m.loadUI32(inputLength+1); print("Wrong"); } catch(err) { print("Correct"); }
print("Test9");
try {m.storeI32(value, inputLength+1); print("Wrong");} catch(err) {print("Correct");}
print("Test10");
try {m.loadI32(inputLength+1);print("Wrong");} catch(err) {print("Correct");}
print("Test11");
try{
m.storeI16(value, inputLength*2-8);
print("Correct");
m.storeUI16(value, inputLength*2-8);
print("Correct");
m.storeI8(value, inputLength*4-16);
print("Correct");
m.storeUI8(value, inputLength*4-16);
print("Correct");
m.loadI16(inputLength*2-8);
print("Correct");
m.loadUI16(inputLength*2-8);
print("Correct");
m.loadI8(inputLength*4-16);
print("Correct");
m.loadUI8(inputLength*4-16);
print("Correct");
} catch(err){ print("Wrong"); }
print("Test12");
try {m.storeUI16(value, inputLength*2);print("Wrong");} catch(err) {print("Correct");}
print("Test13");
try {m.loadUI16(inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
print("Test14");
try {m.storeI16(value, inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
print("Test15");
try {m.loadI16(inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
print("Test16");
try {m.storeUI8(value, inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
print("Test17");
try {m.loadUI8(inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
print("Test18");
try {m.storeI8(value, inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
print("Test19");
try {m.loadI8(inputLength*4+15); print("Wrong");} catch(err) {print("Correct");}
// change buffer
var buffer = new ArrayBuffer(0x2000000);
print(m.changeHeap(buffer));
print(">>> ChangeHeap ");
print("Stores:");
print("Test1");
inputLength = initF32(buffer);
var ret = m.store1(SIMDStore1);//Lane1 store
equalSimd([5.099999904632568, 10, 20, 30], ret, SIMD.Float32x4, "Resize Stores");
print("Test2");;
inputLength = initF32(buffer);
var ret = m.store1(SIMDStore2);//Lane 1,2 store
equalSimd([5.099999904632568, -12.300000190734863, 20, 30], ret, SIMD.Float32x4, "Resize Stores");
print("Test3");
inputLength = initF32(buffer);
var ret = m.store1(SIMDStore3);//Lane 1,2,3 store
equalSimd([5.099999904632568, -12.300000190734863, 0, 30], ret, SIMD.Float32x4, "Resize Stores");
print("Test4");
inputLength = initF32(buffer);
//Should change the buffer to 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
var ret = m.store1(SIMDStore);//Generic Store
equalSimd([5.099999904632568, -12.300000190734863, 0, 0], ret, SIMD.Float32x4, "Resize Stores");
print("Test5");
inputLength = initF32(buffer);
var ret = m.store2(SIMDStore);//Generic store
equalSimd([2, 2, 2, 2], ret, SIMD.Float32x4, "Resize Stores");
print("Test6");
inputLength = initF32(buffer);
var ret = m.store3(SIMDStore);//Generic store
equalSimd([2, 2, 2, 2], ret, SIMD.Float32x4, "Resize Stores");
print("Test7");
inputLength = initF32(buffer);
var ret = m.store1Int8(inputLength);//Int8Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "Resize Stores");
print("Test8");
inputLength = initF32(buffer);
var ret = m.store1Uint8(inputLength);//Uint8Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "Resize Stores");
print("Test9");
inputLength = initF32(buffer);
var ret = m.store1Int16(inputLength);//Int16Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "Resize Stores");
print("Test10");
inputLength = initF32(buffer);
var ret = m.store1Uint16(inputLength);//Uint16Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "Resize Stores");
print("Test12");
inputLength = initF32(buffer);
var ret = m.store1Int32(inputLength);//Int32Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "Resize Stores");
print("Test13");
inputLength = initF32(buffer);
var ret = m.store1Uint32(inputLength);//Uint32Heap store
equalSimd([20, 30, 40, 50], ret, SIMD.Float32x4, "Resize Stores");
print("Test14");
inputLength = initF32(buffer);
var ret = m.loadStoreIndex1();//Uint32Heap store
equalSimd([-1, -2, 3.0999999046325683, -4], ret, SIMD.Float32x4, "Resize Stores");
print("Loads");
print("Test1");
var ret = m.load1(SIMDLoad1);
equalSimd([160, 0, 0, 0], ret, SIMD.Float32x4, "Resize Loads");
print("Test2");
var ret = m.load1(SIMDLoad2);
equalSimd([160, 170, 0, 0], ret, SIMD.Float32x4, "Resize Loads");
print("Test3");
var ret = m.load1(SIMDLoad3);
equalSimd([160, 170, 180, 0], ret, SIMD.Float32x4, "Resize Loads");
print("Test4");
var ret = m.load1(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "Resize Loads");
print("Test5");
var ret = m.load2(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "Resize Loads");
print("Test6");
var ret = m.load3(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "Resize Loads");
print("Test7");
var ret = m.load1Int8(inputLength); //Int8Heap load
equalSimd([83886040, 83886048, 83886064, 83886072], ret, SIMD.Float32x4, "Resize Loads");
print("Test8");
var ret = m.load1Uint8(inputLength); //Int8Heap load
equalSimd([83886040, 83886048, 83886064, 83886072], ret, SIMD.Float32x4, "Resize Loads");
print("Test9");
var ret = m.load1Int16(inputLength); //Int16Heap load
equalSimd([83886040, 83886048, 83886064, 83886072], ret, SIMD.Float32x4, "Resize Loads");
print("Test10");
var ret = m.load1Uint16(inputLength); //Int16Heap load
equalSimd([83886040, 83886048, 83886064, 83886072], ret, SIMD.Float32x4, "Resize Loads");
print("Test11");
var ret = m.load1Int32(inputLength); //Int32Heap load
equalSimd([83886040, 83886048, 83886064, 83886072], ret, SIMD.Float32x4, "Resize Loads");
print("Test12");
var ret = m.load1Uint32(inputLength); //Int32Heap load
equalSimd([83886040, 83886048, 83886064, 83886072], ret, SIMD.Float32x4, "Resize Loads");
print("BoundCheck");
var value = SIMD.Float32x4(9.9,1.2,3.4,5.6);
print("Test1");
try {m.storeF32(value, inputLength); print("Wrong");} catch(err) {print("Correct");}
print("Test2");
try {m.loadF32(inputLength); print("Wrong");} catch(err) {print("Correct");}
print("Test3");
try {m.storeF32(value, inputLength-1); print("Wrong");} catch(err) {print("Correct");}
print("Test4");
try {m.loadF32(inputLength-1); print("Wrong");} catch(err) {print("Correct");}
print("Test5");
try {m.storeF32(value, inputLength-4);print("Correct");} catch(err) {print("Wrong");}
print("Test6");
try {var v = m.loadF32(inputLength-4);print("Correct");} catch(err) {print("Wrong");}
print("Test7");
try {m.storeUI32(value, inputLength+1);print("Wrong");} catch(err) {print("Correct");}
print("Test8");
try { m.loadUI32(inputLength+1); print("Wrong"); } catch(err) { print("Correct"); }
print("Test9");
try {m.storeI32(value, inputLength+1); print("Wrong");} catch(err) {print("Correct");}
print("Test10");
try {m.loadI32(inputLength+1);print("Wrong");} catch(err) {print("Correct");}
print("Test11");
try{
m.storeI16(value, inputLength*2-8);
print("Correct");
m.storeUI16(value, inputLength*2-8);
print("Correct");
m.storeI8(value, inputLength*4-16);
print("Correct");
m.storeUI8(value, inputLength*4-16);
print("Correct");
m.loadI16(inputLength*2-8);
print("Correct");
m.loadUI16(inputLength*2-8);
print("Correct");
m.loadI8(inputLength*4-16);
print("Correct");
m.loadUI8(inputLength*4-16);
print("Correct");
} catch(err){ print("Wrong"); }
print("Test12");
try {m.storeUI16(value, inputLength*2);print("Wrong");} catch(err) {print("Correct");}
print("Test13");
try {m.loadUI16(inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
print("Test14");
try {m.storeI16(value, inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
print("Test15");
try {m.loadI16(inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
print("Test16");
try {m.storeUI8(value, inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
print("Test17");
try {m.loadUI8(inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
print("Test18");
try {m.storeI8(value, inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
print("Test19");
try {m.loadI8(inputLength*4+15); print("Wrong");} catch(err) {print("Correct");}