blob: 0d6b18e1e5c081e435aa91c9076cd32cac08641f [file] [log] [blame]
// { dg-additional-options "-mavx" { target avx_runtime } }
// { dg-skip-if "needs gcc/config.d" { ! d_runtime } }
import gcc.simd;
void main ()
{
static if (__traits(compiles, __vector(int[4])))
alias int4 = __vector(int[4]);
static if (__traits(compiles, __vector(uint[4])))
alias uint4 = __vector(uint[4]);
static if (__traits(compiles, __vector(float[4])))
alias float4 = __vector(float[4]);
static if (__traits(compiles, __vector(double[4])))
alias double4 = __vector(double[4]);
static if (__traits(compiles, int4))
{
union U1 { int4 v; int[4] a; }
U1 u1;
}
static if (__traits(compiles, uint4))
{
union U2 { uint4 v; uint[4] a; }
U2 u2;
}
static if (__traits(compiles, float4))
{
union U3 { float4 v; float[4] a; }
U3 u3;
}
static if (__traits(compiles, double4))
{
union U4 { double4 v; double[4] a; }
U4 u4;
}
static if (__traits(compiles, u1) && __traits(compiles, u2))
{
static void f1(ref uint4 x, out int4 y)
{
y = convertvector!int4(x);
}
static foreach (i; 0 .. 4)
u2.a[i] = i * 2;
f1(u2.v, u1.v);
static foreach (i; 0 .. 4)
assert(u1.a[i] == i * 2);
}
static if (__traits(compiles, u1) && __traits(compiles, u3))
{
static void f2(ref float4 x, out int4 y)
{
y = convertvector!int4(x);
}
static void f3(ref int4 x, out float4 y)
{
y = convertvector!float4(x);
}
static foreach (i; 0 .. 4)
u3.a[i] = i - 2.25f;
f2(u3.v, u1.v);
static foreach (i; 0 .. 4)
assert(u1.a[i] == (i == 3 ? 0 : i - 2));
static foreach (i; 0 .. 4)
u3.a[i] = i + 0.75f;
f2(u3.v, u1.v);
static foreach (i; 0 .. 4)
assert(u1.a[i] == i);
static foreach (i; 0 .. 4)
u1.a[i] = 7 * i - 5;
f3(u1.v, u3.v);
static foreach (i; 0 .. 4)
assert(u3.a[i] == 7 * i - 5);
}
static if (__traits(compiles, u1) && __traits(compiles, u4))
{
static void f4(ref double4 x, out int4 y)
{
y = convertvector!int4(x);
}
static void f5(ref int4 x, out double4 y)
{
y = convertvector!double4(x);
}
static foreach (i; 0 .. 4)
u4.a[i] = i - 2.25;
f4(u4.v, u1.v);
static foreach (i; 0 .. 4)
assert(u1.a[i] == (i == 3 ? 0 : i - 2));
static foreach (i; 0 .. 4)
u4.a[i] = i + 0.75;
f4(u4.v, u1.v);
static foreach (i; 0 .. 4)
assert(u1.a[i] == i);
static foreach (i; 0 .. 4)
u1.a[i] = 7 * i - 5;
f5(u1.v, u4.v);
static foreach (i; 0 .. 4)
assert(u4.a[i] == 7 * i - 5);
}
static if (__traits(compiles, u4))
{
static void f6(out double4 x)
{
int4 a = [1, 2, -3, -4];
x = convertvector!double4(a);
}
f6(u4.v);
static foreach (i; 0 .. 4)
assert(u4.a[i] == (i >= 2 ? -1 - i : i + 1));
}
}