/* { dg-options "-O0 -std=gnu99" } */
|
/* { dg-options "-O0 -std=gnu99" } */
|
|
|
/* N1150 5.2: Conversions among decimal floating types and between
|
/* N1150 5.2: Conversions among decimal floating types and between
|
decimal floating types and generic floating types.
|
decimal floating types and generic floating types.
|
C99 6.3.1.5(3) New.
|
C99 6.3.1.5(3) New.
|
|
|
Perform conversions between DFP types in which the assigned value
|
Perform conversions between DFP types in which the assigned value
|
cannot be represented exactly in the result and must be rounded
|
cannot be represented exactly in the result and must be rounded
|
correctly according to the current rounding mode.
|
correctly according to the current rounding mode.
|
|
|
Normally this would not be part of compiler testing, but conversions
|
Normally this would not be part of compiler testing, but conversions
|
are currently handled in libgcc via decNumber. */
|
are currently handled in libgcc via decNumber. */
|
|
|
#include "dfp-round.h"
|
#include "dfp-round.h"
|
|
|
extern void abort (void);
|
extern void abort (void);
|
static int failcnt = 0;
|
static int failcnt = 0;
|
|
|
/* Support compiling the test to report individual failures; default is
|
/* Support compiling the test to report individual failures; default is
|
to abort as soon as a check fails. */
|
to abort as soon as a check fails. */
|
#ifdef DBG
|
#ifdef DBG
|
#include <stdio.h>
|
#include <stdio.h>
|
#define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
|
#define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
|
#else
|
#else
|
#define FAILURE abort ();
|
#define FAILURE abort ();
|
#endif
|
#endif
|
|
|
_Decimal32 d32;
|
_Decimal32 d32;
|
_Decimal64 d64;
|
_Decimal64 d64;
|
_Decimal128 d128;
|
_Decimal128 d128;
|
|
|
_Decimal32 d64_to_d32 (_Decimal64 d) { return d; }
|
_Decimal32 d64_to_d32 (_Decimal64 d) { return d; }
|
_Decimal64 d128_to_d64 (_Decimal128 d) { return d; }
|
_Decimal64 d128_to_d64 (_Decimal128 d) { return d; }
|
_Decimal32 d128_to_d32 (_Decimal128 d) { return d; }
|
_Decimal32 d128_to_d32 (_Decimal128 d) { return d; }
|
|
|
int
|
int
|
do_d64_to_d32 (_Decimal64 orig, _Decimal32 exp)
|
do_d64_to_d32 (_Decimal64 orig, _Decimal32 exp)
|
{
|
{
|
d64 = orig;
|
d64 = orig;
|
d32 = d64_to_d32 (d64);
|
d32 = d64_to_d32 (d64);
|
return (d32 == exp);
|
return (d32 == exp);
|
}
|
}
|
|
|
int
|
int
|
do_d128_to_d32 (_Decimal128 orig, _Decimal32 exp)
|
do_d128_to_d32 (_Decimal128 orig, _Decimal32 exp)
|
{
|
{
|
d128 = orig;
|
d128 = orig;
|
d32 = d128_to_d32 (d128);
|
d32 = d128_to_d32 (d128);
|
return (d32 == exp);
|
return (d32 == exp);
|
}
|
}
|
|
|
int
|
int
|
do_d128_to_d64 (_Decimal128 orig, _Decimal64 exp)
|
do_d128_to_d64 (_Decimal128 orig, _Decimal64 exp)
|
{
|
{
|
d128 = orig;
|
d128 = orig;
|
d64 = d128_to_d64 (d128);
|
d64 = d128_to_d64 (d128);
|
return (d64 == exp);
|
return (d64 == exp);
|
}
|
}
|
|
|
int
|
int
|
main ()
|
main ()
|
{
|
{
|
DFP_SETROUND (FE_DEC_DOWNWARD);
|
DFP_SETROUND (FE_DEC_DOWNWARD);
|
if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
|
if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
|
|
|
DFP_SETROUND (FE_DEC_TONEAREST);
|
DFP_SETROUND (FE_DEC_TONEAREST);
|
if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
|
if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
|
|
|
DFP_SETROUND (FE_DEC_TONEARESTFROMZERO);
|
DFP_SETROUND (FE_DEC_TONEARESTFROMZERO);
|
if (!do_d64_to_d32 (1.1111125dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (1.1111125dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
|
|
|
DFP_SETROUND (FE_DEC_TOWARDZERO);
|
DFP_SETROUND (FE_DEC_TOWARDZERO);
|
if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
|
if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111113dd)) FAILURE
|
|
|
DFP_SETROUND (FE_DEC_UPWARD);
|
DFP_SETROUND (FE_DEC_UPWARD);
|
if (!do_d64_to_d32 (1.1111125dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (1.1111125dd, 1.111113df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
|
if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111113df)) FAILURE
|
if (!do_d64_to_d32 (-1.1111135dd, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111125dl, 1.111113df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
|
if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d32 (-1.1111135dl, -1.111113df)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111113dd)) FAILURE
|
if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111113dd)) FAILURE
|
|
|
if (failcnt)
|
if (failcnt)
|
abort ();
|
abort ();
|
return 0;
|
return 0;
|
}
|
}
|
|
|