(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
fma-fnmsubXX.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target fma } */
       3  /* { dg-options "-O2 -mfma" } */
       4  
       5  #include "fma-check.h"
       6  
       7  #include <x86intrin.h>
       8  #include "m256-check.h"
       9  
      10  void
      11  check_mm_fnmsub_sd (__m128d __A, __m128d __B, __m128d __C)
      12  {
      13    union128d a, b, c, e;
      14    a.x = __A;
      15    b.x = __B;
      16    c.x = __C;
      17    double d[2];
      18    int i;
      19    e.x = _mm_fnmsub_sd (__A, __B, __C);
      20    for (i = 1; i < 2; i++)
      21      {
      22        d[i] = a.a[i];
      23      }
      24    d[0] = -a.a[0] * b.a[0] - c.a[0];
      25    if (check_union128d (e, d))
      26      abort ();
      27  }
      28  
      29  void
      30  check_mm_fnmsub_ss (__m128 __A, __m128 __B, __m128 __C)
      31  {
      32    union128 a, b, c, e;
      33    a.x = __A;
      34    b.x = __B;
      35    c.x = __C;
      36    float d[4];
      37    int i;
      38    e.x = _mm_fnmsub_ss (__A, __B, __C);
      39    for (i = 1; i < 4; i++)
      40      {
      41        d[i] = a.a[i];
      42      }
      43    d[0] = -a.a[0] * b.a[0] - c.a[0];
      44    if (check_union128 (e, d))
      45      abort ();
      46  }
      47  
      48  void
      49  check_mm_fnmsub_ps (__m128 __A, __m128 __B, __m128 __C)
      50  {
      51    union128 a, b, c, e;
      52    a.x = __A;
      53    b.x = __B;
      54    c.x = __C;
      55    float d[4];
      56    int i;
      57    e.x = _mm_fnmsub_ps (__A, __B, __C);
      58    for (i = 0; i < 4; i++)
      59      {
      60        d[i] = -a.a[i] * b.a[i] - c.a[i];
      61      }
      62    if (check_union128 (e, d))
      63      abort ();
      64  }
      65  
      66  void
      67  check_mm_fnmsub_pd (__m128d __A, __m128d __B, __m128d __C)
      68  {
      69    union128d a, b, c, e;
      70    a.x = __A;
      71    b.x = __B;
      72    c.x = __C;
      73    double d[2];
      74    int i;
      75    e.x = _mm_fnmsub_pd (__A, __B, __C);
      76    for (i = 0; i < 2; i++)
      77      {
      78        d[i] = -a.a[i] * b.a[i] - c.a[i];
      79      }
      80    if (check_union128d (e, d))
      81      abort ();
      82  }
      83  
      84  static void
      85  fma_test (void)
      86  {
      87    union128 a[3];
      88    union128d b[3];
      89    int i, j;
      90    for (i = 0; i < 3; i++)
      91      {
      92        for (j = 0; j < 4; j++)
      93  	a[i].a[j] = i * j + 3.5;
      94        for (j = 0; j < 2; j++)
      95  	b[i].a[j] = i * j + 3.5;
      96      }
      97    check_mm_fnmsub_pd (b[0].x, b[1].x, b[2].x);
      98    check_mm_fnmsub_sd (b[0].x, b[1].x, b[2].x);
      99    check_mm_fnmsub_ps (a[0].x, a[1].x, a[2].x);
     100    check_mm_fnmsub_ss (a[0].x, a[1].x, a[2].x);
     101  }