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_3a_complex_neon } */
       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  
      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  }