From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 75907 invoked by alias); 12 Aug 2015 01:11:54 -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 75870 invoked by uid 89); 12 Aug 2015 01:11:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-pd0-f172.google.com Received: from mail-pd0-f172.google.com (HELO mail-pd0-f172.google.com) (209.85.192.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 12 Aug 2015 01:11:52 +0000 Received: by pdrg1 with SMTP id g1so1133500pdr.2 for ; Tue, 11 Aug 2015 18:11:50 -0700 (PDT) X-Received: by 10.70.91.14 with SMTP id ca14mr62950395pdb.79.1439341910488; Tue, 11 Aug 2015 18:11:50 -0700 (PDT) Received: from bigtime.twiddle.net (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by smtp.gmail.com with ESMTPSA id kv10sm4167810pbc.2.2015.08.11.18.11.49 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Aug 2015 18:11:49 -0700 (PDT) From: Richard Henderson To: gcc-patches@gcc.gnu.org Cc: David Edelsohn Subject: [PATCH 03/15] rs6000: Tidy num_insns_constant vs CONST_DOUBLE Date: Wed, 12 Aug 2015 01:12:00 -0000 Message-Id: <1439341904-9345-4-git-send-email-rth@redhat.com> In-Reply-To: <1439341904-9345-1-git-send-email-rth@redhat.com> References: <1439341904-9345-1-git-send-email-rth@redhat.com> X-IsSubscribed: yes X-SW-Source: 2015-08/txt/msg00556.txt.bz2 After the fact I noticed this does temporarily remove the rs6000_is_valid_and_mask test from the DFmode path, but that will be fixed shortly. And it was missing from the SFmode path the whole time. Cc: David Edelsohn --- * config/rs6000/rs6000.c (num_insns_constant): Share code between single-precision and double-precision paths. Form 64-bit constant for 64-bit guest. --- gcc/config/rs6000/rs6000.c | 54 ++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index abaf7eb..c25aa60 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5299,50 +5299,38 @@ num_insns_constant (rtx op, machine_mode mode) return ins; } - case CONST_DOUBLE: + case CONST_DOUBLE: + { + REAL_VALUE_TYPE rv; + long l[2]; + if (mode == SFmode || mode == SDmode) { - long l; - REAL_VALUE_TYPE rv; - REAL_VALUE_FROM_CONST_DOUBLE (rv, op); if (DECIMAL_FLOAT_MODE_P (mode)) - REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l); + REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l[0]); else - REAL_VALUE_TO_TARGET_SINGLE (rv, l); - return num_insns_constant_wide ((HOST_WIDE_INT) l); + REAL_VALUE_TO_TARGET_SINGLE (rv, l[0]); + low = l[0]; } - - long l[2]; - REAL_VALUE_TYPE rv; - - REAL_VALUE_FROM_CONST_DOUBLE (rv, op); - if (DECIMAL_FLOAT_MODE_P (mode)) - REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l); - else - REAL_VALUE_TO_TARGET_DOUBLE (rv, l); - high = l[WORDS_BIG_ENDIAN == 0]; - low = l[WORDS_BIG_ENDIAN != 0]; - - if (TARGET_32BIT) - return (num_insns_constant_wide (low) - + num_insns_constant_wide (high)); else { - if ((high == 0 && low >= 0) - || (high == -1 && low < 0)) - return num_insns_constant_wide (low); - - else if (rs6000_is_valid_and_mask (op, mode)) - return 2; + REAL_VALUE_FROM_CONST_DOUBLE (rv, op); + if (DECIMAL_FLOAT_MODE_P (mode)) + REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l); + else + REAL_VALUE_TO_TARGET_DOUBLE (rv, l); + high = l[WORDS_BIG_ENDIAN == 0]; + low = l[WORDS_BIG_ENDIAN != 0]; - else if (low == 0) - return num_insns_constant_wide (high) + 1; + if (TARGET_32BIT) + return (num_insns_constant_wide (low) + + num_insns_constant_wide (high)); - else - return (num_insns_constant_wide (high) - + num_insns_constant_wide (low) + 1); + low = (low & 0xfffffffful) | (high << 32); } + return num_insns_constant_wide (low); + } default: gcc_unreachable (); -- 2.4.3