133965Sjdp/* { dg-do run } */
233965Sjdp/* { dg-require-effective-target fma } */
333965Sjdp/* { dg-options "-O2 -mfma" } */
433965Sjdp
533965Sjdp#include "fma-check.h"
633965Sjdp
733965Sjdp#include <x86intrin.h>
833965Sjdp#include "m256-check.h"
933965Sjdp
1033965Sjdp
1133965Sjdpvoid
1233965Sjdpcheck_mm256_fnmsub_pd (__m256d __A, __m256d __B, __m256d __C)
1360484Sobrien{
1433965Sjdp  union256d a, b, c, e;
1533965Sjdp  a.x = __A;
1633965Sjdp  b.x = __B;
1733965Sjdp  c.x = __C;
1833965Sjdp  double d[4];
1933965Sjdp  int i;
2033965Sjdp  e.x = _mm256_fnmsub_pd (__A, __B, __C);
2133965Sjdp  for (i = 0; i < 4; i++)
2233965Sjdp    {
2333965Sjdp      d[i] = -a.a[i] * b.a[i] - c.a[i];
2433965Sjdp    }
2533965Sjdp  if (check_union256d (e, d))
2633965Sjdp    abort ();
2733965Sjdp}
2833965Sjdp
2933965Sjdpvoid
3033965Sjdpcheck_mm256_fnmsub_ps (__m256 __A, __m256 __B, __m256 __C)
3189857Sobrien{
3289857Sobrien  union256 a, b, c, e;
3389857Sobrien  a.x = __A;
3489857Sobrien  b.x = __B;
3589857Sobrien  c.x = __C;
3689857Sobrien  float d[8];
3789857Sobrien  int i;
3889857Sobrien  e.x = _mm256_fnmsub_ps (__A, __B, __C);
3989857Sobrien  for (i = 0; i < 8; i++)
4089857Sobrien    {
4189857Sobrien      d[i] = -a.a[i] * b.a[i] - c.a[i];
4289857Sobrien    }
4389857Sobrien  if (check_union256 (e, d))
4489857Sobrien    abort ();
4589857Sobrien}
4689857Sobrien
4789857Sobrienstatic void
4889857Sobrienfma_test (void)
4989857Sobrien{
5077298Sobrien  union256 c[3];
5177298Sobrien  union256d d[3];
5277298Sobrien  int i, j;
5377298Sobrien  for (i = 0; i < 3; i++)
5433965Sjdp    {
5577298Sobrien      for (j = 0; j < 8; j++)
5677298Sobrien	c[i].a[j] = i * j + 3.5;
5777298Sobrien      for (j = 0; j < 4; j++)
5877298Sobrien	d[i].a[j] = i * j + 3.5;
5933965Sjdp    }
6077298Sobrien  check_mm256_fnmsub_pd (d[0].x, d[1].x, d[2].x);
6177298Sobrien  check_mm256_fnmsub_ps (c[0].x, c[1].x, c[2].x);
6233965Sjdp}
6377298Sobrien