From patchwork Fri Dec 9 13:00:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 704483 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tZsmp0HRHz9vFg for ; Sat, 10 Dec 2016 00:01:13 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="M6XmTBbS"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:references:date:in-reply-to:message-id:mime-version :content-type; q=dns; s=default; b=I2mhd4xkKlUXFk3wIIlcUdDTkZmXQ bt6Ycz7jc8l51p4JEM3yJGMjjhkErn/TIn1VYGZwLBGYyujRDoNfgG7C4scamsIL 8OH3MeZJD52ucdL1vtVlCd32sKHABY/FQZEHYJp/dmvd3yBxhRo174ioqJHvw66i uUiiP1RSChuFsU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:references:date:in-reply-to:message-id:mime-version :content-type; s=default; bh=MJ4Zt7SSELYOLhvkm/xvSJcvKK8=; b=M6X mTBbSxnmIV+X00qW0RMSq6hZMfWZ7E6Fxe/UWGw8hW5mNTcuXa/p4Si+/uMBC50a sWUt0KjTYW5UWXdnGneNk3j4+Eqb2TbnzCt/XpMxnbaNqNDAr7kMaWpDnw+N8aSs x9Swf5E6wO9/J10QZs8Q3tJbzdCs23XUIXDhFe/4= 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-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@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:47 +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 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) {