From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 40038 invoked by alias); 9 Dec 2016 13:00:58 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 39864 invoked by uid 89); 9 Dec 2016 13:00:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.9 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=6286, Hx-languages-length:5693, 1759 X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 09 Dec 2016 13:00:51 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0A0E5152D; Fri, 9 Dec 2016 05:00:50 -0800 (PST) Received: from localhost (e105548-lin.manchester.arm.com [10.45.32.67]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id AA39E3F477 for ; Fri, 9 Dec 2016 05:00:49 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [12/67] Use opt_scalar_float_mode when iterating over float modes References: <87h96dp8u6.fsf@e105548-lin.cambridge.arm.com> Date: Fri, 09 Dec 2016 13:00:00 -0000 In-Reply-To: <87h96dp8u6.fsf@e105548-lin.cambridge.arm.com> (Richard Sandiford's message of "Fri, 09 Dec 2016 12:48:01 +0000") Message-ID: <871sxhntog.fsf@e105548-lin.cambridge.arm.com> User-Agent: Gnus/5.130012 (Ma Gnus v0.12) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2016-12/txt/msg00783.txt.bz2 This means that we know when accessing the modes that the size is a compile-time constant, even for SVE. It also enables stricter type safety in later patches. gcc/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * machmode.h (mode_iterator::start): Provide overload for opt_modes. (mode_iterator::iterate_p): Likewise. (mode_iterator::get_wider): Likewise. * expr.c (init_expr_target): Use opt_scalar_float_mode. gcc/ada/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * gcc-interface/misc.c (fp_prec_to_size): Use opt_scalar_float_mode. (fp_size_to_prec): Likewise. gcc/c-family/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * c-cppbuiltin.c (c_cpp_builtins): Use opt_scalar_float_mode. gcc/fortran/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * trans-types.c (gfc_init_kinds): Use opt_scalar_float_mode and FOR_EACH_MODE_IN_CLASS. diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index 4bb22ed..cef8d84 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -1278,11 +1278,11 @@ enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int)) int fp_prec_to_size (int prec) { - machine_mode mode; + opt_scalar_float_mode mode; FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT) - if (GET_MODE_PRECISION (mode) == prec) - return GET_MODE_BITSIZE (mode); + if (GET_MODE_PRECISION (*mode) == prec) + return GET_MODE_BITSIZE (*mode); gcc_unreachable (); } @@ -1292,11 +1292,11 @@ fp_prec_to_size (int prec) int fp_size_to_prec (int size) { - machine_mode mode; + opt_scalar_float_mode mode; FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT) - if (GET_MODE_BITSIZE (mode) == size) - return GET_MODE_PRECISION (mode); + if (GET_MODE_BITSIZE (*mode) == size) + return GET_MODE_PRECISION (*mode); gcc_unreachable (); } diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c index 0d6f538..32a999a 100644 --- a/gcc/c-family/c-cppbuiltin.c +++ b/gcc/c-family/c-cppbuiltin.c @@ -1184,9 +1184,10 @@ c_cpp_builtins (cpp_reader *pfile) if (flag_building_libgcc) { /* Properties of floating-point modes for libgcc2.c. */ - machine_mode mode; - FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT) + opt_scalar_float_mode mode_iter; + FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT) { + scalar_float_mode mode = *mode_iter; const char *name = GET_MODE_NAME (mode); char *macro_name = (char *) alloca (strlen (name) diff --git a/gcc/expr.c b/gcc/expr.c index a3a3e86..d277a88 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -110,7 +110,6 @@ void init_expr_target (void) { rtx pat; - machine_mode mode; int num_clobbers; rtx mem, mem1; rtx reg; @@ -129,7 +128,7 @@ init_expr_target (void) pat = gen_rtx_SET (NULL_RTX, NULL_RTX); PATTERN (insn) = pat; - for (mode = VOIDmode; (int) mode < NUM_MACHINE_MODES; + for (machine_mode mode = VOIDmode; (int) mode < NUM_MACHINE_MODES; mode = (machine_mode_enum) ((int) mode + 1)) { int regno; @@ -175,9 +174,11 @@ init_expr_target (void) mem = gen_rtx_MEM (VOIDmode, gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1)); - FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT) + opt_scalar_float_mode mode_iter; + FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT) { - machine_mode srcmode; + scalar_float_mode mode = *mode_iter; + scalar_float_mode srcmode; FOR_EACH_MODE_UNTIL (srcmode, mode) { enum insn_code ic; diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index c0d1a17..4c69237 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -348,6 +348,7 @@ void gfc_init_kinds (void) { machine_mode_enum mode; + opt_scalar_float_mode float_mode_iter; int i_index, r_index, kind; bool saw_i4 = false, saw_i8 = false; bool saw_r4 = false, saw_r8 = false, saw_r10 = false, saw_r16 = false; @@ -403,9 +404,10 @@ gfc_init_kinds (void) /* Set the maximum integer kind. Used with at least BOZ constants. */ gfc_max_integer_kind = gfc_integer_kinds[i_index - 1].kind; - for (r_index = 0, mode = MIN_MODE_FLOAT; mode <= MAX_MODE_FLOAT; - mode = (machine_mode_enum) ((int) mode + 1)) + r_index = 0; + FOR_EACH_MODE_IN_CLASS (float_mode_iter, MODE_FLOAT) { + scalar_float_mode mode = *float_mode_iter; const struct real_format *fmt = REAL_MODE_FORMAT (mode); int kind; diff --git a/gcc/machmode.h b/gcc/machmode.h index 41a3a00..2f4b076 100644 --- a/gcc/machmode.h +++ b/gcc/machmode.h @@ -628,6 +628,16 @@ namespace mode_iterator { /* Start mode iterator *ITER at the first mode in class MCLASS, if any. */ + template + inline void + start (opt_mode *iter, enum mode_class mclass) + { + if (GET_CLASS_NARROWEST_MODE (mclass) == E_VOIDmode) + *iter = opt_mode (); + else + *iter = as_a (GET_CLASS_NARROWEST_MODE (mclass)); + } + inline void start (machine_mode *iter, enum mode_class mclass) { @@ -636,6 +646,13 @@ namespace mode_iterator /* Return true if mode iterator *ITER has not reached the end. */ + template + inline bool + iterate_p (opt_mode *iter) + { + return iter->exists (); + } + inline bool iterate_p (machine_mode *iter) { @@ -645,6 +662,13 @@ namespace mode_iterator /* Set mode iterator *ITER to the next widest mode in the same class, if any. */ + template + inline void + get_wider (opt_mode *iter) + { + *iter = GET_MODE_WIDER_MODE (**iter); + } + inline void get_wider (machine_mode *iter) {