From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1732 invoked by alias); 11 Dec 2013 12:29:02 -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 1718 invoked by uid 89); 11 Dec 2013 12:29:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham version=3.3.2 X-HELO: aserp1040.oracle.com Received: from Unknown (HELO aserp1040.oracle.com) (141.146.126.69) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Wed, 11 Dec 2013 12:29:00 +0000 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id rBBCSpkM020900 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 11 Dec 2013 12:28:52 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id rBBCSpT8004297 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 11 Dec 2013 12:28:51 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id rBBCSpcZ021608; Wed, 11 Dec 2013 12:28:51 GMT Received: from termi.oracle.com (/10.175.22.237) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 11 Dec 2013 04:28:50 -0800 From: jose.marchesi@oracle.com (Jose E. Marchesi) To: Mark Kettenis Cc: gdb-patches@sourceware.org Subject: Re: [PATCH] Fix passing double float complex arguments in sparc64 References: <87ob6qo7bs.fsf@oracle.com> <201310231958.r9NJwEje005359@glazunov.sibelius.xs4all.nl> <878uvsv8xl.fsf@oracle.com> Date: Wed, 11 Dec 2013 12:29:00 -0000 In-Reply-To: <878uvsv8xl.fsf@oracle.com> (Jose E. Marchesi's message of "Tue, 10 Dec 2013 19:48:38 +0100") Message-ID: <87haaffu2j.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: 2013-12/txt/msg00425.txt.bz2 > 2013-10-15 Jose E. Marchesi > > * sparc64-tdep.c (sparc64_store_arguments): Do not align complex > double float arguments to 16-byte. Hi Jose, A bit of digging around seems to confirm that we shouldn't align double complex variables. However, I think that with your diff we're still not storing things in the right registers. Aye. Fixed in the amended patch below. Argh, I forgot to fix the case where the argument is promoted to a %o register. Fixed below. Now it works in all cases: normal function with prototype available (args in %f registers), normal function with prototype not available (args in both %f and %o registers) and vararg function (args in %o registers). 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. diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c index 8bcf418..246b7d1 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,13 @@ 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; + } + else if (sparc64_floating_p (type)) { /* Floating arguments. */ if (len == 16) @@ -950,14 +956,23 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, if (regnum != -1) { regcache_cooked_write (regcache, regnum, valbuf); + if (sparc64_complex_floating_p (type) + && (len == 16) + && (regnum < SPARC64_D10_REGNUM)) + regcache_cooked_write (regcache, regnum + 1, valbuf + 8); /* If we're storing the value in a floating-point register, also store it in the corresponding %0 register(s). */ if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D10_REGNUM) { + int dregnum = regnum; gdb_assert (element < 6); regnum = SPARC_O0_REGNUM + element; regcache_cooked_write (regcache, regnum, valbuf); + if (sparc64_complex_floating_p (type) + && (len == 16) + && (dregnum < SPARC64_D10_REGNUM)) + regcache_cooked_write (regcache, regnum + 1, valbuf + 8); } else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q8_REGNUM) {