//-------------------------------------------------------------------------------------------------------
// 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 i4load  = i4.load;
    var i4load1 = i4.load1;
    var i4load2 = i4.load2;
    var i4load3 = i4.load3;
    
    var i4store  = i4.store
    var i4store1 = i4.store1;
    var i4store2 = i4.store2;
    var i4store3 = i4.store3;
    
    //var i4shiftLeftByScalar = i4.shiftLeftByScalar;
    //var i4shiftRightByScalar = i4.shiftRightByScalar;
    //var i4shiftRightArithmeticByScalar = i4.shiftRightArithmeticByScalar;
    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 f4select = f4.select;
    
    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 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 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);    

     function storeF32(value, idx) 
    {
        value= i4check(value);
        idx = idx|0;
        idx = idx<<2;
        i4store(Float32Heap, (idx>>2), value);
    }
    function loadF32(idx) 
    {
        idx = idx|0;
        idx = idx<<2;
        return i4load(Float32Heap, (idx>>2));
    }
    
    function storeUI32(value, idx) 
    { value= i4check(value); idx = idx|0; idx = idx<<2; 
    i4store(Uint32Heap, (idx>>2), value);}
    function loadUI32(idx) 
    { idx = idx|0; idx = idx<<2; return i4load(Uint32Heap, (idx>>2)); }
    
    function storeI32(value, idx) 
    { value= i4check(value); idx = idx|0; idx = idx<<2; 
    i4store(Int32Heap, (idx>>2), value);}
    function loadI32(idx) 
    { idx = idx|0; idx = idx<<2; return i4load(Int32Heap, (idx>>2)); }
    
    function storeI16(value, idx) 
    { value= i4check(value); idx = idx|0; idx = idx<<1; 
    i4store(Int16Heap, (idx>>1), value);}
    function loadI16(idx) 
    { idx = idx|0; idx = idx<<1; return i4load(Int16Heap, (idx>>1)); }

    function storeUI16(value, idx) 
    { value= i4check(value); idx = idx|0; idx = idx<<1; 
    i4store(Uint16Heap, (idx>>1), value);}
    function loadUI16(idx) 
    { idx = idx|0; idx = idx<<1; return i4load(Uint16Heap, (idx>>1)); }

    function storeI8(value, idx) 
    { value= i4check(value); idx = idx|0; idx = idx<<0; 
    i4store(Int8Heap, (idx>>0), value);}
    function loadI8(idx) 
    { idx = idx|0; idx = idx<<0; return i4load(Int8Heap, (idx>>0)); }

    function storeUI8(value, idx) 
    { value= i4check(value); idx = idx|0; idx = idx<<0; 
    i4store(Uint8Heap, (idx>>0), value);}
    function loadUI8(idx) 
    { idx = idx|0; idx = idx<<0; return i4load(Uint8Heap, (idx>>0)); }
    
    function loadStoreIndex1()
    {
        i4store(Float32Heap, 0, i4(-1,-2,3,-4)); 
        return i4load(Float32Heap, 0);
    }
    
    function store_1(functionPicker) //Function picker to pick store1/store2/store3/store
    {
        functionPicker = functionPicker|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 256;        
        while((loopIndex|0) < (loopCOUNT|0)) 
        {
            idx = 0;
            v0 = i4(5, -12, 3, 0);
            for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
            {
                switch(functionPicker|0)
                {
                    case 5:
                        i4store(Float32Heap, idx>>2, v0); 
                        break;
                    case 6:
                        i4store1(Float32Heap, idx>>2, v0);
                        break;
                    case 7:
                        i4store2(Float32Heap, idx>>2, v0);
                        break;
                    case 8:
                        i4store3(Float32Heap, idx>>2, v0);
                        break;
                    default:
                        break;
                }
                v0 = i4add(v0, i4(1,1,1,1));
            }
            loopIndex = (loopIndex + 1)|0;
        }

        return i4load(Float32Heap, 0);

    }        
     function store_2(functionPicker)
    {
        functionPicker = functionPicker|0;
        var v0 = i4(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 = i4(0,0,0,0);
            for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
            {
                switch(functionPicker|0)
                {
                    case 5:
                        i4store(Float32Heap, idx>>2, v0); 
                        break;
                    case 6:
                        i4store1(Float32Heap, idx>>2, v0);
                        break;
                    case 7:
                        i4store2(Float32Heap, idx>>2, v0);
                        break;
                    case 8:
                        i4store3(Float32Heap, idx>>2, v0);
                        break;
                    default:
                        break;
                }
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
        }
        return i4load(Float32Heap, 8);
    } 
    function store_3(functionPicker)
    {
        functionPicker = functionPicker|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 256;    

        loopIndex = loopCOUNT | 0;
        do {
            idx = 0;
            v0 = i4(0,0,0,0);
        for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
            {
                switch(functionPicker|0)
                {
                    case 5:
                        i4store(Float32Heap, idx>>2, v0); 
                        break;
                    case 6:
                        i4store1(Float32Heap, idx>>2, v0);
                        break;
                    case 7:
                        i4store2(Float32Heap, idx>>2, v0);
                        break;
                    case 8:
                        i4store3(Float32Heap, idx>>2, v0);
                        break;
                    default:
                        break;
                }
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
            loopIndex = (loopIndex - 1) | 0;
        }
        while ( (loopIndex | 0) > 0);
        return i4load(Float32Heap, 8);
    } 
    function store_1_Int8(length) 
    {
        length = length|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 0;
        end = (length * 4)|0; 
        while((loopIndex|0) < (loopCOUNT|0)) 
        {
            idx = 0;
            v0 = i4(0,0,0,0);
            for(idx = idx << 0; (idx|0) < (end|0 << 0); idx = (idx + 16)|0)
            {
                i4store(Int8Heap, idx>>0, v0); 
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
            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 i4load(Float32Heap, 2);
    }
    function store_1_Uint8(length) 
    {
        length = length|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 0;
        end = (length * 4)|0; 
        while((loopIndex|0) < (loopCOUNT|0)) 
        {
            idx = 0;
            v0 = i4(0,0,0,0);
            for(idx = idx << 0; (idx|0) < (end|0 << 0); idx = (idx + 16)|0)
            {
                i4store(Uint8Heap, idx>>0, v0); 
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
            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 i4load(Float32Heap, 2);
    }
    function store_1_Int16(length) 
    {
        length = length|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 0;
        end = (length * 4)|0; 
        while((loopIndex|0) < (loopCOUNT|0)) 
        {
            idx = 0;
            v0 = i4(0,0,0,0);
            for(idx = idx << 1; (idx|0) < (end|0 << 1); idx = (idx + 16)|0)
            {
                i4store(Int16Heap, idx>>1, v0); 
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
            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 i4load(Float32Heap, 2);
    }    
    function store_1_Uint16(length) 
    {
        length = length|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 0;
        end = (length * 4)|0; 
        while((loopIndex|0) < (loopCOUNT|0)) 
        {
            idx = 0;
            v0 = i4(0,0,0,0);
            for(idx = idx << 1; (idx|0) < (end|0 << 1); idx = (idx + 16)|0)
            {
                i4store(Uint16Heap, idx>>1, v0); 
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
            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 i4load(Float32Heap, 2);
    }    
    function store_1_Int32(length) 
    {
        length = length|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 0;
        end = (length * 4)|0; 
        while((loopIndex|0) < (loopCOUNT|0)) 
        {
            idx = 0;
            v0 = i4(0,0,0,0);
            for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
            {
                i4store(Int32Heap, idx>>2, v0); 
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
            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 i4load(Float32Heap, 2);
    }    
    function store_1_Uint32(length) 
    {
        length = length|0;
        var v0 = i4(0,0,0,0);
        var loopIndex = 0, idx = 0, end = 0;
        end = (length * 4)|0; 
        while((loopIndex|0) < (loopCOUNT|0)) 
        {
            idx = 0;
            v0 = i4(0,0,0,0);
            for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
            {
                i4store(Uint32Heap, idx>>2, v0); 
                v0 = i4add(v0, i4(1, 1, 1, 1));
            }
            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 i4load(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 = i4(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 = i4load(Float32Heap, idx>>2); 
                        break;
                     case 2:
                        v = i4load1(Float32Heap, idx>>2);
                        break;
                    case 3:
                        v = i4load2(Float32Heap, idx>>2);
                        break;
                    case 4:
                        v = i4load3(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 = i4(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 = i4load(Float32Heap, idx>>2); 
                        break;
                     case 2:
                        v = i4load1(Float32Heap, idx>>2);
                        break;
                    case 3:
                        v = i4load2(Float32Heap, idx>>2);
                        break;
                    case 4:
                        v = i4load3(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 = i4(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 = i4load(Float32Heap, idx>>2); 
                        break;
                     case 2:
                        v = i4load1(Float32Heap, idx>>2);
                        break;
                    case 3:
                        v = i4load2(Float32Heap, idx>>2);
                        break;
                    case 4:
                        v = i4load3(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 = i4(0,0,0,0);
        end = (((length * 4)|0) - 16)|0;
        while ( (loopIndex|0) < (loopCOUNT|0)) {
            idx=0;
            for(idx = idx << 0; (idx|0) <= (end << 0); idx = (idx + 1)|0)
            {        
                v = i4load(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 = i4(0,0,0,0);
        end = (((length * 4)|0) - 16)|0;
        while ( (loopIndex|0) < (loopCOUNT|0)) {
            idx=0;
            for(idx = idx << 0; (idx|0) <= (end << 0); idx = (idx + 1)|0)
            {        
                v = i4load(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 = i4(0,0,0,0);
        end = (((length * 2)|0) - 8)|0;
        while ( (loopIndex|0) < (loopCOUNT|0)) {
            idx=0;
            for(idx = idx << 1; (idx|0) <= (end << 1); idx = (idx + 1)|0)
            {        
                v = i4load(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 = i4(0,0,0,0);
        end = (((length * 2)|0) - 8)|0;
        while ( (loopIndex|0) < (loopCOUNT|0)) {
            idx=0;
            for(idx = idx << 1; (idx|0) <= (end << 1); idx = (idx + 1)|0)
            {        
                v = i4load(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 = i4(0,0,0,0);
        end = (((length * 1)|0) - 4)|0;
        while ( (loopIndex|0) < (loopCOUNT|0)) {
            idx=0;
            for(idx = idx << 2; (idx|0) <= (end << 2); idx = (idx + 1)|0)
            {        
                v = i4load(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 = i4(0,0,0,0);
        end = (((length * 1)|0) - 4)|0;
        while ( (loopIndex|0) < (loopCOUNT|0)) {
            idx=0;
            for(idx = idx << 2; (idx|0) <= (end << 2); idx = (idx + 1)|0)
            {        
                v = i4load(Uint32Heap, idx>>2); 
            }
            loopIndex = (loopIndex + 1) | 0;
        }
        return v;
    }    
    
    return {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(0x10000); //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 i4;
    for (var i = 0; i < count/* * 16*/; i += 16)
    {
        i4 = SIMD.Int32x4.load(buffer, i);
        print(i4.toString());
    }
}

function printResults(res)
{
    print(typeof(res));
    print(res.toString());
}

inputLength = initF32(buffer);

//Enumerating SIMD loads to test. 
SIMDLoad = 1;
SIMDLoad1 = 2;
SIMDLoad2 = 3;
SIMDLoad3 = 4;

SIMDStore = 5;
SIMDStore1 = 6;
SIMDStore2 = 7;
SIMDStore3 = 8;

//Module initialization
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);


var ret = m.store1(SIMDStore1);//Lane1 store
equalSimd([5, 1092616192, 1101004800, 1106247680], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer); 
var ret = m.store1(SIMDStore2);//Lane 1,2 store
equalSimd([5, -12, 1101004800, 1106247680], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer); 
var ret = m.store1(SIMDStore3);//Lane 1,2,3 store
equalSimd([5, -12, 3, 1106247680], ret, SIMD.Int32x4, "");

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, -12, 3, 0], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer);  
var ret = m.store2(SIMDStore);//Generic store 
equalSimd([2, 2, 2, 2], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer); 
var ret = m.store3(SIMDStore);//Generic store
equalSimd([2, 2, 2, 2], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer); 
var ret = m.store1Int8(inputLength);//Int8Heap store
equalSimd([0, 0, 1, 1], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer); 
var ret = m.store1Uint8(inputLength);//Uint8Heap store
equalSimd([0, 0, 1, 1], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer); 
var ret = m.store1Int16(inputLength);//Int16Heap store
equalSimd([0, 0, 1, 1], ret, SIMD.Int32x4, "");

inputLength = initF32(buffer); 
var ret = m.store1Uint16(inputLength);//Uint16Heap store
equalSimd([0, 0, 1, 1], ret, SIMD.Int32x4, "");




inputLength = initF32(buffer); 
var ret = m.store1Int32(inputLength);//Int32Heap store
equalSimd([0, 0, 1, 1], ret, SIMD.Int32x4, "");




inputLength = initF32(buffer); 
var ret = m.store1Uint32(inputLength);//Uint32Heap store
equalSimd([0, 0, 1, 1], ret, SIMD.Int32x4, "");




inputLength = initF32(buffer); 
var ret = m.loadStoreIndex1();//Uint32Heap store
equalSimd([-1, -2, 3, -4], ret, SIMD.Int32x4, "");






var ret = m.load1(SIMDLoad1);
equalSimd([1126170624, 0, 0, 0], ret, SIMD.Int32x4, "");


var ret = m.load1(SIMDLoad2);
equalSimd([1126170624, 1126825984, 0, 0], ret, SIMD.Int32x4, "");


var ret = m.load1(SIMDLoad3);
equalSimd([1126170624, 1126825984, 1127481344, 0], ret, SIMD.Int32x4, "");


var ret = m.load1(SIMDLoad);
equalSimd([1126170624, 1126825984, 1127481344, 1128136704], ret, SIMD.Int32x4, "");


var ret = m.load2(SIMDLoad);
equalSimd([1126170624, 1126825984, 1127481344, 1128136704], ret, SIMD.Int32x4, "");


var ret = m.load3(SIMDLoad);
equalSimd([1126170624, 1126825984, 1127481344, 1128136704], ret, SIMD.Int32x4, "");


var ret = m.load1Int8(inputLength); //Int8Heap load
equalSimd([1210054144, 1210054784, 1210055424, 1210056064], ret, SIMD.Int32x4, "");


var ret = m.load1Uint8(inputLength); //Int8Heap load
equalSimd([1210054144, 1210054784, 1210055424, 1210056064], ret, SIMD.Int32x4, "");


var ret = m.load1Int16(inputLength); //Int16Heap load
equalSimd([1210054144, 1210054784, 1210055424, 1210056064], ret, SIMD.Int32x4, "");


var ret = m.load1Uint16(inputLength); //Int16Heap load
equalSimd([1210054144, 1210054784, 1210055424, 1210056064], ret, SIMD.Int32x4, "");


var ret = m.load1Int32(inputLength); //Int32Heap load
equalSimd([1210054144, 1210054784, 1210055424, 1210056064], ret, SIMD.Int32x4, "");


var ret = m.load1Uint32(inputLength); //Int32Heap load
equalSimd([1210054144, 1210054784, 1210055424, 1210056064], ret, SIMD.Int32x4, "");


var value = SIMD.Int32x4(9,1,3,5);


try {m.storeF32(value, inputLength); print("Wrong");} catch(err) {}

try {m.loadF32(inputLength); print("Wrong");} catch(err) {}


try {m.storeF32(value, inputLength-1); print("Wrong");} catch(err) {}


try {m.loadF32(inputLength-1); print("Wrong");} catch(err) {}


try {m.storeF32(value, inputLength-4);} catch(err) {print("Wrong");}


try {var v = m.loadF32(inputLength-4);} catch(err) {print("Wrong");}


try {m.storeUI32(value, inputLength+1);print("Wrong");} catch(err) {}


try { m.loadUI32(inputLength+1); print("Wrong"); } catch(err) {  }


try {m.storeI32(value, inputLength+1); print("Wrong");} catch(err) {}


try {m.loadI32(inputLength+1);print("Wrong");} catch(err) {}


try{
    m.storeI16(value, inputLength*2-8);
    
    m.storeUI16(value, inputLength*2-8);
    
    m.storeI8(value, inputLength*4-16);
    
    m.storeUI8(value, inputLength*4-16);
    
    m.loadI16(inputLength*2-8);
    
    m.loadUI16(inputLength*2-8);
    
    m.loadI8(inputLength*4-16);
    
    m.loadUI8(inputLength*4-16);
    
} catch(err){ print("Wrong"); }


try {m.storeUI16(value, inputLength*2);print("Wrong");} catch(err) {}


try {m.loadUI16(inputLength*2-7); print("Wrong");} catch(err) {}


try {m.storeI16(value, inputLength*2-7); print("Wrong");} catch(err) {}


try {m.loadI16(inputLength*2-7); print("Wrong");} catch(err) {}


try {m.storeUI8(value, inputLength*4-15); print("Wrong");} catch(err) {}


try {m.loadUI8(inputLength*4-15); print("Wrong");} catch(err) {}


try {m.storeI8(value, inputLength*4-15); print("Wrong");} catch(err) {}


try {m.loadI8(inputLength*4+15); print("Wrong");} catch(err) {}
print("PASS");