1// Copyright (C) 2009 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3.  If not see
16// <http://www.gnu.org/licenses/>.
17
18// { dg-require-effective-target dfp }
19
20// ISO/IEC TR 24733  3.2.8  Binary arithmetic operators.
21
22#include <decimal/decimal>
23#include <testsuite_hooks.h>
24
25using namespace std::decimal;
26
27decimal32 d32 (5);
28decimal64 d64 (-10);
29decimal128 d128 (25);
30int si = -20;
31unsigned int ui = 50;
32long sl = -10;
33unsigned long ul = 20;
34long long sll = -25;
35unsigned long long ull = 50;
36
37void
38binary_add_32 (void)
39{
40  decimal32 a (1000), b;
41
42  b = si + a;   VERIFY (b == 980);
43  b = ui + a;   VERIFY (b == 1050);
44  b = sl + a;   VERIFY (b == 990);
45  b = ul + a;   VERIFY (b == 1020);
46  b = sll + a;  VERIFY (b == 975);
47  b = ull + a;  VERIFY (b == 1050);
48  b = d32 + a;  VERIFY (b == 1005);
49  b = (decimal32)(d64 + a);  VERIFY (b == 990);
50  b = (decimal32)(d128 + a); VERIFY (b == 1025);
51
52  b = a + si;   VERIFY (b == 980);
53  b = a + ui;   VERIFY (b == 1050);
54  b = a + sl;   VERIFY (b == 990);
55  b = a + ul;   VERIFY (b == 1020);
56  b = a + sll;  VERIFY (b == 975);
57  b = a + ull;  VERIFY (b == 1050);
58  b = a + d32;  VERIFY (b == 1005);
59  b = (decimal32)(a + d64);  VERIFY (b == 990);
60  b = (decimal32)(a + d128); VERIFY (b == 1025);
61}
62
63void
64binary_subtract_32 (void)
65{
66  decimal32 a (1000), b;
67
68  b = a - si;   VERIFY (b == 1020);
69  b = a - ui;   VERIFY (b == 950);
70  b = a - sl;   VERIFY (b == 1010);
71  b = a - ul;   VERIFY (b == 980);
72  b = a - sll;  VERIFY (b == 1025);
73  b = a - ull;  VERIFY (b == 950);
74  b = a - d32;  VERIFY (b == 995);
75  b = (decimal32)(a - d64);  VERIFY (b == 1010);
76  b = (decimal32)(a - d128); VERIFY (b == 975);
77
78  a = -1000;
79  b = si - a;   VERIFY (b == 980);
80  b = ui - a;   VERIFY (b == 1050);
81  b = sl - a;   VERIFY (b == 990);
82  b = ul - a;   VERIFY (b == 1020);
83  b = sll - a;  VERIFY (b == 975);
84  b = ull - a;  VERIFY (b == 1050);
85  b = d32 - a;  VERIFY (b == 1005);
86  b = (decimal32)(d64 - a);  VERIFY (b == 990);
87  b = (decimal32)(d128 - a); VERIFY (b == 1025);
88}
89
90void
91binary_multiply_32 (void)
92{
93  decimal32 a (1000), b;
94
95  b = a * si;   VERIFY (b == -20000);
96  b = a * ui;   VERIFY (b == 50000);
97  b = a * sl;   VERIFY (b == -10000);
98  b = a * ul;   VERIFY (b == 20000);
99  b = a * sll;  VERIFY (b == -25000);
100  b = a * ull;  VERIFY (b == 50000);
101  b = a * d32;  VERIFY (b == 5000);
102  b = (decimal32)(a * d64);  VERIFY (b == -10000);
103  b = (decimal32)(a * d128); VERIFY (b == 25000);
104
105  b = si * a;   VERIFY (b == -20000);
106  b = ui * a;   VERIFY (b == 50000);
107  b = sl * a;   VERIFY (b == -10000);
108  b = ul * a;   VERIFY (b == 20000);
109  b = sll * a;  VERIFY (b == -25000);
110  b = ull * a;  VERIFY (b == 50000);
111  b = d32 * a;  VERIFY (b == 5000);
112  b = (decimal32)(d64 * a);  VERIFY (b == -10000);
113  b = (decimal32)(d128 * a); VERIFY (b == 25000);
114}
115
116void
117binary_divide_32 (void)
118{
119  decimal32 a (1000), b;
120
121  b = a / si;   VERIFY (b == -50);
122  b = a / ui;   VERIFY (b == 20);
123  b = a / sl;   VERIFY (b == -100);
124  b = a / ul;   VERIFY (b == 50);
125  b = a / sll;  VERIFY (b == -40);
126  b = a / ull;  VERIFY (b == 20);
127  b = a / d32;  VERIFY (b == 200);
128  b = (decimal32)(a / d64);  VERIFY (b == -100);
129  b = (decimal32)(a / d128); VERIFY (b == 40);
130
131  a = 5;
132  b = si / a;   VERIFY (b == -4);
133  b = ui / a;   VERIFY (b == 10);
134  b = sl / a;   VERIFY (b == -2);
135  b = ul / a;   VERIFY (b == 4);
136  b = sll / a;  VERIFY (b == -5);
137  b = ull / a;  VERIFY (b == 10);
138  b = d32 / a;  VERIFY (b == 1);
139  b = (decimal32)(d64 / a);  VERIFY (b == -2);
140  b = (decimal32)(d128 / a); VERIFY (b == 5);
141}
142
143void
144binary_add_64 (void)
145{
146  decimal64 a (1000), b;
147
148  b = a + si;   VERIFY (b == 980);
149  b = a + ui;   VERIFY (b == 1050);
150  b = a + sl;   VERIFY (b == 990);
151  b = a + ul;   VERIFY (b == 1020);
152  b = a + sll;  VERIFY (b == 975);
153  b = a + ull;  VERIFY (b == 1050);
154  b = a + d32;  VERIFY (b == 1005);
155  b = a + d64;  VERIFY (b == 990);
156  b = (decimal64)(a + d128); VERIFY (b == 1025);
157
158  b = a + si;   VERIFY (b == 980);
159  b = a + ui;   VERIFY (b == 1050);
160  b = a + sl;   VERIFY (b == 990);
161  b = a + ul;   VERIFY (b == 1020);
162  b = a + sll;  VERIFY (b == 975);
163  b = a + ull;  VERIFY (b == 1050);
164  b = a + d32;  VERIFY (b == 1005);
165  b = a + d64;  VERIFY (b == 990);
166  b = (decimal64)(a + d128); VERIFY (b == 1025);
167}
168
169void
170binary_subtract_64 (void)
171{
172  decimal64 a (1000), b;
173
174  b = a - si;   VERIFY (b == 1020);
175  b = a - ui;   VERIFY (b == 950);
176  b = a - sl;   VERIFY (b == 1010);
177  b = a - ul;   VERIFY (b == 980);
178  b = a - sll;  VERIFY (b == 1025);
179  b = a - ull;  VERIFY (b == 950);
180  b = a - d32;  VERIFY (b == 995);
181  b = a - d64;  VERIFY (b == 1010);
182  b = (decimal64)(a - d128); VERIFY (b == 975);
183
184  a = -1000;
185  b = si - a;   VERIFY (b == 980);
186  b = ui - a;   VERIFY (b == 1050);
187  b = sl - a;   VERIFY (b == 990);
188  b = ul - a;   VERIFY (b == 1020);
189  b = sll - a;  VERIFY (b == 975);
190  b = ull - a;  VERIFY (b == 1050);
191  b = d32 - a;  VERIFY (b == 1005);
192  b = d64 - a;  VERIFY (b == 990);
193  b = (decimal64)(d128 - a); VERIFY (b == 1025);
194}
195
196void
197binary_multiply_64 (void)
198{
199  decimal64 a (1000), b;
200
201  b = a * si;   VERIFY (b == -20000);
202  b = a * ui;   VERIFY (b == 50000);
203  b = a * sl;   VERIFY (b == -10000);
204  b = a * ul;   VERIFY (b == 20000);
205  b = a * sll;  VERIFY (b == -25000);
206  b = a * ull;  VERIFY (b == 50000);
207  b = a * d32;  VERIFY (b == 5000);
208  b = a * d64;  VERIFY (b == -10000);
209  b = (decimal64)(a * d128); VERIFY (b == 25000);
210
211  b = si * a;   VERIFY (b == -20000);
212  b = ui * a;   VERIFY (b == 50000);
213  b = sl * a;   VERIFY (b == -10000);
214  b = ul * a;   VERIFY (b == 20000);
215  b = sll * a;  VERIFY (b == -25000);
216  b = ull * a;  VERIFY (b == 50000);
217  b = d32 * a;  VERIFY (b == 5000);
218  b = d64 * a;  VERIFY (b == -10000);
219  b = (decimal64)(d128 * a); VERIFY (b == 25000);
220}
221
222void
223binary_divide_64 (void)
224{
225  decimal64 a (1000), b;
226
227  b = a / si;   VERIFY (b == -50);
228  b = a / ui;   VERIFY (b == 20);
229  b = a / sl;   VERIFY (b == -100);
230  b = a / ul;   VERIFY (b == 50);
231  b = a / sll;  VERIFY (b == -40);
232  b = a / ull;  VERIFY (b == 20);
233  b = a / d32;  VERIFY (b == 200);
234  b = a / d64;  VERIFY (b == -100);
235  b = (decimal64)(a / d128); VERIFY (b == 40);
236
237  a = 5;
238  b = si / a;   VERIFY (b == -4);
239  b = ui / a;   VERIFY (b == 10);
240  b = sl / a;   VERIFY (b == -2);
241  b = ul / a;   VERIFY (b == 4);
242  b = sll / a;  VERIFY (b == -5);
243  b = ull / a;  VERIFY (b == 10);
244  b = d32 / a;  VERIFY (b == 1);
245  b = d64 / a;  VERIFY (b == -2);
246  b = (decimal64)(d128 / a); VERIFY (b == 5);
247}
248
249void
250binary_add_128 (void)
251{
252  decimal128 a (1000), b;
253
254  b = a + si;   VERIFY (b == 980);
255  b = a + ui;   VERIFY (b == 1050);
256  b = a + sl;   VERIFY (b == 990);
257  b = a + ul;   VERIFY (b == 1020);
258  b = a + sll;  VERIFY (b == 975);
259  b = a + ull;  VERIFY (b == 1050);
260  b = a + d32;  VERIFY (b == 1005);
261  b = a + d64;  VERIFY (b == 990);
262  b = a + d128; VERIFY (b == 1025);
263
264  b = a + si;   VERIFY (b == 980);
265  b = a + ui;   VERIFY (b == 1050);
266  b = a + sl;   VERIFY (b == 990);
267  b = a + ul;   VERIFY (b == 1020);
268  b = a + sll;  VERIFY (b == 975);
269  b = a + ull;  VERIFY (b == 1050);
270  b = a + d32;  VERIFY (b == 1005);
271  b = a + d64;  VERIFY (b == 990);
272  b = a + d128; VERIFY (b == 1025);
273}
274
275void
276binary_subtract_128 (void)
277{
278  decimal128 a (1000), b;
279
280  b = a - si;   VERIFY (b == 1020);
281  b = a - ui;   VERIFY (b == 950);
282  b = a - sl;   VERIFY (b == 1010);
283  b = a - ul;   VERIFY (b == 980);
284  b = a - sll;  VERIFY (b == 1025);
285  b = a - ull;  VERIFY (b == 950);
286  b = a - d32;  VERIFY (b == 995);
287  b = a - d64;  VERIFY (b == 1010);
288  b = a - d128; VERIFY (b == 975);
289
290  a = -1000;
291  b = si - a;   VERIFY (b == 980);
292  b = ui - a;   VERIFY (b == 1050);
293  b = sl - a;   VERIFY (b == 990);
294  b = ul - a;   VERIFY (b == 1020);
295  b = sll - a;  VERIFY (b == 975);
296  b = ull - a;  VERIFY (b == 1050);
297  b = d32 - a;  VERIFY (b == 1005);
298  b = d64 - a;  VERIFY (b == 990);
299  b = d128 - a; VERIFY (b == 1025);
300}
301
302void
303binary_multiply_128 (void)
304{
305  decimal128 a (1000), b;
306
307  b = a * si;   VERIFY (b == -20000);
308  b = a * ui;   VERIFY (b == 50000);
309  b = a * sl;   VERIFY (b == -10000);
310  b = a * ul;   VERIFY (b == 20000);
311  b = a * sll;  VERIFY (b == -25000);
312  b = a * ull;  VERIFY (b == 50000);
313  b = a * d32;  VERIFY (b == 5000);
314  b = a * d64;  VERIFY (b == -10000);
315  b = a * d128; VERIFY (b == 25000);
316
317  b = si * a;   VERIFY (b == -20000);
318  b = ui * a;   VERIFY (b == 50000);
319  b = sl * a;   VERIFY (b == -10000);
320  b = ul * a;   VERIFY (b == 20000);
321  b = sll * a;  VERIFY (b == -25000);
322  b = ull * a;  VERIFY (b == 50000);
323  b = d32 * a;  VERIFY (b == 5000);
324  b = d64 * a;  VERIFY (b == -10000);
325  b = d128 * a; VERIFY (b == 25000);
326}
327
328void
329binary_divide_128 (void)
330{
331  decimal128 a (1000), b;
332
333  b = a / si;   VERIFY (b == -50);
334  b = a / ui;   VERIFY (b == 20);
335  b = a / sl;   VERIFY (b == -100);
336  b = a / ul;   VERIFY (b == 50);
337  b = a / sll;  VERIFY (b == -40);
338  b = a / ull;  VERIFY (b == 20);
339  b = a / d32;  VERIFY (b == 200);
340  b = a / d64;  VERIFY (b == -100);
341  b = a / d128; VERIFY (b == 40);
342
343  a = 5;
344  b = si / a;   VERIFY (b == -4);
345  b = ui / a;   VERIFY (b == 10);
346  b = sl / a;   VERIFY (b == -2);
347  b = ul / a;   VERIFY (b == 4);
348  b = sll / a;  VERIFY (b == -5);
349  b = ull / a;  VERIFY (b == 10);
350  b = d32 / a;  VERIFY (b == 1);
351  b = d64 / a;  VERIFY (b == -2);
352  b = d128 / a; VERIFY (b == 5);
353}
354
355int
356main ()
357{
358  binary_add_32 ();
359  binary_subtract_32 ();
360  binary_multiply_32 ();
361  binary_divide_32 ();
362
363  binary_add_64 ();
364  binary_subtract_64 ();
365  binary_multiply_64 ();
366  binary_divide_64 ();
367
368  binary_add_128 ();
369  binary_subtract_128 ();
370  binary_multiply_128 ();
371  binary_divide_128 ();
372}
373