This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] sh-tdep.c: Fix little endian problem with doubles


On Mon, Oct 13, 2003 at 10:18:46AM -0400, Elena Zannoni wrote:
> Corinna Vinschen writes:
>  > 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)

Hmm, but you see that this messes up the code more than it cleans it up,
don't you?  The reg_size variable depends already on the decision, that
we know if the argument goes in a general or a floating point register.
So the outer if/else if's do have to be kept as they are, to be able to
evaluate the register size correctly, and only then the code can react
on the information that it's a regsize or 2*regsize argument.  Except we
drop the reg_size variable again, since we know that registers are always
4 byte anyway.

> 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,

No.  See the code right before the loop.

> is sh_next_flt_argreg taking care that doesn't happen? Seems so.

Yes.  Consider that doubles are always passed in even register pairs.

Corinna

-- 
Corinna Vinschen
Cygwin Developer
Red Hat, Inc.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]