1  /* { dg-do run { target { powerpc*-*-* &&  lp64 } } } */
       2  /* { dg-require-effective-target hard_dfp } */
       3  /* { dg-options "-O2 -std=c99" } */
       4  
       5  #ifdef DEBUG
       6  #include <stdio.h>
       7  #endif
       8  
       9  #define DRN_MASK 0x700000000LL     /* DRN field mask */
      10  
      11  void abort (void);
      12  
      13  int main ()
      14  {
      15    int i;
      16    int val, bit;
      17    double fpscr_val;
      18    union blah {
      19      double d;
      20      unsigned long long ll;
      21    } conv_val;
      22    
      23    unsigned long long ll_value;
      24    register double  f14;
      25  
      26    /* __builtin_set_fpscr_drn() builtin can take a const or a variable
      27       value between 0 and 7 as the argument.
      28    */
      29  
      30    /* Test builtin decimal float rounding mode with const argument.  */
      31    __builtin_set_fpscr_drn(7);
      32    conv_val.d = __builtin_mffs();
      33    ll_value = conv_val.ll & DRN_MASK;
      34  
      35    if (ll_value != 0x700000000)
      36      {
      37  #ifdef DEBUG
      38         printf("ERROR, __builtin_set_fpscr_drn(7) did not set rounding mode to 7.\n");
      39  #else
      40         abort();
      41  #endif
      42      }		  
      43  
      44    __builtin_set_fpscr_drn(2);
      45    conv_val.d = __builtin_mffs();
      46    ll_value = conv_val.ll & DRN_MASK;
      47  
      48    if (ll_value != 0x200000000)
      49      {
      50  #ifdef DEBUG
      51         printf("ERROR, __builtin_set_fpscr_drn(2) did not set rounding mode to 2.\n");
      52  #else
      53         abort();
      54  #endif
      55      }		  
      56  
      57    __builtin_set_fpscr_drn(5);
      58    conv_val.d = __builtin_mffs();
      59    ll_value = conv_val.ll & DRN_MASK;
      60  
      61    if (ll_value != 0x500000000)
      62      {
      63  #ifdef DEBUG
      64         printf("ERROR, __builtin_set_fpscr_drn(5) did not set rounding mode to 5.\n");
      65  #else
      66         abort();
      67  #endif
      68      }		  
      69  
      70    /* Test builtin decimal float rounding mode with variable as argument.  */
      71    val = 7;
      72    __builtin_set_fpscr_drn(val);
      73    conv_val.d = __builtin_mffs();
      74    ll_value = conv_val.ll & DRN_MASK;
      75  
      76    if (ll_value != ((unsigned long long)val << 32))
      77      {
      78  #ifdef DEBUG
      79         printf("ERROR, __builtin_set_fpscr_drn(val=%d) did not set rounding mode to %d.\n",
      80  	      val, val);
      81  #else
      82         abort();
      83  #endif
      84      }		  
      85  
      86    val = 0;
      87    __builtin_set_fpscr_drn(val);
      88    conv_val.d = __builtin_mffs();
      89    ll_value = conv_val.ll & DRN_MASK;
      90  
      91    if (ll_value != ((unsigned long long)val << 32))
      92      {
      93  #ifdef DEBUG
      94         printf("ERROR, __builtin_set_fpscr_drn(val=%d) did not set rounding mode to %d.\n",
      95  	      val, val);
      96  #else
      97         abort();
      98  #endif
      99      }		  
     100  
     101    val = 2;
     102    __builtin_set_fpscr_drn(val);
     103    conv_val.d = __builtin_mffs();
     104    ll_value = conv_val.ll & DRN_MASK;
     105  
     106    if (ll_value != ((unsigned long long)val << 32))
     107      {
     108  #ifdef DEBUG
     109         printf("ERROR, __builtin_set_fpscr_drn(val=%d) did not set rounding mode to %d.\n",
     110  	      val, val);
     111  #else
     112         abort();
     113  #endif
     114      }	  
     115  }