(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
sse4_1-round3.h
       1  #include <smmintrin.h>
       2  #include <fenv.h>
       3  #include "sse4_1-check.h"
       4  
       5  #define DIM(a) (sizeof (a) / sizeof (a)[0])
       6  
       7  static int roundings[] =
       8    {
       9      _MM_FROUND_TO_NEAREST_INT,
      10      _MM_FROUND_TO_NEG_INF,
      11      _MM_FROUND_TO_POS_INF,
      12      _MM_FROUND_TO_ZERO,
      13      _MM_FROUND_CUR_DIRECTION
      14    };
      15  
      16  static int modes[] =
      17    {
      18      FE_TONEAREST,
      19      FE_UPWARD,
      20      FE_DOWNWARD,
      21      FE_TOWARDZERO
      22    };
      23  
      24  static void
      25  TEST (void)
      26  {
      27    int i, j, ri, mi, round_save;
      28  
      29    round_save = fegetround ();
      30    for (mi = 0; mi < DIM (modes); mi++) {
      31      fesetround (modes[mi]);
      32      for (i = 0; i < DIM (data); i++) {
      33        for (ri = 0; ri < DIM (roundings); ri++) {
      34  	union value guess;
      35  	union value *current_answers = answers[ri];
      36  	switch ( roundings[ri] ) {
      37  	  case _MM_FROUND_TO_NEAREST_INT:
      38  	    guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
      39  				    _MM_FROUND_TO_NEAREST_INT);
      40  	    break;
      41  	  case _MM_FROUND_TO_NEG_INF:
      42  	    guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
      43  				    _MM_FROUND_TO_NEG_INF);
      44  	    break;
      45  	  case _MM_FROUND_TO_POS_INF:
      46  	    guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
      47  				    _MM_FROUND_TO_POS_INF);
      48  	    break;
      49  	  case _MM_FROUND_TO_ZERO:
      50  	    guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
      51  				    _MM_FROUND_TO_ZERO);
      52  	    break;
      53  	  case _MM_FROUND_CUR_DIRECTION:
      54  	    guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
      55  				    _MM_FROUND_CUR_DIRECTION);
      56  	    switch ( modes[mi] ) {
      57  	      case FE_TONEAREST:
      58  		current_answers = answers_NEAREST_INT;
      59  		break;
      60  	      case FE_UPWARD:
      61  		current_answers = answers_POS_INF;
      62  		break;
      63  	      case FE_DOWNWARD:
      64  		current_answers = answers_NEG_INF;
      65  		break;
      66  	      case FE_TOWARDZERO:
      67  		current_answers = answers_ZERO;
      68  		break;
      69  	    }
      70  	    break;
      71  	  default:
      72  	    abort ();
      73  	}
      74  	for (j = 0; j < DIM (guess.f); j++)
      75  	  if (guess.f[j] != current_answers[i].f[j])
      76  	    abort ();
      77        }
      78      }
      79    }
      80    fesetround (round_save);
      81  }