1 /* { dg-do run } */
2 /* { dg-require-effective-target vect_complex_add_double } */
3 /* { dg-add-options arm_v8_3a_complex_neon } */
4 /* { dg-add-options arm_v8_1m_mve_fp } */
5 
6 #include <stdio.h>
7 #include <complex.h>
8 #include <string.h>
9 #include <float.h>
10 #include <math.h>
11 
12 #define PREF old
13 #pragma GCC push_options
14 #pragma GCC optimize ("no-tree-vectorize")
15 # include "complex-operations.c"
16 #pragma GCC pop_options
17 #undef PREF
18 
19 #define PREF new
20 # include "complex-operations.c"
21 #undef PREF
22 
23 #define TYPE double
24 #define TYPE2 double
25 #define EP pow(2, -45)
26 
27 #define xstr(s) str(s)
28 #define str(s) #s
29 
30 #define FCMP(A, B) \
31   ((fabs (creal (A) - creal (B)) <= EP) && (fabs (cimag (A) - cimag (B)) <= EP))
32 
33 #define CMP(A, B) \
34   (FCMP(A,B) ? "PASS" : "FAIL")
35 
36 #define COMPARE(A,B) \
37   memset (&c1, 0, sizeof (c1)); \
38   memset (&c2, 0, sizeof (c2)); \
39   A; B; \
40   if (!FCMP(c1[0],c2[0]) || !FCMP(c1[1], c2[1])) \
41   { \
42     printf ("=> %s vs %s\n", xstr (A), xstr (B)); \
43     printf ("%a\n", creal (c1[0]) - creal (c2[0])); \
44     printf ("%a\n", cimag (c1[1]) - cimag (c2[1])); \
45     printf ("%.2f+%.2fI == %.2f+%.2fI (%s)\n", creal (c1[0]), cimag (c1[0]), creal (c2[0]), cimag (c2[0]), CMP (c1[0], c2[0])); \
46     printf ("%.2f+%.2fI == %.2f+%.2fI (%s)\n", creal (c1[1]), cimag (c1[1]), creal (c2[1]), cimag (c2[1]), CMP (c1[1], c2[1])); \
47     printf ("\n"); \
48     __builtin_abort (); \
49   }
50 
main()51 int main ()
52 {
53   TYPE2 complex a[] = { 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I, 1.0 + 3.0 * I, 2.0 + 3.5 * I };
54   TYPE  complex b[] = { 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I, 1.1 + 3.1 * I, 2.1 + 3.6 * I };
55   TYPE  complex c2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
56   TYPE  complex c1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
57   TYPE  diff1, diff2;
58 
59   COMPARE(fma0_old(a, b, c1), fma0_new(a, b, c2));
60   COMPARE(fma90_old(a, b, c1), fma90_new(a, b, c2));
61   COMPARE(fma180_old(a, b, c1), fma180_new(a, b, c2));
62   COMPARE(fma270_old(a, b, c1), fma270_new(a, b, c2));
63   COMPARE(fma0_snd_old(a, b, c1), fma0_snd_new(a, b, c2));
64   COMPARE(fma90_snd_old(a, b, c1), fma90_snd_new(a, b, c2));
65   COMPARE(fma180_snd_old(a, b, c1), fma180_snd_new(a, b, c2));
66   COMPARE(fma270_snd_old(a, b, c1), fma270_snd_new(a, b, c2));
67   COMPARE(fma_conj_first_old(a, b, c1), fma_conj_first_new(a, b, c2));
68   COMPARE(fma_conj_second_old(a, b, c1), fma_conj_second_new(a, b, c2));
69   COMPARE(fma_conj_both_old(a, b, c1), fma_conj_both_new(a, b, c2));
70   COMPARE(fms0_old(a, b, c1), fms0_new(a, b, c2));
71   COMPARE(fms90_old(a, b, c1), fms90_new(a, b, c2));
72   COMPARE(fms180_old(a, b, c1), fms180_new(a, b, c2));
73   COMPARE(fms270_old(a, b, c1), fms270_new(a, b, c2));
74   COMPARE(fms0_snd_old(a, b, c1), fms0_snd_new(a, b, c2));
75   COMPARE(fms90_snd_old(a, b, c1), fms90_snd_new(a, b, c2));
76   COMPARE(fms180_snd_old(a, b, c1), fms180_snd_new(a, b, c2));
77   COMPARE(fms270_snd_old(a, b, c1), fms270_snd_new(a, b, c2));
78   COMPARE(fms_conj_first_old(a, b, c1), fms_conj_first_new(a, b, c2));
79   COMPARE(fms_conj_second_old(a, b, c1), fms_conj_second_new(a, b, c2));
80   COMPARE(fms_conj_both_old(a, b, c1), fms_conj_both_new(a, b, c2));
81   COMPARE(mul0_old(a, b, c1), mul0_new(a, b, c2));
82   COMPARE(mul90_old(a, b, c1), mul90_new(a, b, c2));
83   COMPARE(mul180_old(a, b, c1), mul180_new(a, b, c2));
84   COMPARE(mul270_old(a, b, c1), mul270_new(a, b, c2));
85   COMPARE(mul0_snd_old(a, b, c1), mul0_snd_new(a, b, c2));
86   COMPARE(mul90_snd_old(a, b, c1), mul90_snd_new(a, b, c2));
87   COMPARE(mul180_snd_old(a, b, c1), mul180_snd_new(a, b, c2));
88   COMPARE(mul270_snd_old(a, b, c1), mul270_snd_new(a, b, c2));
89   COMPARE(mul_conj_first_old(a, b, c1), mul_conj_first_new(a, b, c2));
90   COMPARE(mul_conj_second_old(a, b, c1), mul_conj_second_new(a, b, c2));
91   COMPARE(mul_conj_both_old(a, b, c1), mul_conj_both_new(a, b, c2));
92   COMPARE(add0_old(a, b, c1), add0_new(a, b, c2));
93   COMPARE(add90_old(a, b, c1), add90_new(a, b, c2));
94   COMPARE(add180_old(a, b, c1), add180_new(a, b, c2));
95   COMPARE(add270_old(a, b, c1), add270_new(a, b, c2));
96   COMPARE(add0_snd_old(a, b, c1), add0_snd_new(a, b, c2));
97   COMPARE(add90_snd_old(a, b, c1), add90_snd_new(a, b, c2));
98   COMPARE(add180_snd_old(a, b, c1), add180_snd_new(a, b, c2));
99   COMPARE(add270_snd_old(a, b, c1), add270_snd_new(a, b, c2));
100   COMPARE(add_conj_first_old(a, b, c1), add_conj_first_new(a, b, c2));
101   COMPARE(add_conj_second_old(a, b, c1), add_conj_second_new(a, b, c2));
102   COMPARE(add_conj_both_old(a, b, c1), add_conj_both_new(a, b, c2));
103 }
104