(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512f-vgetmantss-2.c
       1  /* { dg-do run } */
       2  /* { dg-options "-mavx512f -O2 -std=c99" } */
       3  /* { dg-require-effective-target avx512f } */
       4  /* { dg-require-effective-target c99_runtime } */
       5  
       6  #include "avx512f-check.h"
       7  #include <math.h>
       8  #include "avx512f-helper.h"
       9  
      10  #define SIZE (128/32)
      11  #include "avx512f-mask-type.h"
      12  
      13  union fp_int_t
      14  {
      15    int int_val;
      16    float fp_val;
      17  };
      18  
      19  float
      20  get_norm_mant (float source, int signctrl, int interv)
      21  {
      22    int src, sign, exp, fraction;
      23    union fp_int_t bin_conv;
      24  
      25    bin_conv.fp_val = source;
      26    src = bin_conv.int_val;
      27    sign = (signctrl & 0x1) ? 0 : (src >> 31);
      28    exp = (src & 0x7f800000) >> 23;
      29    fraction = (src & 0x7fffff);
      30  
      31    if (isnan (source))
      32      return signbit (source) ? -NAN : NAN;
      33    if (source == 0.0 || source == -0.0 || isinf (source))
      34      return sign ? -1.0 : 1.0;
      35    if (signbit (source) && (signctrl & 0x2))
      36      return -NAN;
      37    if (!isnormal (source))
      38      {
      39        src = (src & 0xffbfffff);
      40        exp = 0x7f;
      41        while (!(src & 0x400000))
      42  	{
      43  	  src += fraction & 0x400000;
      44  	  fraction = fraction << 1;
      45  	  exp--;
      46  	}
      47      }
      48  
      49    switch (interv)
      50      {
      51      case 0:
      52        exp = 0x7f;
      53        break;
      54      case 1:
      55        exp = ((exp - 0x7f) & 0x1) ? 0x7e : 0x7f;
      56        break;
      57      case 2:
      58        exp = 0x7e;
      59        break;
      60      case 3:
      61        exp = (fraction & 0x400000) ? 0x7e : 0x7f;
      62        break;
      63      default:
      64        abort ();
      65      }
      66  
      67    bin_conv.int_val = (sign << 31) | (exp << 23) | fraction;
      68  
      69    return bin_conv.fp_val;
      70  
      71  }
      72  
      73  static void
      74  compute_vgetmantss (float *r, float *s1, float *s2, int interv,
      75  		    int signctrl)
      76  {
      77    int i;
      78    r[0] = get_norm_mant (s2[0], signctrl, interv);
      79    for (i = 1; i < SIZE; i++)
      80      {
      81        r[i] = s1[i];
      82      }
      83  }
      84  
      85  static void
      86  avx512f_test (void)
      87  {
      88    union128 res1, res2, res3, res4, res5, res6, src1, src2;
      89    float res_ref[4];
      90    MASK_TYPE mask = MASK_VALUE;
      91  
      92    src1.x = _mm_set_ps (-24.043, 68.346, -43.35, 546.46);
      93    src2.x = _mm_set_ps (222.222, 333.333, 444.444, -2.0);
      94  
      95    int i; 
      96    for (i = 0; i < SIZE; i++)
      97      {
      98        res2.a[i] = DEFAULT_VALUE;
      99        res5.a[i] = DEFAULT_VALUE;
     100      }
     101  
     102    res1.x = _mm_getmant_ss (src1.x, src2.x, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src);
     103    res2.x = _mm_mask_getmant_ss (res2.x, mask, src1.x, src2.x, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src);
     104    res3.x = _mm_maskz_getmant_ss (mask, src1.x, src2.x, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src);
     105    res4.x = _mm_getmant_round_ss (src1.x, src2.x, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src, _MM_FROUND_NO_EXC);
     106    res5.x = _mm_mask_getmant_round_ss (res5.x, mask, src1.x, src2.x, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src, _MM_FROUND_NO_EXC);
     107    res6.x = _mm_maskz_getmant_round_ss (mask, src1.x, src2.x, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src, _MM_FROUND_NO_EXC);
     108  
     109    compute_vgetmantss (res_ref, src1.a, src2.a, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src);
     110  
     111    if (check_union128 (res1, res_ref))
     112      abort ();
     113    
     114    MASK_MERGE () (res_ref, mask, 1);
     115    if (check_union128 (res2, res_ref))
     116      abort ();
     117  
     118    MASK_ZERO () (res_ref, mask, 1);
     119    if (check_union128 (res3, res_ref))
     120      abort ();
     121  
     122    compute_vgetmantss (res_ref, src1.a, src2.a, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src);
     123  
     124    if (check_union128 (res4, res_ref))
     125      abort ();
     126    
     127    MASK_MERGE () (res_ref, mask, 1);
     128    if (check_union128 (res5, res_ref))
     129      abort ();
     130  
     131    MASK_ZERO () (res_ref, mask, 1);
     132    if (check_union128 (res6, res_ref))
     133      abort ();
     134  }