In http://reviews.llvm.org/D9198#162163, @dsanders wrote:

> > IIRC from a recent discussion, unsigned 32-bit int are represented in a 
> > 64-bit register as sign-extended value of the 32-bit value (i.e. bit 31 is 
> > copied through the top half). So, the caller has to make sure the value is 
> > correctly represented before making a call, right?
>
>
> That's correct in general, all the 32-bit operations sign-extend their result 
> to 64-bit. The ABI documentation is trying to match this architectural 
> behaviour but that didn't seem to be what was actually implemented in gcc.


My understanding is that the called function should assume sign-extended (both 
signed and unsigned) 32-bit integers as inputs on its entry and compiler can 
base decisions on that. One [1] of Strahinja's previous patches was led by a 
bug when floating point value was NOT sign-extended but zero-extended before 
the call, and that led to an incorrect behaviour in the called function. For 
that particular case, GCC was sign-extending the value before making a call.

I know this area is not well defined, this is why I brought another example to 
take into account before any decision is made.

[1] http://reviews.llvm.org/D7791


http://reviews.llvm.org/D9198

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to