This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC 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: _Fract types and conversion routines


On Thu, Oct 29, 2015 at 6:49 PM, Steve Ellcey <sellcey@imgtec.com> wrote:
>
> OK, I think I understand what is happening with the MIPS failure when
> converting 'signed char' to '_Sat unsigned _Fract' after I removed
> the TARGET_PROMOTE_PROTOTYPES macro.
>
> This bug is a combination of two factors, one is that calls to library
> functions (like __satfractqiuhq) don't necessarily get the right type
> promotion (specifically with regards to signedness) of their arguments
> and the other is that __satfractqiuhq doesn't deal with that problem
> correctly, though I think it is supposed to.
>
> Reading emit_library_call_value_1 I see comments like:
>
>   /* Todo, choose the correct decl type of orgfun. Sadly this information
>      isn't present here, so we default to native calling abi here.  */
>
> So I think that when calling a library function like '__satfractqiuhq'
> which takes a signed char argument or calling a library function like
> __satfractunsqiuhq which takes an unsigned char argument
> emit_library_call_value_1 cannot ensure that the right type of extension
> (signed vs unsigned) is done on the argument when it is put in the
> argument register.  Does this sound like a correct understanding of the
> limitation in emit_library_call_value_1?
>
> I don't see this issue on regular non-library calls, presumably because
> the compiler has all the information needed to do correct explicit
> conversions.
>
> When I look at the preprocessed __satfractqiuhq code I see:
>
> unsigned short _Fract
> __satfractqiuhq (signed char a) {
>
>         signed char x = a;
>         low = (short) x;
>
> When TARGET_PROMOTE_PROTOTYPES was defined this triggered explicit
> code truncate/sign extend code that took care of the problem I am
> seeing but when I removed it, GCC assumed the caller had taken care
> of the truncate/sign extension and, because this is a library function,
> that wasn't done correctly and I don't think it can be done correctly
> because emit_library_call_value_1 doesn't have the necessary
> information.
>
> So should __satfractqiuhq be dealing with the fact that the argument 'a'
> may not have been sign extend in the correct way?

No.  GCC should ensure libcalls (yes, they are speical for some non-obvious
reason) always adhere to the platform ABI at the caller side.

Not sure why the libcall path doesn't (well, I gues it doesn't) adhere
to FUNCTION_VALUE and friends.  History maybe (or maybe the
idea to explicitely allow differing ABIs for those?)

Richard.

> I have tried a few code changes in fixed-bit.c (to no avail) but this
> code is so heavily macro-ized it is tough to figure out what it should
> be doing.
>
> Steve Ellcey
> sellcey@imgtec.com
>
>


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