This patch series enables support of DFP on AArch64, using the BID format (Binary Integer Decimal). There is no HW support for DFP on AArch64, and we made a choice similar to x86: BID format using libgcc's libbid for software emulation.
This work was done independently from Andrew's patch, which I discovered some time after I started [1]. The essence is similar although the AArch64 back-end evolved quite a bit since then, and I add several tests. The ABI has been documented a few months ago: _Decimal32 is treated like float, _Decimal64 is treated like double and _Decimal128 is treated like long double, using the same registers and conventions (sN, dN, qN, varargs handling). I have patches for GDB, which I'll send once this series is committed in GCC since the first GDB patch is to merge the libdecnumber updated. As of testing, I have also used libdfp, which required only a couple of minor patches, and its testsuite passes. I have tested the whole series on aarch64, aarch64_be and x86_64, no regression, all the DFP tests pass. OK? Thanks, Christophe [1] https://gcc.gnu.org/legacy-ml/gcc-patches/2017-07/msg00788.html Christophe Lyon (10): aarch64: Enable DFP (Decimal Floating-point) (BID format) aarch64: Add backend support for DFP libgcc: Enable XF mode conversions to/from DFP modes only if supported libgcc: enable DFP for AArch64 testsuite:: Fix pr39986.c testcase for AArch64 testsuite: Add new tests for DFP under aarch64/aapcs64 testsuite: enable more BID DFP tests for AArch64 testsuite: Add C++ unwinding tests with Decimal Floating-Point libgcc: Add support for HF mode (aka __fp16) in libbid libgcc: use __builtin_clz and __builtin_ctz in libbid config/dfp.m4 | 3 +- gcc/config/aarch64/aarch64.cc | 95 ++++++++++--- gcc/config/aarch64/aarch64.md | 86 ++++++------ gcc/config/aarch64/iterators.md | 28 +++- gcc/configure | 3 +- gcc/doc/sourcebuild.texi | 3 + gcc/testsuite/c-c++-common/dfp/pr39986.c | 22 +-- gcc/testsuite/g++.dg/eh/dfp-1.C | 54 +++++++ gcc/testsuite/g++.dg/eh/dfp-2.C | 54 +++++++ gcc/testsuite/g++.dg/eh/dfp-saves-aarch64.C | 49 +++++++ .../gcc.dg/dfp/bid-non-canonical-d128-1.c | 3 +- .../gcc.dg/dfp/bid-non-canonical-d128-2.c | 3 +- .../gcc.dg/dfp/bid-non-canonical-d128-3.c | 3 +- .../gcc.dg/dfp/bid-non-canonical-d128-4.c | 3 +- .../gcc.dg/dfp/bid-non-canonical-d32-1.c | 3 +- .../gcc.dg/dfp/bid-non-canonical-d32-2.c | 3 +- .../gcc.dg/dfp/bid-non-canonical-d64-1.c | 3 +- .../gcc.dg/dfp/bid-non-canonical-d64-2.c | 3 +- .../gcc.target/aarch64/aapcs64/aapcs64.exp | 8 ++ .../gcc.target/aarch64/aapcs64/dfp-1.c | 24 ++++ .../gcc.target/aarch64/aapcs64/func-ret-1.c | 7 + .../gcc.target/aarch64/aapcs64/func-ret-3.c | 67 +++++++++ .../gcc.target/aarch64/aapcs64/ice_dfp_5.c | 20 +++ .../aarch64/aapcs64/test_align_dfp-1.c | 126 +++++++++++++++++ .../aarch64/aapcs64/test_align_dfp-4.c | 42 ++++++ .../gcc.target/aarch64/aapcs64/test_dfp_1.c | 31 ++++ .../gcc.target/aarch64/aapcs64/test_dfp_10.c | 26 ++++ .../gcc.target/aarch64/aapcs64/test_dfp_11.c | 34 +++++ .../gcc.target/aarch64/aapcs64/test_dfp_12.c | 44 ++++++ .../gcc.target/aarch64/aapcs64/test_dfp_13.c | 34 +++++ .../gcc.target/aarch64/aapcs64/test_dfp_14.c | 35 +++++ .../gcc.target/aarch64/aapcs64/test_dfp_15.c | 21 +++ .../gcc.target/aarch64/aapcs64/test_dfp_16.c | 32 +++++ .../gcc.target/aarch64/aapcs64/test_dfp_17.c | 37 +++++ .../gcc.target/aarch64/aapcs64/test_dfp_18.c | 34 +++++ .../gcc.target/aarch64/aapcs64/test_dfp_19.c | 35 +++++ .../gcc.target/aarch64/aapcs64/test_dfp_2.c | 17 +++ .../gcc.target/aarch64/aapcs64/test_dfp_20.c | 22 +++ .../gcc.target/aarch64/aapcs64/test_dfp_21.c | 21 +++ .../gcc.target/aarch64/aapcs64/test_dfp_22.c | 19 +++ .../gcc.target/aarch64/aapcs64/test_dfp_23.c | 42 ++++++ .../gcc.target/aarch64/aapcs64/test_dfp_24.c | 22 +++ .../gcc.target/aarch64/aapcs64/test_dfp_25.c | 61 ++++++++ .../gcc.target/aarch64/aapcs64/test_dfp_26.c | 54 +++++++ .../gcc.target/aarch64/aapcs64/test_dfp_27.c | 46 ++++++ .../gcc.target/aarch64/aapcs64/test_dfp_3.c | 18 +++ .../gcc.target/aarch64/aapcs64/test_dfp_5.c | 24 ++++ .../gcc.target/aarch64/aapcs64/test_dfp_6.c | 26 ++++ .../gcc.target/aarch64/aapcs64/test_dfp_7.c | 30 ++++ .../gcc.target/aarch64/aapcs64/test_dfp_8.c | 24 ++++ .../gcc.target/aarch64/aapcs64/test_dfp_9.c | 32 +++++ .../aarch64/aapcs64/test_quad_double_dfp.c | 26 ++++ .../gcc.target/aarch64/aapcs64/type-def.h | 132 ++++++++++++++++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-1.c | 60 ++++++++ .../aarch64/aapcs64/va_arg_dfp-10.c | 29 ++++ .../aarch64/aapcs64/va_arg_dfp-11.c | 32 +++++ .../aarch64/aapcs64/va_arg_dfp-12.c | 64 +++++++++ .../aarch64/aapcs64/va_arg_dfp-13.c | 59 ++++++++ .../aarch64/aapcs64/va_arg_dfp-14.c | 35 +++++ .../aarch64/aapcs64/va_arg_dfp-16.c | 28 ++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-2.c | 75 ++++++++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-3.c | 94 +++++++++++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-4.c | 90 ++++++++++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-5.c | 47 +++++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-6.c | 40 ++++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-8.c | 25 ++++ .../gcc.target/aarch64/aapcs64/va_arg_dfp-9.c | 31 ++++ .../gcc.target/aarch64/convert-dfp-2.c | 42 ++++++ .../gcc.target/aarch64/convert-dfp.c | 60 ++++++++ gcc/testsuite/lib/target-supports.exp | 11 ++ libdecnumber/configure | 3 +- libgcc/Makefile.in | 9 +- libgcc/config.host | 6 + libgcc/config/libbid/_dd_to_hf.c | 36 +++++ libgcc/config/libbid/_dd_to_xf.c | 2 + libgcc/config/libbid/_hf_to_dd.c | 36 +++++ libgcc/config/libbid/_hf_to_sd.c | 36 +++++ libgcc/config/libbid/_hf_to_td.c | 36 +++++ libgcc/config/libbid/_sd_to_hf.c | 36 +++++ libgcc/config/libbid/_sd_to_xf.c | 2 + libgcc/config/libbid/_td_to_hf.c | 36 +++++ libgcc/config/libbid/_td_to_xf.c | 2 + libgcc/config/libbid/_xf_to_dd.c | 2 + libgcc/config/libbid/_xf_to_sd.c | 2 + libgcc/config/libbid/_xf_to_td.c | 2 + libgcc/config/libbid/bid_binarydecimal.c | 51 +------ libgcc/config/libbid/bid_gcc_intrinsics.h | 30 +++- libgcc/configure | 3 +- 88 files changed, 2698 insertions(+), 148 deletions(-) create mode 100644 gcc/testsuite/g++.dg/eh/dfp-1.C create mode 100644 gcc/testsuite/g++.dg/eh/dfp-2.C create mode 100644 gcc/testsuite/g++.dg/eh/dfp-saves-aarch64.C create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/dfp-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/ice_dfp_5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_align_dfp-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_align_dfp-4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_10.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_11.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_12.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_13.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_14.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_15.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_16.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_17.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_18.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_19.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_20.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_21.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_22.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_23.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_24.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_25.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_26.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_27.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_7.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_dfp_9.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/test_quad_double_dfp.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-10.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-11.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-12.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-13.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-14.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-16.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg_dfp-9.c create mode 100644 gcc/testsuite/gcc.target/aarch64/convert-dfp-2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/convert-dfp.c create mode 100644 libgcc/config/libbid/_dd_to_hf.c create mode 100644 libgcc/config/libbid/_hf_to_dd.c create mode 100644 libgcc/config/libbid/_hf_to_sd.c create mode 100644 libgcc/config/libbid/_hf_to_td.c create mode 100644 libgcc/config/libbid/_sd_to_hf.c create mode 100644 libgcc/config/libbid/_td_to_hf.c -- 2.25.1