//-------------------------------------------------------------------------------------------------------
// 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= 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;
        }

        return f4load(Float32Heap, 0);

    }
    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 = 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 = 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 = 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 = 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 = 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 = 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=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=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=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=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=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=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 {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 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
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");
var ret = m.store1(SIMDStore1);//Lane1 store
// printBuffer(values, 10);
equalSimd([5.099999904632568, 10, 20, 30], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore1");

print("Test2");;
inputLength = initF32(buffer); 
var ret = m.store1(SIMDStore2);//Lane 1,2 store
// printBuffer(values, 10);
equalSimd([5.099999904632568, -12.300000190734863, 20, 30], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore2");


print("Test3");
inputLength = initF32(buffer); 
var ret = m.store1(SIMDStore3);//Lane 1,2,3 store
// printBuffer(values, 10);
equalSimd([5.099999904632568, -12.300000190734863, 0, 30        ], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore3");


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
// printBuffer(values, 10);
equalSimd([5.099999904632568, -12.300000190734863, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore4");


print("Test5");
inputLength = initF32(buffer);  
var ret = m.store2(SIMDStore);//Generic store 
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore5");


print("Test6");
inputLength = initF32(buffer); 
var ret = m.store3(SIMDStore);//Generic store
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore6");


print("Test7");
inputLength = initF32(buffer); 
var ret = m.store1Int8(inputLength);//Int8Heap store
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore7");


print("Test8");
inputLength = initF32(buffer); 
var ret = m.store1Uint8(inputLength);//Uint8Heap store
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore8");


print("Test9");
inputLength = initF32(buffer); 
var ret = m.store1Int16(inputLength);//Int16Heap store
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore9");


print("Test10");
inputLength = initF32(buffer); 
var ret = m.store1Uint16(inputLength);//Uint16Heap store
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore10");


print("Test12");
inputLength = initF32(buffer); 
var ret = m.store1Int32(inputLength);//Int32Heap store
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore12");


print("Test13");
inputLength = initF32(buffer); 
var ret = m.store1Uint32(inputLength);//Uint32Heap store
// printBuffer(values, 10);
equalSimd([0, 0, 0, 0], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore13");


print("Test14");
inputLength = initF32(buffer); 
var ret = m.loadStoreIndex1();//Uint32Heap store
// printBuffer(values, 10);
equalSimd([-1, -2, 3.0999999046325683, -4], SIMD.Float32x4.load(values, 0), SIMD.Float32x4, "TestStore14");


print("Loads");
print("Test1");

var ret = m.load1(SIMDLoad1);
equalSimd([160, 0, 0, 0], ret, SIMD.Float32x4, "TestStore");


print("Test2");
var ret = m.load1(SIMDLoad2);
equalSimd([160, 170, 0, 0], ret, SIMD.Float32x4, "TestStore2");


print("Test3");
var ret = m.load1(SIMDLoad3);
equalSimd([160, 170, 180, 0], ret, SIMD.Float32x4, "TestStore3");


print("Test4");
var ret = m.load1(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "TestStore4");


print("Test5");
var ret = m.load2(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "TestStore5");


print("Test6");
var ret = m.load3(SIMDLoad);
equalSimd([160, 170, 180, 190], ret, SIMD.Float32x4, "TestStore6");

print("Test7");
var ret = m.load1Int8(inputLength); //Int8Heap load
equalSimd([163800, 163810, 163820, 163830], ret, SIMD.Float32x4, "TestStore7");


print("Test8");
var ret = m.load1Uint8(inputLength); //Int8Heap load
equalSimd([163800, 163810, 163820, 163830], ret, SIMD.Float32x4, "TestStore8");


print("Test9");
var ret = m.load1Int16(inputLength); //Int16Heap load
equalSimd([163800, 163810, 163820, 163830], ret, SIMD.Float32x4, "TestStore9");


print("Test10");
var ret = m.load1Uint16(inputLength); //Int16Heap load
equalSimd([163800, 163810, 163820, 163830], ret, SIMD.Float32x4, "TestStore10");


print("Test11");
var ret = m.load1Int32(inputLength); //Int32Heap load
equalSimd([163800, 163810, 163820, 163830], ret, SIMD.Float32x4, "TestStore11");

print("Test12");
var ret = m.load1Uint32(inputLength); //Int32Heap load
equalSimd([163800, 163810, 163820, 163830], ret, SIMD.Float32x4, "TestStore12");


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");}