1/* { dg-options "-O2 -w" } */
2
3/* N1150 5.1 Conversions from decimal float to integer.  */
4
5/* Test decimal float to integer conversions for values at the limit of
6   what will fit into the destination type.  This assumes 32-bit int and
7   64-bit long long (there's a check for that below).  This version tests
8   conversions during compilation.  */
9
10#include "dfp-dbg.h"
11
12extern void link_error (void);
13
14void
15doit ()
16{
17  _Decimal32 d32;
18  _Decimal64 d64;
19  _Decimal128 d128;
20  int si;
21  unsigned int ui;
22  long long sll;
23  unsigned long long ull;
24
25  /* _Decimal32 to int.  */
26
27  d32 = 2147483.E3DF;
28  si = d32;
29  if (si != 2147483000)
30    link_error ();
31
32  d32 = -2147483.E3DF;
33  si = d32;
34  if (si != -2147483000)
35    link_error ();
36
37  /* _Decimal32 to unsigned int.  */
38
39  d32 = 4.294967E9DF;
40  ui = d32;
41  if (ui != 4294967000U)
42    link_error ();
43
44  /* _Decimal32 to long long.  */
45
46  d32 = 922.3372E16DF;
47  sll = d32;
48  if (sll != 9223372000000000000LL)
49    link_error ();
50
51  d32 = -92233.72E14DF;
52  sll = d32;
53  if (sll != -9223372000000000000LL)
54    link_error ();
55
56  /* _Decimal32 to unsigned long long.  */
57
58  d32 = 0.1844674E20DF;
59  ull = d32;
60  if (ull != 18446740000000000000ULL)
61    link_error ();
62
63  /* _Decimal64 to int.  */
64
65  d64 = 2.147483647E9DD;
66  si = d64;
67  if (si != 2147483647)
68    link_error ();
69
70  d64 = -2147483648.DD;
71  si = d64;
72  if (si != -2147483648)
73    link_error ();
74
75  /* _Decimal64 to unsigned int.  */
76
77  d64 = 42949.67295E5DD;
78  ui = d64;
79  if (ui != 4294967295)
80    link_error ();
81
82  /* _Decimal64 to long long.  */
83
84  d64 = 9.223372036854775E18DD;
85  sll = d64;
86  if (sll != 9223372036854775000LL)
87    link_error ();
88
89  d64 = -92233720.36854775E11DD;
90  sll = d64;
91  if (sll != -9223372036854775000LL)
92    link_error ();
93
94  /* _Decimal64 to unsigned long long.  */
95  d64 = 1844674407370955.E4DD;
96  ull = d64;
97  if (ull != 18446744073709550000ULL)
98    link_error ();
99
100  /* _Decimal128 to int.  */
101
102  d128 = 2.147483647E9DL;
103  si = d128;
104  if (si != 2147483647)
105    link_error ();
106
107  d128 = -2147483648.DL;
108  si = d128;
109  if (si != -2147483648)
110    link_error ();
111
112  /* _Decimal128 to unsigned int.  */
113
114  d128 = 4294.967295E6DL;
115  ui = d128;
116  if (ui != 4294967295)
117    link_error ();
118
119  /* _Decimal128 to long long.  */
120
121  d128 = 9223372036854775807.DL;
122  sll = d128;
123  if (sll != 9223372036854775807LL)
124    link_error ();
125
126  d128 = -9.223372036854775808E19DL;
127  sll = d128;
128  if (sll != -9223372036854775807LL - 1LL)
129    link_error ();
130
131  /* _Decimal128 to unsigned long long.  */
132  d128 = 18446744073709551615.DL;
133  ull = d128;
134  if (ull != 18446744073709551615ULL)
135    link_error ();
136}
137
138int
139main ()
140{
141  /* This test assumes 32-bit int and 64-bit long long.  */
142
143  if (sizeof (int) != 4 || sizeof (long long) != 8)
144    return 0;
145
146  doit ();
147  return 0;
148}
149