1  /* Basic test of runtime relational comparisons using NaNs and infinities.  */
       2  
       3  #include <stdlib.h>
       4  #include "dfp-dbg.h"
       5  
       6  #define PASTE2(A,B) A ## B
       7  #define PASTE(A,B) PASTE2(A,B)
       8  
       9  /* Override FAILURE from dfp-dbg.h with one that provides additional info.  */
      10  #undef FAILURE
      11  #ifdef DBG
      12  #define FAILURE(OP,KIND) \
      13    { printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
      14      failures++; }
      15  #else
      16  #define FAILURE(OP,KIND) __builtin_abort ();
      17  #endif
      18  
      19  #ifndef WIDTH
      20  #error define WIDTH as decimal float size in bytes
      21  #endif
      22  
      23  #if WIDTH == 32
      24  #define DTYPE _Decimal32
      25  #define SUFFIX DF
      26  #define SUFFIX2 d32
      27  #elif WIDTH == 64
      28  #define DTYPE _Decimal64
      29  #define SUFFIX DD
      30  #define SUFFIX2 d64
      31  #elif WIDTH == 128
      32  #define DTYPE _Decimal128
      33  #define SUFFIX DL
      34  #define SUFFIX2 d128
      35  #elif WIDTH == 0
      36  /* This is for testing the test using a type known to work.  */
      37  #define DTYPE double
      38  #define SUFFIX
      39  #define SUFFIX2
      40  #else
      41  #error invalid width for decimal float type
      42  #endif
      43  
      44  DTYPE m_two = PASTE(-2.0, SUFFIX);
      45  DTYPE m_one = PASTE(-1.0, SUFFIX);
      46  DTYPE zero  = PASTE(0.0, SUFFIX);
      47  DTYPE one   = PASTE(1.0, SUFFIX);
      48  DTYPE two   = PASTE(2.0, SUFFIX);
      49  
      50  volatile DTYPE x, y, z, _nan, inf, m_inf;
      51  
      52  void
      53  test_compares (void)
      54  {
      55    _nan = PASTE(__builtin_nan, SUFFIX2) ("");
      56    inf =  PASTE(__builtin_inf, SUFFIX2) ();
      57    m_inf = - PASTE(__builtin_inf, SUFFIX2) ();
      58  
      59    x = PASTE(__builtin_nan, SUFFIX2) ("");
      60    y = PASTE(__builtin_inf, SUFFIX2) ();
      61    z = - PASTE(__builtin_inf, SUFFIX2) ();
      62  
      63    /* Less than or equal to with NaN.  */
      64  
      65    if (x <= two)   FAILURE ("<=", "NaN")
      66    if (x <= zero)  FAILURE ("<=", "NaN")
      67    if (x <= m_one) FAILURE ("<=", "NaN")
      68    if (x <= _nan)  FAILURE ("<=", "NaN")
      69    if (x <= inf)   FAILURE ("<=", "NaN")
      70    if (x <= m_inf) FAILURE ("<=", "NaN")
      71  
      72    if (two <= x)   FAILURE ("<=", "NaN")
      73    if (zero <= x)  FAILURE ("<=", "NaN")
      74    if (m_one <= x) FAILURE ("<=", "NaN")
      75    if (_nan <= x)  FAILURE ("<=", "NaN")
      76    if (inf <= x)   FAILURE ("<=", "NaN")
      77    if (m_inf <= x) FAILURE ("<=", "NaN")
      78  
      79    /* Less than or equal to with infinities, no NaNs.  */
      80  
      81    if (y <= two)      FAILURE ("<=", "inf")
      82    if (y <= zero)     FAILURE ("<=", "inf")
      83    if (y <= m_one)    FAILURE ("<=", "inf")
      84    if (!(two <= y))   FAILURE ("<=", "inf")
      85    if (!(zero <= y))  FAILURE ("<=", "inf")
      86    if (!(m_one <= y)) FAILURE ("<=", "inf")
      87  
      88    if (!(z <= two))   FAILURE ("<=", "-inf")
      89    if (!(z <= zero))  FAILURE ("<=", "-inf")
      90    if (!(z <= m_one)) FAILURE ("<=", "-inf")
      91    if (two <= z)      FAILURE ("<=", "-inf")
      92    if (zero <= z)     FAILURE ("<=", "-inf")
      93    if (m_one <= z)    FAILURE ("<=", "-inf")
      94  
      95    if (!(y <= inf))   FAILURE ("<=", "inf")
      96    if (y <= m_inf)    FAILURE ("<=", "inf")
      97    if (!(z <= inf))   FAILURE ("<=", "inf")
      98    if (!(z <= m_inf)) FAILURE ("<=", "inf")
      99  
     100    /* Less than with NaN.  */
     101  
     102    if (x < two)       FAILURE ("<", "NaN")
     103    if (x < zero)      FAILURE ("<", "NaN")
     104    if (x < m_one)     FAILURE ("<", "NaN")
     105    if (x < _nan)      FAILURE ("<", "NaN")
     106    if (x < inf)       FAILURE ("<", "NaN")
     107    if (x < m_inf)     FAILURE ("<", "NaN")
     108  
     109    if (two < x)       FAILURE ("<", "NaN")
     110    if (zero < x)      FAILURE ("<", "NaN")
     111    if (m_one < x)     FAILURE ("<", "NaN")
     112    if (_nan < x)      FAILURE ("<", "NaN")
     113    if (inf < x)       FAILURE ("<", "NaN")
     114    if (m_inf < x)     FAILURE ("<", "NaN")
     115  
     116    /* Less than with infinities, no NaNs.  */
     117  
     118    if (y < two)       FAILURE ("<", "inf")
     119    if (y < zero)      FAILURE ("<", "inf")
     120    if (y < m_one)     FAILURE ("<", "inf")
     121    if (!(two < y))    FAILURE ("<", "inf")
     122    if (!(zero < y))   FAILURE ("<", "inf")
     123    if (!(m_one < y))  FAILURE ("<", "inf")
     124  
     125    if (!(z < two))    FAILURE ("<", "-inf")
     126    if (!(z < zero))   FAILURE ("<", "-inf")
     127    if (!(z < m_one))  FAILURE ("<", "-inf")
     128    if (two < z)       FAILURE ("<", "-inf")
     129    if (zero < z)      FAILURE ("<", "-inf")
     130    if (m_one < z)     FAILURE ("<", "-inf")
     131  
     132    if (y < inf)       FAILURE ("<=", "inf")
     133    if (y < m_inf)     FAILURE ("<=", "inf")
     134    if (!(z < inf))    FAILURE ("<=", "inf")
     135    if (z < m_inf)     FAILURE ("<=", "inf")
     136  
     137    /* Greater than or equal to with NaN.  */
     138  
     139    if (x >= two)      FAILURE (">=", "NaN")
     140    if (x >= zero)     FAILURE (">=", "NaN")
     141    if (x >= m_one)    FAILURE (">=", "NaN")
     142    if (x >= _nan)     FAILURE (">=", "NaN")
     143    if (x >= inf)      FAILURE (">=", "NaN")
     144    if (x >= m_inf)    FAILURE (">=", "NaN")
     145  
     146    if (two >= x)      FAILURE (">=", "NaN")
     147    if (zero >= x)     FAILURE (">=", "NaN")
     148    if (m_one >= x)    FAILURE (">=", "NaN")
     149    if (_nan >= x)     FAILURE (">=", "NaN")
     150    if (inf >= x)      FAILURE (">=", "NaN")
     151    if (m_inf >= x)    FAILURE (">=", "NaN")
     152  
     153    /* Greater than or equal to with infinities, no NaNs.  */
     154  
     155    if (!(y >= two))   FAILURE (">=", "inf")
     156    if (!(y >= zero))  FAILURE (">=", "inf")
     157    if (!(y >= m_one)) FAILURE (">=", "inf")
     158    if (two >= y)      FAILURE (">=", "inf")
     159    if (zero >= y)     FAILURE (">=", "inf")
     160    if (m_one >= y)    FAILURE (">=", "inf")
     161  
     162    if (z >= two)      FAILURE (">=", "-inf")
     163    if (z >= zero)     FAILURE (">=", "-inf")
     164    if (z >= m_one)    FAILURE (">=", "-inf")
     165    if (!(two >= z))   FAILURE (">=", "-inf")
     166    if (!(zero >= z))  FAILURE (">=", "-inf")
     167    if (!(m_one >= z)) FAILURE (">=", "-inf")
     168  
     169    if (!(y >= inf))   FAILURE ("<=", "inf")
     170    if (!(y >= m_inf)) FAILURE ("<=", "inf")
     171    if (z >= inf)      FAILURE ("<=", "inf")
     172    if (!(z >= m_inf)) FAILURE ("<=", "inf")
     173  
     174    /* Greater than with NaN.  */
     175  
     176    if (x > two)       FAILURE (">", "NaN")
     177    if (x > zero)      FAILURE (">", "NaN")
     178    if (x > m_one)     FAILURE (">", "NaN")
     179    if (x > _nan)      FAILURE (">", "NaN")
     180    if (x > inf)       FAILURE (">", "NaN")
     181    if (x > m_inf)     FAILURE (">", "NaN")
     182  
     183    if (two > x)       FAILURE (">", "NaN")
     184    if (zero > x)      FAILURE (">", "NaN")
     185    if (m_one > x)     FAILURE (">", "NaN")
     186    if (_nan > x)      FAILURE (">", "NaN")
     187    if (inf > x)       FAILURE (">", "NaN")
     188    if (m_inf > x)     FAILURE (">", "NaN")
     189  
     190    /* Greater than with infinities, no NaNs.  */
     191  
     192    if (!(y > two))    FAILURE (">", "inf")
     193    if (!(y > zero))   FAILURE (">", "inf")
     194    if (!(y > m_one))  FAILURE (">", "inf")
     195    if (two > y)       FAILURE (">", "inf")
     196    if (zero > y)      FAILURE (">", "inf")
     197    if (m_one > y)     FAILURE (">", "inf")
     198  
     199    if (z > two)       FAILURE (">", "-inf")
     200    if (z > zero)      FAILURE (">", "-inf")
     201    if (z > m_one)     FAILURE (">", "-inf")
     202    if (!(two > z))    FAILURE (">", "-inf")
     203    if (!(zero > z))   FAILURE (">", "-inf")
     204    if (!(m_one > z))  FAILURE (">", "-inf")
     205  
     206    if (y > inf)       FAILURE (">", "inf")
     207    if (!(y > m_inf))  FAILURE (">", "inf")
     208    if (z > inf)       FAILURE (">", "inf")
     209    if (z > m_inf)     FAILURE (">", "inf")
     210  
     211    /* Equal with NaN.  */
     212  
     213    if (x == two)      FAILURE ("==", "NaN")
     214    if (x == zero)     FAILURE ("==", "NaN")
     215    if (x == m_one)    FAILURE ("==", "NaN")
     216    if (x == _nan)     FAILURE ("==", "NaN")
     217    if (x == inf)      FAILURE ("==", "NaN")
     218    if (x == m_inf)    FAILURE ("==", "NaN")
     219  
     220    if (two == x)      FAILURE ("==", "NaN")
     221    if (zero == x)     FAILURE ("==", "NaN")
     222    if (m_one == x)    FAILURE ("==", "NaN")
     223    if (_nan == x)     FAILURE ("==", "NaN")
     224    if (inf == x)      FAILURE ("==", "NaN")
     225    if (m_inf == x)    FAILURE ("==", "NaN")
     226  
     227    /* Equal with infinities, no NaNs.  */
     228  
     229    if (y == two)      FAILURE ("==", "inf")
     230    if (y == zero)     FAILURE ("==", "inf")
     231    if (y == m_one)    FAILURE ("==", "inf")
     232    if (two == y)      FAILURE ("==", "inf")
     233    if (zero == y)     FAILURE ("==", "inf")
     234    if (m_one == y)    FAILURE ("==", "inf")
     235  
     236    if (z == two)      FAILURE ("==", "-inf")
     237    if (z == zero)     FAILURE ("==", "-inf")
     238    if (z == m_one)    FAILURE ("==", "-inf")
     239    if (two == z)      FAILURE ("==", "-inf")
     240    if (zero == z)     FAILURE ("==", "-inf")
     241    if (m_one == z)    FAILURE ("==", "-inf")
     242  
     243    if (!(y == inf))   FAILURE ("==", "inf")
     244    if (y == m_inf)    FAILURE ("==", "inf")
     245    if (z == inf)      FAILURE ("==", "inf")
     246    if (!(z == m_inf)) FAILURE ("==", "inf")
     247  
     248    /* Not equal with NaN.  */
     249  
     250    if (!(x != two))   FAILURE ("!=", "NaN")
     251    if (!(x != zero))  FAILURE ("!=", "NaN")
     252    if (!(x != m_one)) FAILURE ("!=", "NaN")
     253    if (!(x != _nan))  FAILURE ("!=", "NaN")
     254    if (!(x != inf))   FAILURE ("!=", "NaN")
     255    if (!(x != m_inf)) FAILURE ("!=", "NaN")
     256  
     257    if (!(two != x))   FAILURE ("!=", "NaN")
     258    if (!(zero != x))  FAILURE ("!=", "NaN")
     259    if (!(m_one != x)) FAILURE ("!=", "NaN")
     260    if (!(_nan != x))  FAILURE ("!=", "NaN")
     261    if (!(inf != x))   FAILURE ("!=", "NaN")
     262    if (!(m_inf != x)) FAILURE ("!=", "NaN")
     263  
     264    /* Not equal with infinities, no NaNs.  */
     265  
     266    if (!(y != two))   FAILURE ("!=", "inf")
     267    if (!(y != zero))  FAILURE ("!=", "inf")
     268    if (!(y != m_one)) FAILURE ("!=", "inf")
     269    if (!(two != y))   FAILURE ("!=", "inf")
     270    if (!(zero != y))  FAILURE ("!=", "inf")
     271    if (!(m_one != y)) FAILURE ("!=", "inf")
     272  
     273    if (!(z != two))   FAILURE ("!=", "-inf")
     274    if (!(z != zero))  FAILURE ("!=", "-inf")
     275    if (!(z != m_one)) FAILURE ("!=", "-inf")
     276    if (!(two != z))   FAILURE ("!=", "-inf")
     277    if (!(zero != z))  FAILURE ("!=", "-inf")
     278    if (!(m_one != z)) FAILURE ("!=", "-inf")
     279  
     280    if (y != inf)      FAILURE ("!=", "inf")
     281    if (!(y != m_inf)) FAILURE ("!=", "inf")
     282    if (!(z != inf))   FAILURE ("!=", "inf")
     283    if (z != m_inf)    FAILURE ("!=", "inf")
     284  }