(root)/
gcc-13.2.0/
gcc/
testsuite/
gdc.dg/
torture/
simd_shufflevector.d
// { dg-additional-options "-mavx" { target avx_runtime } }
// { dg-skip-if "needs gcc/config.d" { ! d_runtime } }
import gcc.simd;
import gcc.attributes;

void main()
{
    static if (__traits(compiles, __vector(int[4])))
        alias int4 = __vector(int[4]);
    static if (__traits(compiles, __vector(int[8])))
        alias int8 = __vector(int[8]);

    static if (__traits(compiles, int4) && __traits(compiles, int8))
    {
        __gshared int4[5] res;
        __gshared int4 a;
        __gshared int4 b;
        __gshared int8[3] res8;
        __gshared int8 a8;
        __gshared int8 b8;

        @noipa static void foo()
        {
            res[0] = shufflevector(a, b, 0, 1, 4, 5);
            res[1] = shufflevector(a, b, 0, 1, 2, 5);
            res8[0] = shufflevector(a, b, 0, 1, 2, 2 + 1, 4, 5, 6, 7);
            res[2] = shufflevector(a8, b8, 0, 8, 1, 9);
            res[3] = shufflevector(a8, b, 0, 8, 1, 9);
            res[4] = shufflevector(a, b8, 0, 4, 1, 5);
            res8[1] = shufflevector(a8, b, 0, 8, 1, 9, 10, 11, 2, 3);
            res8[2] = shufflevector(a, b8, 0, 4, 1, 5, 4, 5, 6, 7);
        }

        a = [0, 1, 2, 3];
        b = [4, 5, 6, 7];
        a8 = [0, 1, 2, 3, 4, 5, 6, 7];
        b8 = [8, 9, 10, 11, 12, 13, 14, 15];
        foo();
        assert(res[0].array == [0, 1, 4, 5]);

        res[1][2] = 9;
        assert(res[1].array == [0, 1, 9, 5]);
        assert(res8[0].array == [0, 1, 2, 3, 4, 5, 6, 7]);
        assert(res[2].array == [0, 8, 1, 9]);
        assert(res[3].array == [0, 4, 1, 5]);
        assert(res[4].array == [0, 8, 1, 9]);
        assert(res8[1].array == [0, 4, 1, 5, 6, 7, 2, 3]);

        res8[2][4] = 42;
        res8[2][5] = 42;
        res8[2][6] = 42;
        res8[2][7] = 42;
        assert(res8[2].array == [0, 8, 1, 9, 42, 42, 42, 42]);
    }
}