c++: fix explicit/copy problem [PR109247]
[official-gcc.git] / gcc / testsuite / gdc.dg / torture / simd_convertvector.d
blob0d6b18e1e5c081e435aa91c9076cd32cac08641f
1 // { dg-additional-options "-mavx" { target avx_runtime } }
2 // { dg-skip-if "needs gcc/config.d" { ! d_runtime } }
3 import gcc.simd;
5 void main ()
7 static if (__traits(compiles, __vector(int[4])))
8 alias int4 = __vector(int[4]);
9 static if (__traits(compiles, __vector(uint[4])))
10 alias uint4 = __vector(uint[4]);
11 static if (__traits(compiles, __vector(float[4])))
12 alias float4 = __vector(float[4]);
13 static if (__traits(compiles, __vector(double[4])))
14 alias double4 = __vector(double[4]);
16 static if (__traits(compiles, int4))
18 union U1 { int4 v; int[4] a; }
19 U1 u1;
21 static if (__traits(compiles, uint4))
23 union U2 { uint4 v; uint[4] a; }
24 U2 u2;
26 static if (__traits(compiles, float4))
28 union U3 { float4 v; float[4] a; }
29 U3 u3;
31 static if (__traits(compiles, double4))
33 union U4 { double4 v; double[4] a; }
34 U4 u4;
37 static if (__traits(compiles, u1) && __traits(compiles, u2))
39 static void f1(ref uint4 x, out int4 y)
41 y = convertvector!int4(x);
43 static foreach (i; 0 .. 4)
44 u2.a[i] = i * 2;
45 f1(u2.v, u1.v);
46 static foreach (i; 0 .. 4)
47 assert(u1.a[i] == i * 2);
50 static if (__traits(compiles, u1) && __traits(compiles, u3))
52 static void f2(ref float4 x, out int4 y)
54 y = convertvector!int4(x);
57 static void f3(ref int4 x, out float4 y)
59 y = convertvector!float4(x);
62 static foreach (i; 0 .. 4)
63 u3.a[i] = i - 2.25f;
64 f2(u3.v, u1.v);
65 static foreach (i; 0 .. 4)
66 assert(u1.a[i] == (i == 3 ? 0 : i - 2));
68 static foreach (i; 0 .. 4)
69 u3.a[i] = i + 0.75f;
70 f2(u3.v, u1.v);
71 static foreach (i; 0 .. 4)
72 assert(u1.a[i] == i);
74 static foreach (i; 0 .. 4)
75 u1.a[i] = 7 * i - 5;
76 f3(u1.v, u3.v);
77 static foreach (i; 0 .. 4)
78 assert(u3.a[i] == 7 * i - 5);
80 static if (__traits(compiles, u1) && __traits(compiles, u4))
82 static void f4(ref double4 x, out int4 y)
84 y = convertvector!int4(x);
87 static void f5(ref int4 x, out double4 y)
89 y = convertvector!double4(x);
92 static foreach (i; 0 .. 4)
93 u4.a[i] = i - 2.25;
94 f4(u4.v, u1.v);
95 static foreach (i; 0 .. 4)
96 assert(u1.a[i] == (i == 3 ? 0 : i - 2));
98 static foreach (i; 0 .. 4)
99 u4.a[i] = i + 0.75;
100 f4(u4.v, u1.v);
101 static foreach (i; 0 .. 4)
102 assert(u1.a[i] == i);
104 static foreach (i; 0 .. 4)
105 u1.a[i] = 7 * i - 5;
106 f5(u1.v, u4.v);
107 static foreach (i; 0 .. 4)
108 assert(u4.a[i] == 7 * i - 5);
110 static if (__traits(compiles, u4))
112 static void f6(out double4 x)
114 int4 a = [1, 2, -3, -4];
115 x = convertvector!double4(a);
118 f6(u4.v);
119 static foreach (i; 0 .. 4)
120 assert(u4.a[i] == (i >= 2 ? -1 - i : i + 1));