From 79052416a684cde121a3f70619c2eb12371be67a Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 30 Aug 2017 11:19:47 +0000 Subject: [PATCH] [67/77] Use scalar_mode in fixed-value.* This patch makes the fixed-value.* routines use scalar_mode. It would be possible to define special classes for these modes, as for scalar_int_mode and scalar_float_mode, but at the moment nothing would benefit from them. In particular, there's no use case that would help select between one class for all fixed-point modes versus one class for fractional modes and one class for accumulator modes. 2017-08-30 Richard Sandiford Alan Hayward David Sherwood gcc/ * fixed-value.h (fixed_from_double_int): Take a scalar_mode rather than a machine_mode. (fixed_from_string): Likewise. (fixed_convert): Likewise. (fixed_convert_from_int): Likewise. (fixed_convert_from_real): Likewise. (real_convert_from_fixed): Likewise. * fixed-value.c (fixed_from_double_int): Likewise. (fixed_from_string): Likewise. (fixed_convert): Likewise. (fixed_convert_from_int): Likewise. (fixed_convert_from_real): Likewise. (real_convert_from_fixed): Likewise. * config/avr/avr.c (avr_out_round): Use as_a . Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r251518 --- gcc/ChangeLog | 19 +++++++++++++++++++ gcc/config/avr/avr.c | 2 +- gcc/fixed-value.c | 12 ++++++------ gcc/fixed-value.h | 15 +++++++-------- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed48b55cab9..88ed52e72d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2017-08-30 Richard Sandiford + Alan Hayward + David Sherwood + + * fixed-value.h (fixed_from_double_int): Take a scalar_mode + rather than a machine_mode. + (fixed_from_string): Likewise. + (fixed_convert): Likewise. + (fixed_convert_from_int): Likewise. + (fixed_convert_from_real): Likewise. + (real_convert_from_fixed): Likewise. + * fixed-value.c (fixed_from_double_int): Likewise. + (fixed_from_string): Likewise. + (fixed_convert): Likewise. + (fixed_convert_from_int): Likewise. + (fixed_convert_from_real): Likewise. + (real_convert_from_fixed): Likewise. + * config/avr/avr.c (avr_out_round): Use as_a . + 2017-08-30 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index ad777e081fd..c1d27497d50 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -9176,7 +9176,7 @@ avr_out_fract (rtx_insn *insn, rtx operands[], bool intsigned, int *plen) const char* avr_out_round (rtx_insn *insn ATTRIBUTE_UNUSED, rtx *xop, int *plen) { - machine_mode mode = GET_MODE (xop[0]); + scalar_mode mode = as_a (GET_MODE (xop[0])); scalar_int_mode imode = int_mode_for_mode (mode).require (); // The smallest fractional bit not cleared by the rounding is 2^(-RP). int fbit = (int) GET_MODE_FBIT (mode); diff --git a/gcc/fixed-value.c b/gcc/fixed-value.c index 3cd44dd74fc..3c92453955c 100644 --- a/gcc/fixed-value.c +++ b/gcc/fixed-value.c @@ -86,7 +86,7 @@ check_real_for_fixed_mode (REAL_VALUE_TYPE *real_value, machine_mode mode) The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */ FIXED_VALUE_TYPE -fixed_from_double_int (double_int payload, machine_mode mode) +fixed_from_double_int (double_int payload, scalar_mode mode) { FIXED_VALUE_TYPE value; @@ -108,7 +108,7 @@ fixed_from_double_int (double_int payload, machine_mode mode) /* Initialize from a decimal or hexadecimal string. */ void -fixed_from_string (FIXED_VALUE_TYPE *f, const char *str, machine_mode mode) +fixed_from_string (FIXED_VALUE_TYPE *f, const char *str, scalar_mode mode) { REAL_VALUE_TYPE real_value, fixed_value, base_value; unsigned int fbit; @@ -803,7 +803,7 @@ fixed_compare (int icode, const FIXED_VALUE_TYPE *op0, Return true, if !SAT_P and overflow. */ bool -fixed_convert (FIXED_VALUE_TYPE *f, machine_mode mode, +fixed_convert (FIXED_VALUE_TYPE *f, scalar_mode mode, const FIXED_VALUE_TYPE *a, bool sat_p) { bool overflow_p = false; @@ -947,7 +947,7 @@ fixed_convert (FIXED_VALUE_TYPE *f, machine_mode mode, Return true, if !SAT_P and overflow. */ bool -fixed_convert_from_int (FIXED_VALUE_TYPE *f, machine_mode mode, +fixed_convert_from_int (FIXED_VALUE_TYPE *f, scalar_mode mode, double_int a, bool unsigned_p, bool sat_p) { bool overflow_p = false; @@ -1031,7 +1031,7 @@ fixed_convert_from_int (FIXED_VALUE_TYPE *f, machine_mode mode, Return true, if !SAT_P and overflow. */ bool -fixed_convert_from_real (FIXED_VALUE_TYPE *f, machine_mode mode, +fixed_convert_from_real (FIXED_VALUE_TYPE *f, scalar_mode mode, const REAL_VALUE_TYPE *a, bool sat_p) { bool overflow_p = false; @@ -1090,7 +1090,7 @@ fixed_convert_from_real (FIXED_VALUE_TYPE *f, machine_mode mode, /* Convert to a new real mode from a fixed-point. */ void -real_convert_from_fixed (REAL_VALUE_TYPE *r, machine_mode mode, +real_convert_from_fixed (REAL_VALUE_TYPE *r, scalar_mode mode, const FIXED_VALUE_TYPE *f) { REAL_VALUE_TYPE base_value, fixed_value, real_value; diff --git a/gcc/fixed-value.h b/gcc/fixed-value.h index 608c872ae92..cc2180b3920 100644 --- a/gcc/fixed-value.h +++ b/gcc/fixed-value.h @@ -47,14 +47,13 @@ extern rtx const_fixed_from_fixed_value (FIXED_VALUE_TYPE, machine_mode); /* Construct a FIXED_VALUE from a bit payload and machine mode MODE. The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */ -extern FIXED_VALUE_TYPE fixed_from_double_int (double_int, - machine_mode); +extern FIXED_VALUE_TYPE fixed_from_double_int (double_int, scalar_mode); /* Return a CONST_FIXED from a bit payload and machine mode MODE. The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */ static inline rtx const_fixed_from_double_int (double_int payload, - machine_mode mode) + scalar_mode mode) { return const_fixed_from_fixed_value (fixed_from_double_int (payload, mode), @@ -63,25 +62,25 @@ const_fixed_from_double_int (double_int payload, /* Initialize from a decimal or hexadecimal string. */ extern void fixed_from_string (FIXED_VALUE_TYPE *, const char *, - machine_mode); + scalar_mode); /* In tree.c: wrap up a FIXED_VALUE_TYPE in a tree node. */ extern tree build_fixed (tree, FIXED_VALUE_TYPE); /* Extend or truncate to a new mode. */ -extern bool fixed_convert (FIXED_VALUE_TYPE *, machine_mode, +extern bool fixed_convert (FIXED_VALUE_TYPE *, scalar_mode, const FIXED_VALUE_TYPE *, bool); /* Convert to a fixed-point mode from an integer. */ -extern bool fixed_convert_from_int (FIXED_VALUE_TYPE *, machine_mode, +extern bool fixed_convert_from_int (FIXED_VALUE_TYPE *, scalar_mode, double_int, bool, bool); /* Convert to a fixed-point mode from a real. */ -extern bool fixed_convert_from_real (FIXED_VALUE_TYPE *, machine_mode, +extern bool fixed_convert_from_real (FIXED_VALUE_TYPE *, scalar_mode, const REAL_VALUE_TYPE *, bool); /* Convert to a real mode from a fixed-point. */ -extern void real_convert_from_fixed (REAL_VALUE_TYPE *, machine_mode, +extern void real_convert_from_fixed (REAL_VALUE_TYPE *, scalar_mode, const FIXED_VALUE_TYPE *); /* Compare two fixed-point objects for bitwise identity. */ -- 2.30.2