(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
excess-precision-1.c
       1  /* Excess precision tests.  Test that excess precision is carried
       2     through various operations.  */
       3  /* { dg-do run } */
       4  /* { dg-options "-O2 -mfpmath=387 -fexcess-precision=standard" } */
       5  
       6  #include <float.h>
       7  
       8  #ifdef __cplusplus
       9  extern "C" {
      10  #endif
      11  extern void abort (void);
      12  extern void exit (int);
      13  #ifdef __cplusplus
      14  }
      15  #endif
      16  
      17  volatile float f1 = 1.0f;
      18  volatile float f2 = 0x1.0p-30f;
      19  volatile float f3 = 0x1.0p-60f;
      20  volatile double d1 = 1.0;
      21  volatile double d2 = 0x1.0p-30;
      22  volatile double d3 = 0x1.0p-60;
      23  volatile float fadd1 = 1.0f + 0x1.0p-30f;
      24  volatile double dadd2 = 1.0 + 0x1.0p-30 + 0x1.0p-60;
      25  volatile long double ldadd1 = 1.0l + 0x1.0p-30l;
      26  volatile long double ldadd2 = 1.0l + 0x1.0p-30l + 0x1.0p-60l;
      27  
      28  void
      29  test_add (void)
      30  {
      31    if (f1 + f2 != ldadd1)
      32      abort ();
      33    if (f1 + f2 + f3 != ldadd2)
      34      abort ();
      35    if (d1 + d2 != ldadd1)
      36      abort ();
      37    if (d1 + d2 + d3 != ldadd2)
      38      abort ();
      39    if (f1 + d2 + f3 != ldadd2)
      40      abort ();
      41    if (f1 + f2 == fadd1)
      42      abort ();
      43    if (f1 + f2 <= fadd1)
      44      abort ();
      45    if (f1 + f2 < fadd1)
      46      abort ();
      47    if (sizeof(long double) > sizeof(double)) {
      48      if ( d1 + d2 + d3 == dadd2)
      49        abort ();
      50      if (!(d1 + d2 + d3 > dadd2))
      51        abort ();
      52      if (!(d1 + d2 + d3 >= dadd2))
      53        abort ();
      54    }
      55    else {
      56      if ( d1 + d2 + d3 != dadd2 )
      57        abort();
      58      if ( d1 + d2 + d3 < dadd2 )
      59        abort();
      60      if ( d1 + d2 + d3 > dadd2 )
      61        abort();
      62    }
      63  }
      64  
      65  volatile long double ldsub1 = 1.0l - 0x1.0p-30l;
      66  volatile long double ldsub2 = 1.0l - 0x1.0p-30l - 0x1.0p-60l;
      67  
      68  void
      69  test_sub (void)
      70  {
      71    if (f1 - f2 != ldsub1)
      72      abort ();
      73    if (f1 - f2 - f3 != ldsub2)
      74      abort ();
      75    if (d1 - d2 != ldsub1)
      76      abort ();
      77    if (d1 - d2 - d3 != ldsub2)
      78      abort ();
      79    if (f1 - d2 - f3 != ldsub2)
      80      abort ();
      81    if (+(f1 - d2 - f3) != ldsub2)
      82      abort ();
      83    if (-(f1 - d2 - f3) != -ldsub2)
      84      abort ();
      85  }
      86  
      87  volatile float flt_min = FLT_MIN;
      88  volatile double dbl_min = DBL_MIN;
      89  volatile long double flt_min2 = (long double)FLT_MIN * (long double)FLT_MIN;
      90  volatile long double dbl_min3 = (long double)DBL_MIN * (long double)DBL_MIN * (long double)DBL_MIN;
      91  
      92  void
      93  test_mul (void)
      94  {
      95    if (flt_min * flt_min != flt_min2)
      96      abort ();
      97    if (flt_min * flt_min == 0)
      98      abort ();
      99    if (flt_min * flt_min == 0)
     100      abort ();
     101    if (!(flt_min * flt_min))
     102      abort ();
     103    if (dbl_min * dbl_min * dbl_min != dbl_min3)
     104      abort ();
     105    if ((long double)(dbl_min * dbl_min * dbl_min) != dbl_min3)
     106      abort ();
     107    if ((0, dbl_min * dbl_min * dbl_min) != dbl_min3)
     108      abort ();
     109    if (sizeof(long double) > sizeof(double) ) {
     110      if (dbl_min * dbl_min * dbl_min == 0)
     111        abort ();
     112      if ((flt_min * flt_min ? dbl_min * dbl_min * dbl_min : 0) == 0)
     113        abort ();
     114    }
     115    else {
     116      if (dbl_min * dbl_min * dbl_min != 0)
     117        abort ();
     118      if ((flt_min * flt_min ? dbl_min * dbl_min * dbl_min : 1) != 0)
     119        abort ();
     120    }
     121    if ((flt_min * flt_min ? : 0) == 0)
     122      abort ();
     123  }
     124  
     125  volatile float f4 = 0x1.0p100f;
     126  volatile double d4 = 0x1.0p100;
     127  volatile long double flt_div = 0x1.0p100l / (long double) FLT_MIN;
     128  volatile long double dbl_div = 0x1.0p100l / (long double) DBL_MIN;
     129  
     130  void
     131  test_div (void)
     132  {
     133    if (f4 / flt_min != flt_div)
     134      abort ();
     135    if (d4 / dbl_min != dbl_div)
     136      abort ();
     137  }
     138  
     139  volatile float f5 = 0x1.0p30;
     140  
     141  void
     142  test_cast (void)
     143  {
     144    if ((int)(f1 + f5) != 0x40000001)
     145      abort ();
     146  }
     147  
     148  volatile float _Complex f1c = 1.0f + 1.0if;
     149  volatile float _Complex f2c = 0x1.0p-30f + 0x1.0p-31if;
     150  volatile float _Complex f3c = 0x1.0p-60f + 0x1.0p-59if;
     151  volatile double _Complex d1c = 1.0 + 1.0i;
     152  volatile double _Complex d2c = 0x1.0p-30 + 0x1.0p-31i;
     153  volatile double _Complex d3c = 0x1.0p-60 + 0x1.0p-59i;
     154  volatile long double _Complex ldadd1c = 1.0l + 0x1.0p-30l + 1.0il + 0x1.0p-31il;
     155  volatile long double _Complex ldadd2c = 1.0l + 0x1.0p-30l + 0x1.0p-60l + 1.0il + 0x1.0p-31il + 0x1.0p-59il;
     156  volatile long double _Complex ldadd2cc = 1.0l + 0x1.0p-30l + 0x1.0p-60l - 1.0il - 0x1.0p-31il - 0x1.0p-59il;
     157  volatile float _Complex flt_minc = FLT_MIN;
     158  volatile double _Complex dbl_minc = DBL_MIN;
     159  volatile float _Complex f4c = 0x1.0p100f;
     160  volatile double _Complex d4c = 0x1.0p100;
     161  
     162  void
     163  test_complex (void)
     164  {
     165    if (f1c + f2c != ldadd1c)
     166      abort ();
     167    if (f1c + f2c + f3c != ldadd2c)
     168      abort ();
     169    if (d1c + d2c != ldadd1c)
     170      abort ();
     171    if (d1c + d2c + d3c != ldadd2c)
     172      abort ();
     173    if (__real__ (f1c + f2c + f3c) != ldadd2)
     174      abort ();
     175    if (__imag__ (d1c + d2c + d3c) != __imag__ ldadd2c)
     176      abort ();
     177    if (~(d1c + d2c + d3c) != ldadd2cc)
     178      abort ();
     179    /* The following call libgcc functions and so would fail unless they
     180       call those for long double.  */
     181    if (flt_minc * flt_minc != flt_min2)
     182      abort ();
     183    if (dbl_minc * dbl_minc * dbl_minc != dbl_min3)
     184      abort ();
     185    if (f4c / flt_minc != flt_div)
     186      abort ();
     187    if (d4c / dbl_minc != dbl_div)
     188      abort ();
     189    if (f4 / flt_minc != flt_div)
     190      abort ();
     191    if (d4 / dbl_minc != dbl_div)
     192      abort ();
     193    if (f4c / flt_min != flt_div)
     194      abort ();
     195    if (d4c / dbl_min != dbl_div)
     196      abort ();
     197  }
     198  
     199  int
     200  main (void)
     201  {
     202    test_add ();
     203    test_sub ();
     204    test_mul ();
     205    test_div ();
     206    test_cast ();
     207    test_complex ();
     208    exit (0);
     209  }