[PATCH 03/10] [i386] libgcc: Enable hfmode soft-sf/df/xf/tf extensions and truncations.

Richard Biener richard.guenther@gmail.com
Thu Jul 22 12:14:30 GMT 2021


On Wed, Jul 21, 2021 at 9:43 AM liuhongt <hongtao.liu@intel.com> wrote:
>
> gcc/ChangeLog:
>
>         * optabs-query.c (get_best_extraction_insn): Use word_mode for
>         HF field.
>
> libgcc/ChangeLog:
>
>         * config/i386/32/sfp-machine.h (_FP_NANFRAC_H): New macro.
>         * config/i386/64/sfp-machine.h (_FP_NANFRAC_H): Ditto.
>         * config/i386/sfp-machine.h (_FP_NANSIGN_H): Ditto.
>         * config/i386/t-softfp: Add hf soft-fp.
>         * config.host: Add i386/64/t-softfp.
>         * config/i386/64/t-softfp: New file.
> ---
>  gcc/optabs-query.c                  | 10 +++++++++-
>  libgcc/config.host                  |  5 +----
>  libgcc/config/i386/32/sfp-machine.h |  1 +
>  libgcc/config/i386/64/sfp-machine.h |  1 +
>  libgcc/config/i386/64/t-softfp      |  1 +
>  libgcc/config/i386/sfp-machine.h    |  1 +
>  libgcc/config/i386/t-softfp         |  5 +++++
>  7 files changed, 19 insertions(+), 5 deletions(-)
>  create mode 100644 libgcc/config/i386/64/t-softfp
>
> diff --git a/gcc/optabs-query.c b/gcc/optabs-query.c
> index 05ee5f517da..0438e451474 100644
> --- a/gcc/optabs-query.c
> +++ b/gcc/optabs-query.c
> @@ -205,7 +205,15 @@ get_best_extraction_insn (extraction_insn *insn,
>                           machine_mode field_mode)
>  {
>    opt_scalar_int_mode mode_iter;
> -  FOR_EACH_MODE_FROM (mode_iter, smallest_int_mode_for_size (struct_bits))
> +  scalar_int_mode smallest_int_mode;
> +  /* FIXME: validate_subreg only allows (subreg:WORD_MODE (reg:HF) 0). */

I think that needs "fixing" then, or alternatively the caller should care.

> +  if (FLOAT_MODE_P (field_mode)
> +      && known_eq (GET_MODE_SIZE (field_mode), 2))
> +    smallest_int_mode = word_mode;
> +  else
> +    smallest_int_mode = smallest_int_mode_for_size (struct_bits);
> +
> +  FOR_EACH_MODE_FROM (mode_iter, smallest_int_mode)
>      {
>        scalar_int_mode mode = mode_iter.require ();
>        if (get_extraction_insn (insn, pattern, type, mode))
> diff --git a/libgcc/config.host b/libgcc/config.host
> index 50f00062232..96da9ef1cce 100644
> --- a/libgcc/config.host
> +++ b/libgcc/config.host
> @@ -1540,10 +1540,7 @@ i[34567]86-*-elfiamcu | i[34567]86-*-rtems*)
>         ;;
>  i[34567]86-*-* | x86_64-*-*)
>         tmake_file="${tmake_file} t-softfp-tf"
> -       if test "${host_address}" = 32; then
> -               tmake_file="${tmake_file} i386/${host_address}/t-softfp"
> -       fi
> -       tmake_file="${tmake_file} i386/t-softfp t-softfp"
> +       tmake_file="${tmake_file} i386/${host_address}/t-softfp i386/t-softfp t-softfp"
>         ;;
>  esac
>
> diff --git a/libgcc/config/i386/32/sfp-machine.h b/libgcc/config/i386/32/sfp-machine.h
> index 1fa282d7afe..e24cbc8d180 100644
> --- a/libgcc/config/i386/32/sfp-machine.h
> +++ b/libgcc/config/i386/32/sfp-machine.h
> @@ -86,6 +86,7 @@
>  #define _FP_DIV_MEAT_D(R,X,Y)   _FP_DIV_MEAT_2_udiv(D,R,X,Y)
>  #define _FP_DIV_MEAT_Q(R,X,Y)   _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
>
> +#define _FP_NANFRAC_H          _FP_QNANBIT_H
>  #define _FP_NANFRAC_S          _FP_QNANBIT_S
>  #define _FP_NANFRAC_D          _FP_QNANBIT_D, 0
>  /* Even if XFmode is 12byte,  we have to pad it to
> diff --git a/libgcc/config/i386/64/sfp-machine.h b/libgcc/config/i386/64/sfp-machine.h
> index 1ff94c23ea4..e1c616699bb 100644
> --- a/libgcc/config/i386/64/sfp-machine.h
> +++ b/libgcc/config/i386/64/sfp-machine.h
> @@ -13,6 +13,7 @@ typedef unsigned int UTItype __attribute__ ((mode (TI)));
>
>  #define _FP_DIV_MEAT_Q(R,X,Y)   _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
>
> +#define _FP_NANFRAC_H          _FP_QNANBIT_H
>  #define _FP_NANFRAC_S          _FP_QNANBIT_S
>  #define _FP_NANFRAC_D          _FP_QNANBIT_D
>  #define _FP_NANFRAC_E          _FP_QNANBIT_E, 0
> diff --git a/libgcc/config/i386/64/t-softfp b/libgcc/config/i386/64/t-softfp
> new file mode 100644
> index 00000000000..d812bb120bd
> --- /dev/null
> +++ b/libgcc/config/i386/64/t-softfp
> @@ -0,0 +1 @@
> +softfp_extras := fixhfti fixunshfti floattihf floatuntihf
> \ No newline at end of file
> diff --git a/libgcc/config/i386/sfp-machine.h b/libgcc/config/i386/sfp-machine.h
> index 8319f0550bc..f15d29d3755 100644
> --- a/libgcc/config/i386/sfp-machine.h
> +++ b/libgcc/config/i386/sfp-machine.h
> @@ -17,6 +17,7 @@ typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
>  #define _FP_KEEPNANFRACP       1
>  #define _FP_QNANNEGATEDP 0
>
> +#define _FP_NANSIGN_H          1
>  #define _FP_NANSIGN_S          1
>  #define _FP_NANSIGN_D          1
>  #define _FP_NANSIGN_E          1
> diff --git a/libgcc/config/i386/t-softfp b/libgcc/config/i386/t-softfp
> index 685d9cf8502..4ac214eb0ce 100644
> --- a/libgcc/config/i386/t-softfp
> +++ b/libgcc/config/i386/t-softfp
> @@ -1 +1,6 @@
>  LIB2ADD += $(srcdir)/config/i386/sfp-exceptions.c
> +
> +softfp_extensions := hfsf hfdf hftf hfxf sfdf sftf dftf xftf
> +softfp_truncations := tfhf xfhf dfhf sfhf tfsf dfsf tfdf tfxf
> +
> +softfp_extras += eqhf2
> \ No newline at end of file
> --
> 2.18.1
>


More information about the Gcc-patches mailing list