1  /* { dg-do run } */
       2  /* { dg-options "-mavx512f -O2 -std=gnu99" } */
       3  /* { dg-require-effective-target avx512f } */
       4  /* { dg-require-effective-target c99_runtime } */
       5  
       6  #include "avx512f-check.h"
       7  #include "avx512f-helper.h"
       8  #include "math_m_pi.h"
       9  #include <float.h>
      10  #include "avx512f-mask-type.h"
      11  
      12  void
      13  compute_fixupimmps (float *r, float dest, float src, int tbl)
      14  {
      15    switch (tbl & 0xf)
      16      {
      17      case 0:
      18        *r = dest;
      19        break;
      20      case 1:
      21        *r = src;
      22        break;
      23      case 2:
      24        *r = signbit (src) ? -NAN : NAN;
      25        break;
      26      case 3:
      27        *r = -NAN;
      28        break;
      29      case 4:
      30        *r = -INFINITY;
      31        break;
      32      case 5:
      33        *r = INFINITY;
      34        break;
      35      case 6:
      36        *r = signbit (src) ? -INFINITY : INFINITY;
      37        break;
      38      case 7:
      39        *r = 1.0 / -INFINITY;
      40        break;
      41      case 8:
      42        *r = 0.0;
      43        break;
      44      case 9:
      45        *r = -1.0;
      46        break;
      47      case 10:
      48        *r = 1.0;
      49        break;
      50      case 11:
      51        *r = 1.0 / 2.0;
      52        break;
      53      case 12:
      54        *r = 90.0;
      55        break;
      56      case 13:
      57        *r = M_PI_2;
      58        break;
      59      case 14:
      60        *r = FLT_MAX;
      61        break;
      62      case 15:
      63        *r = -FLT_MAX;
      64        break;
      65      default:
      66        abort ();
      67      }
      68  }
      69  
      70  void
      71  avx512f_test (void)
      72  {
      73    union128 s1, res1, res2, res3;
      74    union128i_d s2;
      75    float res_ref[4];
      76    int i, j, k;
      77  
      78    float vals[2] = { -10, 10 };
      79    int controls[10] = { 0,
      80      0x77777777, 0x88888888, 0x99999999,
      81      0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc,
      82      0xdddddddd, 0xeeeeeeee, 0xffffffff
      83    };
      84  
      85    MASK_TYPE mask = MASK_VALUE;
      86  
      87    for (i = 0; i < 2; i++)
      88      {
      89        s1.a[0] = vals[i];
      90        res1.a[0] = res2.a[0] = res3.a[0] = DEFAULT_VALUE;
      91        for (k = 1; k < 4; k++)
      92  	{
      93  	  s1.a[k] = k;
      94  	  s2.a[k] = k;
      95  	  res_ref[k] = k;
      96  	  res1.a[k] = res2.a[k] = res3.a[k] = DEFAULT_VALUE;
      97  	}
      98  
      99        for (j = 0; j < 10; j++)
     100  	{
     101  	  s2.a[0] = controls[j];
     102  	  compute_fixupimmps (&res_ref[0], res1.a[0], s1.a[0], s2.a[0]);
     103  
     104  	  res1.x = _mm_fixupimm_ss (res1.x, s1.x, s2.x, 0);
     105  	  res2.x = _mm_mask_fixupimm_ss (res2.x, mask, s1.x, s2.x, 0);
     106  	  res3.x = _mm_maskz_fixupimm_ss (mask, res3.x, s1.x, s2.x, 0);
     107  
     108  	  if (check_union128 (res1, res_ref))
     109  	    abort ();
     110  
     111  	  MASK_MERGE () (res_ref, mask, 1);
     112  	  if (check_union128 (res2, res_ref))
     113  	    abort ();
     114  
     115  	  MASK_ZERO () (res_ref, mask, 1);
     116  	  if (check_union128 (res3, res_ref))
     117  	    abort ();
     118  	}
     119      }
     120  }