From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31091 invoked by alias); 9 Dec 2016 12:58:53 -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 31081 invoked by uid 89); 9 Dec 2016 12:58:52 -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=Hx-languages-length:6246 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 12:58:41 +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 6C209707; Fri, 9 Dec 2016 04:58:40 -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 17A633F477 for ; Fri, 9 Dec 2016 04:58:39 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [9/67] Add SCALAR_FLOAT_TYPE_MODE References: <87h96dp8u6.fsf@e105548-lin.cambridge.arm.com> Date: Fri, 09 Dec 2016 12:58: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: <87eg1hnts1.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/msg00778.txt.bz2 This patch adds a macro that extracts the TYPE_MODE and forcibly converts it to a scalar_float_mode. The forcible conversion includes a gcc_checking_assert that the mode is a SCALAR_FLOAT_MODE_P. This becomes important as more static type checking is added by later patches. It has the additional benefit of bypassing the VECTOR_TYPE_P (...) ? vector_type_mode (...) : ... condition in TYPE_MODE; in release builds the new macro is a simple field access. gcc/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * tree.h (SCALAR_FLOAT_TYPE_MODE): New macro. * builtins.c (expand_builtin_signbit): Use it instead of TYPE_MODE. * fold-const.c (fold_convert_const_real_from_fixed): Likewise. (native_encode_real): Likewise. (native_interpret_real): Likewise. * hsa-brig.c (emit_immediate_scalar_to_buffer): Likewise. * tree-vrp.c (simplify_float_conversion_using_ranges): Likeiwse. gcc/cp/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * mangle.c (write_real_cst): Use SCALAR_FLOAT_TYPE_MODE instead of TYPE_MODE. gcc/fortran/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * target-memory.c (size_float): Use SCALAR_FLOAT_TYPE_MODE instead of TYPE_MODE. gcc/objc/ 2016-11-24 Richard Sandiford Alan Hayward David Sherwood * objc-encoding.c (encode_type): Use SCALAR_FLOAT_TYPE_MODE instead of TYPE_MODE. diff --git a/gcc/builtins.c b/gcc/builtins.c index 1f942b3..6de9a33 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -5210,7 +5210,8 @@ static rtx expand_builtin_signbit (tree exp, rtx target) { const struct real_format *fmt; - machine_mode fmode, imode, rmode; + scalar_float_mode fmode; + machine_mode imode, rmode; tree arg; int word, bitpos; enum insn_code icode; @@ -5221,7 +5222,7 @@ expand_builtin_signbit (tree exp, rtx target) return NULL_RTX; arg = CALL_EXPR_ARG (exp, 0); - fmode = TYPE_MODE (TREE_TYPE (arg)); + fmode = SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (arg)); rmode = TYPE_MODE (TREE_TYPE (exp)); fmt = REAL_MODE_FORMAT (fmode); diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 4fffe0b..3cccb4f 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1795,7 +1795,7 @@ write_real_cst (const tree value) int i, limit, dir; tree type = TREE_TYPE (value); - int words = GET_MODE_BITSIZE (TYPE_MODE (type)) / 32; + int words = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)) / 32; real_to_target (target_real, &TREE_REAL_CST (value), TYPE_MODE (type)); diff --git a/gcc/fold-const.c b/gcc/fold-const.c index c649e54..6d7b839 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -2007,7 +2007,8 @@ fold_convert_const_real_from_fixed (tree type, const_tree arg1) REAL_VALUE_TYPE value; tree t; - real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1)); + real_convert_from_fixed (&value, SCALAR_FLOAT_TYPE_MODE (type), + &TREE_FIXED_CST (arg1)); t = build_real (type, value); TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1); @@ -6970,7 +6971,7 @@ static int native_encode_real (const_tree expr, unsigned char *ptr, int len, int off) { tree type = TREE_TYPE (expr); - int total_bytes = GET_MODE_SIZE (TYPE_MODE (type)); + int total_bytes = GET_MODE_SIZE (SCALAR_FLOAT_TYPE_MODE (type)); int byte, offset, word, words, bitpos; unsigned char value; @@ -7215,7 +7216,7 @@ native_interpret_fixed (tree type, const unsigned char *ptr, int len) static tree native_interpret_real (tree type, const unsigned char *ptr, int len) { - machine_mode mode = TYPE_MODE (type); + scalar_float_mode mode = SCALAR_FLOAT_TYPE_MODE (type); int total_bytes = GET_MODE_SIZE (mode); unsigned char value; /* There are always 32 bits in each long, no matter the size of diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c index ac9cce2..b498f19 100644 --- a/gcc/fortran/target-memory.c +++ b/gcc/fortran/target-memory.c @@ -46,7 +46,7 @@ size_integer (int kind) static size_t size_float (int kind) { - return GET_MODE_SIZE (TYPE_MODE (gfc_get_real_type (kind)));; + return GET_MODE_SIZE (SCALAR_FLOAT_TYPE_MODE (gfc_get_real_type (kind))); } diff --git a/gcc/hsa-brig.c b/gcc/hsa-brig.c index acd9164..5591b5f 100644 --- a/gcc/hsa-brig.c +++ b/gcc/hsa-brig.c @@ -909,7 +909,7 @@ emit_immediate_scalar_to_buffer (tree value, char *data, unsigned need_len) "operands"); return 2; } - unsigned int_len = GET_MODE_SIZE (TYPE_MODE (type)); + unsigned int_len = GET_MODE_SIZE (SCALAR_FLOAT_TYPE_MODE (type)); /* There are always 32 bits in each long, no matter the size of the hosts long. */ long tmp[6]; diff --git a/gcc/objc/objc-encoding.c b/gcc/objc/objc-encoding.c index 4496a09..3b72dd2 100644 --- a/gcc/objc/objc-encoding.c +++ b/gcc/objc/objc-encoding.c @@ -664,7 +664,7 @@ encode_type (tree type, int curtype, int format) { char c; /* Floating point types. */ - switch (GET_MODE_BITSIZE (TYPE_MODE (type))) + switch (GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type))) { case 32: c = 'f'; break; case 64: c = 'd'; break; diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index f3322b6..88ddbf8 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -9969,7 +9969,8 @@ simplify_float_conversion_using_ranges (gimple_stmt_iterator *gsi, { tree rhs1 = gimple_assign_rhs1 (stmt); value_range *vr = get_value_range (rhs1); - machine_mode fltmode = TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))); + scalar_float_mode fltmode + = SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))); machine_mode mode; tree tem; gassign *conv; diff --git a/gcc/tree.h b/gcc/tree.h index f432546..7791c22 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -1829,6 +1829,8 @@ extern void protected_set_expr_location (tree, location_t); ((const machine_mode &) \ (VECTOR_TYPE_P (TYPE_CHECK (NODE)) \ ? vector_type_mode (NODE) : machine_mode ((NODE)->type_common.mode))) +#define SCALAR_FLOAT_TYPE_MODE(NODE) \ + (as_a (TYPE_CHECK (NODE)->type_common.mode)) #define SET_TYPE_MODE(NODE, MODE) \ (TYPE_CHECK (NODE)->type_common.mode = (MODE))