From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4415 invoked by alias); 13 Oct 2003 14:07:39 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 4406 invoked from network); 13 Oct 2003 14:07:38 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 13 Oct 2003 14:07:38 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h9DE7bM21692 for ; Mon, 13 Oct 2003 10:07:37 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h9DE7br06500 for ; Mon, 13 Oct 2003 10:07:37 -0400 Received: from localhost.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id h9DE7a6x015833; Mon, 13 Oct 2003 10:07:37 -0400 Received: by localhost.redhat.com (Postfix, from userid 469) id E4AC72CCAA; Mon, 13 Oct 2003 10:18:48 -0400 (EDT) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16266.46150.968896.729579@localhost.redhat.com> Date: Mon, 13 Oct 2003 14:07:00 -0000 To: vinschen@redhat.com, gdb-patches@sources.redhat.com Subject: Re: [RFA] sh-tdep.c: Fix little endian problem with doubles In-Reply-To: <20031011085429.GA1981@cygbert.vinschen.de> References: <20031007164256.GO29063@cygbert.vinschen.de> <16263.10472.942634.557769@localhost.redhat.com> <20031011085429.GA1981@cygbert.vinschen.de> X-SW-Source: 2003-10/txt/msg00425.txt.bz2 Corinna Vinschen writes: > On Fri, Oct 10, 2003 at 05:47:20PM -0400, Elena Zannoni wrote: > > Corinna Vinschen writes: > > > --- sh-tdep.c.INTERIM 2003-10-04 13:22:01.000000000 +0200 > > > +++ sh-tdep.c 2003-10-07 18:42:13.000000000 +0200 > > > @@ -846,6 +846,17 @@ sh_push_dummy_call_fpu (struct gdbarch * > > > /* Argument goes in a float argument register. */ > > > reg_size = register_size (gdbarch, flt_argreg); > > > regval = extract_unsigned_integer (val, reg_size); > > > + /* A float type taking two registers must be handled > > > + differently in LE mode. */ > > > + if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE > > > + && len == 2 * reg_size) > > > + { > > > + regcache_cooked_write_unsigned (regcache, flt_argreg + 1, > > > + regval); > > > + val += reg_size; > > > + len -= reg_size; > > > + regval = extract_unsigned_integer (val, reg_size); > > > + } > > > > I'd prefer if there is an 'else if' clause just for the > > doubles. I.e. don't use len in the test, but TYPE_LENGTH(type). This is > > too confusing. > > Erm... sorry, I don't quite understand. An `else if' in conjuction > with what `if'? Actually, the double case is handled normally in > BE mode, it's only slightly different in LE mode in that the registers > are swapped. The above code just makes the swap so I really don't see > what the problem is. I mean: the function is structured so that there is pretty much a clause for each possible type. Just add another one. I don't care if there is a bit of code duplication. Something like that, or similar. else if (TYPE_CODE (type) == TYPE_CODE_FLT && flt_argreg <= FLOAT_ARGLAST_REGNUM && TYPE_LENGTH(type) == reg_size) { do old stuff} else if (TYPE_CODE (type) == TYPE_CODE_FLT && TYPE_LENGTH(type) == 2 * reg_size && flt_argreg <= FLOAT_ARGLAST_REGNUM) { if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE) {do something} else {do something else} } else if (blah) Actually, the test that (flt_argreg <= FLOAT_ARGLAST_REGNUM) may not be sufficient anymore, because you are going to be using 2 registers, and you could end up beyond FLOAT_ARGLAST_REGNUM. Or is it fine to have the argument using the last float register, and the stack? Hmm, is sh_next_flt_argreg taking care that doesn't happen? Seems so. > I see, however, that a TYPE_LENGTH(type) might be more readable than the > `len' and even more correct, since len is modified in the loop. Yes, > that makes sense. > > Back to the `else if'. Wouldn't it be better just to pump up the comment > to explain what happens? Instead of > > A float type taking two registers must be handled differently in LE mode. > > better something along the lines > > In little endian mode, float types taking two registers (doubles on sh4, > long doubles on sh2e, sh3e and sh4) must be stored swapped in the argument > registers. The below code first writes the first 32 bits in the next but > one register, increments the val and len values accordingly and then > proceeds as normal by writing the second 32 bits in the next register. This would be good to add anyway. elena > > ? > > Corinna > > -- > Corinna Vinschen > Cygwin Developer > Red Hat, Inc.