From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8244 invoked by alias); 10 Feb 2014 13:22:19 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 8234 invoked by uid 89); 10 Feb 2014 13:22:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham version=3.3.2 X-HELO: aserp1040.oracle.com Received: from aserp1040.oracle.com (HELO aserp1040.oracle.com) (141.146.126.69) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Mon, 10 Feb 2014 13:22:17 +0000 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s1ADMDYS015841 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 10 Feb 2014 13:22:14 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s1ADMBt5001838 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 10 Feb 2014 13:22:13 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s1ADMBSY001830; Mon, 10 Feb 2014 13:22:11 GMT Received: from termi.oracle.com (/10.175.45.215) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 10 Feb 2014 05:22:11 -0800 From: jose.marchesi@oracle.com (Jose E. Marchesi) To: Joel Brobecker Cc: gdb-patches@sourceware.org Subject: Re: [PATCH] Fix passing double float complex arguments in sparc64 References: <87d2jid9kk.fsf@oracle.com> <87mwi5s7me.fsf@oracle.com> <20140208024729.GJ5485@adacore.com> Date: Mon, 10 Feb 2014 13:22:00 -0000 In-Reply-To: <20140208024729.GJ5485@adacore.com> (Joel Brobecker's message of "Sat, 8 Feb 2014 06:47:29 +0400") Message-ID: <87bnyfgkw4.fsf@oracle.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2014-02/txt/msg00298.txt.bz2 > 2013-10-15 Jose E. Marchesi > > * sparc64-tdep.c (sparc64_store_arguments): Do not align complex > double float arguments to 16-byte in the argument slots. One remark and a question... > if (regnum != -1) > { > regcache_cooked_write (regcache, regnum, valbuf); > + if (sparc64_complex_floating_p (type) > + && (len == 16) > + && (regnum < SPARC64_D30_REGNUM)) > + regcache_cooked_write (regcache, regnum + 1, valbuf + 8); I think this part should be moved next to where complex_floating_point types are handled in terms of setting regnum. It seems to be the way things are done for other situations like this. Somehow I missed the fact that for big structs and unions the writing of the "additional" register is performed immediately after setting regnum. A bit confusing, but that avoids repeated logic in the `if (regnum != 1)' block, so I agree it is a better solution. Please find below the amended patch. n2013-10-15 Jose E. Marchesi * sparc64-tdep.c (sparc64_store_arguments): Do not align complex double float arguments to 16-byte in the argument slots. diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c index 52958df..9ccee42 100644 --- a/gdb/sparc64-tdep.c +++ b/gdb/sparc64-tdep.c @@ -831,7 +831,7 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, quad-aligned, and thus a hole might be introduced into the parameter array to force alignment." Skip an element if necessary. */ - if (num_elements % 2) + if ((num_elements % 2) && sparc64_16_byte_align_p (type)) num_elements++; } else @@ -890,7 +890,7 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, if (sparc64_structure_or_union_p (type) || (sparc64_complex_floating_p (type) && len == 32)) { - /* Structure or Union arguments. */ + /* Structure, Union or long double Complex arguments. */ gdb_assert (len <= 16); memset (buf, 0, sizeof (buf)); valbuf = memcpy (buf, valbuf, len); @@ -908,7 +908,25 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, if (element < 16) sparc64_store_floating_fields (regcache, type, valbuf, element, 0); } - else if (sparc64_floating_p (type) || sparc64_complex_floating_p (type)) + else if (sparc64_complex_floating_p (type)) + { + /* Float Complex or double Complex arguments. */ + if (element < 16) + { + regnum = SPARC64_D0_REGNUM + element; + + if (len == 16) + { + if (regnum < SPARC64_D30_REGNUM) + regcache_cooked_write (regcache, regnum + 1, valbuf + 8); + if (regnum < SPARC64_D10_REGNUM) + regcache_cooked_write (regcache, + SPARC_O0_REGNUM + element + 1, + valbuf + 8); + } + } + } + else if (sparc64_floating_p (type)) { /* Floating arguments. */ if (len == 16)