This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [3/9] (decimal_)float_mode_for_size in real.h
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Sandiford <richard dot sandiford at linaro dot org>
- Date: Tue, 5 Sep 2017 13:24:02 +0200
- Subject: Re: [3/9] (decimal_)float_mode_for_size in real.h
- Authentication-results: sourceware.org; auth=none
- References: <87tw0iiu51.fsf@linaro.org> <87h8wiitsg.fsf@linaro.org>
On Mon, Sep 4, 2017 at 1:31 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> This patch makes the binary float macros in real.h use
> float_mode_for_size and adds a corresponding decimal_float_mode_for_size
> for the decimal macros.
Ok.
Richard.
> 2017-09-04 Richard Sandiford <richard.sandiford@linaro.org>
>
> gcc/
> * machmode.h (decimal_float_mode_for_size): New function.
> * real.h (REAL_VALUE_TO_TARGET_LONG_DOUBLE): Use float_mode_for_size.
> (REAL_VALUE_TO_TARGET_DOUBLE): Likewise.
> (REAL_VALUE_TO_TARGET_SINGLE): Likewise.
> (REAL_VALUE_TO_TARGET_DECIMAL128): Use decimal_float_mode_for_size.
> (REAL_VALUE_TO_TARGET_DECIMAL64): Likewise.
> (REAL_VALUE_TO_TARGET_DECIMAL32): Likewise.
>
> Index: gcc/machmode.h
> ===================================================================
> --- gcc/machmode.h 2017-08-30 12:20:57.010045759 +0100
> +++ gcc/machmode.h 2017-09-04 12:18:47.820398622 +0100
> @@ -652,6 +652,15 @@ float_mode_for_size (unsigned int size)
> return dyn_cast <scalar_float_mode> (mode_for_size (size, MODE_FLOAT, 0));
> }
>
> +/* Likewise for MODE_DECIMAL_FLOAT. */
> +
> +inline opt_scalar_float_mode
> +decimal_float_mode_for_size (unsigned int size)
> +{
> + return dyn_cast <scalar_float_mode>
> + (mode_for_size (size, MODE_DECIMAL_FLOAT, 0));
> +}
> +
> /* Similar to mode_for_size, but find the smallest mode for a given width. */
>
> extern machine_mode smallest_mode_for_size (unsigned int, enum mode_class);
> Index: gcc/real.h
> ===================================================================
> --- gcc/real.h 2017-08-30 12:09:02.416468293 +0100
> +++ gcc/real.h 2017-09-04 12:18:47.820398622 +0100
> @@ -383,27 +383,28 @@ #define REAL_VALUE_MINUS_ZERO(x) real_is
> /* IN is a REAL_VALUE_TYPE. OUT is an array of longs. */
> #define REAL_VALUE_TO_TARGET_LONG_DOUBLE(IN, OUT) \
> real_to_target (OUT, &(IN), \
> - mode_for_size (LONG_DOUBLE_TYPE_SIZE, MODE_FLOAT, 0))
> + float_mode_for_size (LONG_DOUBLE_TYPE_SIZE).require ())
>
> #define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT) \
> - real_to_target (OUT, &(IN), mode_for_size (64, MODE_FLOAT, 0))
> + real_to_target (OUT, &(IN), float_mode_for_size (64).require ())
>
> /* IN is a REAL_VALUE_TYPE. OUT is a long. */
> #define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) \
> - ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_FLOAT, 0)))
> + ((OUT) = real_to_target (NULL, &(IN), float_mode_for_size (32).require ()))
>
> /* Real values to IEEE 754 decimal floats. */
>
> /* IN is a REAL_VALUE_TYPE. OUT is an array of longs. */
> #define REAL_VALUE_TO_TARGET_DECIMAL128(IN, OUT) \
> - real_to_target (OUT, &(IN), mode_for_size (128, MODE_DECIMAL_FLOAT, 0))
> + real_to_target (OUT, &(IN), decimal_float_mode_for_size (128).require ())
>
> #define REAL_VALUE_TO_TARGET_DECIMAL64(IN, OUT) \
> - real_to_target (OUT, &(IN), mode_for_size (64, MODE_DECIMAL_FLOAT, 0))
> + real_to_target (OUT, &(IN), decimal_float_mode_for_size (64).require ())
>
> /* IN is a REAL_VALUE_TYPE. OUT is a long. */
> #define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \
> - ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_DECIMAL_FLOAT, 0)))
> + ((OUT) = real_to_target (NULL, &(IN), \
> + decimal_float_mode_for_size (32).require ()))
>
> extern REAL_VALUE_TYPE real_value_truncate (format_helper, REAL_VALUE_TYPE);
>