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