| /* { dg-options "-O0" } */ |
| /* { dg-skip-if "test is for emulation" { hard_dfp } } */ |
| |
| /* N1150 5.2: Conversions among decimal floating types and between |
| decimal floating types and generic floating types. |
| C99 6.3.1.5(3) New. |
| |
| Perform conversions between DFP types in which the assigned value |
| cannot be represented exactly in the result and must be rounded |
| correctly according to the current rounding mode. |
| |
| Normally this would not be part of compiler testing, but conversions |
| are currently handled in libgcc via decNumber. */ |
| |
| #include "dfp-dbg.h" |
| #include "dfp-round.h" |
| |
| _Decimal32 d32; |
| _Decimal64 d64; |
| _Decimal128 d128; |
| |
| _Decimal32 d64_to_d32 (_Decimal64 d) { return d; } |
| _Decimal64 d128_to_d64 (_Decimal128 d) { return d; } |
| _Decimal32 d128_to_d32 (_Decimal128 d) { return d; } |
| |
| int |
| do_d64_to_d32 (_Decimal64 orig, _Decimal32 exp) |
| { |
| d64 = orig; |
| d32 = d64_to_d32 (d64); |
| return (d32 == exp); |
| } |
| |
| int |
| do_d128_to_d32 (_Decimal128 orig, _Decimal32 exp) |
| { |
| d128 = orig; |
| d32 = d128_to_d32 (d128); |
| return (d32 == exp); |
| } |
| |
| int |
| do_d128_to_d64 (_Decimal128 orig, _Decimal64 exp) |
| { |
| d128 = orig; |
| d64 = d128_to_d64 (d128); |
| return (d64 == exp); |
| } |
| |
| int |
| main () |
| { |
| DFP_SETROUND (FE_DEC_DOWNWARD); |
| 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.1111125dd, -1.111113df)) 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.1111135dl, 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_d64 (1.1111111111111125dl, 1.111111111111112dd)) 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.1111111111111135dl, -1.111111111111114dd)) FAILURE |
| |
| DFP_SETROUND (FE_DEC_TONEAREST); |
| 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.1111125dd, -1.111112df)) 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.1111135dl, 1.111114df)) 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_d64 (1.1111111111111125dl, 1.111111111111112dd)) 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.1111111111111135dl, -1.111111111111114dd)) FAILURE |
| |
| DFP_SETROUND (FE_DEC_TONEARESTFROMZERO); |
| 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.1111125dd, -1.111113df)) 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.1111135dl, 1.111114df)) 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_d64 (1.1111111111111125dl, 1.111111111111113dd)) 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.1111111111111135dl, -1.111111111111114dd)) FAILURE |
| |
| DFP_SETROUND (FE_DEC_TOWARDZERO); |
| 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.1111125dd, -1.111112df)) 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.1111135dl, 1.111113df)) 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_d64 (1.1111111111111125dl, 1.111111111111112dd)) 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.1111111111111135dl, -1.111111111111113dd)) FAILURE |
| |
| DFP_SETROUND (FE_DEC_UPWARD); |
| 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.1111125dd, -1.111112df)) 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.1111135dl, 1.111114df)) 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_d64 (1.1111111111111125dl, 1.111111111111113dd)) 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.1111111111111135dl, -1.111111111111113dd)) FAILURE |
| |
| FINISH |
| } |