1 /* Basic test of runtime relational comparisons using simple values that
2    are not affected by rounding.  */
3 
4 #include <stdlib.h>
5 #include "dfp-dbg.h"
6 
7 #undef FAILURE
8 #ifdef DBG
9 #define FAILURE(OP,KIND) \
10   { printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
11     failures++; }
12 #else
13 #define FAILURE(OP,KIND) __builtin_abort ();
14 #endif
15 
16 #define PASTE2(A,B) A ## B
17 #define PASTE(A,B) PASTE2(A,B)
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 #elif WIDTH == 64
27 #define DTYPE _Decimal64
28 #define SUFFIX DD
29 #elif WIDTH == 128
30 #define DTYPE _Decimal128
31 #define SUFFIX DL
32 #elif WIDTH == 0
33 /* This is for testing the test using a type known to work.  */
34 #define DTYPE double
35 #define SUFFIX
36 #else
37 #error invalid width for decimal float type
38 #endif
39 
40 DTYPE m_two = PASTE(-2.0, SUFFIX);
41 DTYPE m_one = PASTE(-1.0, SUFFIX);
42 DTYPE zero  = PASTE(0.0, SUFFIX);
43 DTYPE one   = PASTE(1.0, SUFFIX);
44 DTYPE two   = PASTE(2.0, SUFFIX);
45 
46 void
test_compares(void)47 test_compares (void)
48 {
49   DTYPE x = one;
50   DTYPE y = zero;
51   DTYPE z = m_one;
52 
53   /* Less than or equal to: comparisons against equal values.  */
54 
55   if (! (x <= one))   FAILURE ("<=", "equal")
56   if (! (y <= zero))  FAILURE ("<=", "equal")
57   if (! (z <= m_one)) FAILURE ("<=", "equal")
58 
59   /* Less than or equal to: comparisons against lesser values.  */
60 
61   if (x <= m_one)     FAILURE ("<=", "lesser")
62   if (x <= zero)      FAILURE ("<=", "lesser")
63   if (y <= m_one)     FAILURE ("<=", "lesser")
64   if (z <= m_two)     FAILURE ("<=", "lesser")
65 
66   /* Less than or equal to: comparisons against greater values.  */
67 
68   if (! (x <= two))   FAILURE ("<=", "greater")
69   if (! (y <= one))   FAILURE ("<=", "greater")
70   if (! (z <= zero))  FAILURE ("<=", "greater")
71   if (! (z <= one))   FAILURE ("<=", "greater")
72 
73   /* Less than: comparisons against equal values.  */
74 
75   if (x < one)        FAILURE ("<", "equal")
76   if (y < zero)       FAILURE ("<", "equal")
77   if (z < m_one)      FAILURE ("<", "equal")
78 
79   /* Less than: comparisons against lesser values.  */
80 
81   if (x < m_one)      FAILURE ("<", "lesser")
82   if (x < zero)       FAILURE ("<", "lesser")
83   if (y < m_one)      FAILURE ("<", "lesser")
84   if (z < m_two)      FAILURE ("<", "lesser")
85 
86   /* Less than: comparisons against greater values.  */
87 
88   if (! (x < two))    FAILURE ("<", "greater")
89   if (! (y < one))    FAILURE ("<", "greater")
90   if (! (z < zero))   FAILURE ("<", "greater")
91   if (! (z < one))    FAILURE ("<", "greater")
92 
93   /* Greater than or equal to: comparisons against equal values.  */
94 
95   if (! (x >= one))   FAILURE (">=", "equal")
96   if (! (y >= zero))  FAILURE (">=", "equal")
97   if (! (z >= m_one)) FAILURE (">=", "equal")
98 
99   /* Greater than or equal to: comparisons against lesser values.  */
100 
101   if (! (x >= m_one)) FAILURE (">=", "lesser")
102   if (! (x >= zero))  FAILURE (">=", "lesser")
103   if (! (y >= m_one)) FAILURE (">=", "lesser")
104   if (! (z >= m_two)) FAILURE (">=", "lesser")
105 
106   /* Greater than or equal to: comparisons against greater values.  */
107 
108   if (x >= two)       FAILURE (">=", "greater")
109   if (y >= one)       FAILURE (">=", "greater")
110   if (z >= zero)      FAILURE (">=", "greater")
111   if (z >= one)       FAILURE (">=", "greater")
112 
113   /* Greater than: comparisons against equal values.  */
114 
115   if (x > one)        FAILURE (">", "equal")
116   if (y > zero)       FAILURE (">", "equal")
117   if (z > m_one)      FAILURE (">", "equal")
118 
119   /* Greater than: comparisons against lesser values.  */
120 
121   if (! (x > m_one))  FAILURE (">", "lesser")
122   if (! (x > zero))   FAILURE (">", "lesser")
123   if (! (y > m_one))  FAILURE (">", "lesser")
124   if (! (z > m_two))  FAILURE (">", "lesser")
125 
126   /* Greater than: comparisons against greater values.  */
127 
128   if (x > two)        FAILURE (">", "greater")
129   if (y > one)        FAILURE (">", "greater")
130   if (z > zero)       FAILURE (">", "greater")
131   if (z > one)        FAILURE (">", "greater")
132 }
133