Hi all,

Analysed it further and find out that
function ' rs6000_promote_function_mode ' (rs6000.c) needs modifcation.
"""
static machine_mode
rs6000_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
                              machine_mode mode,
                              int *punsignedp ATTRIBUTE_UNUSED,
                              const_tree, int)
{
  PROMOTE_MODE (mode, *punsignedp, type);
  return mode;
}
"""
Here, This function is promoting the mode but
it is not even touching 'punsignedp' and it is always initialized to zero
by default.
So in all cases 'punsignedp' remain zero even if it is for unsigned type.
which cause the sign extension to happen  even for unsigned type.

is there any way to set 'punsignedp' appropriately here.

Thanks


On Tue, Jan 15, 2019 at 12:11 AM kamlesh kumar <kamleshbha...@gmail.com>
wrote:

> Hi devs,
> consider below testcase:
> $cat test.c
> void foo(){
> unsigned int x=-1;
> double d=x;
> }
> $./cc1 test.c -msoft-float -m64
> $cat test.s
>
> .foo:
> .LFB0:
>         mflr 0
>         std 0,16(1)
>         stdu 1,-128(1)
> .LCFI0:
>         li 9,-1
>         stw 9,112(1)
>         lwa 9,112(1)
>         mr 3,9
>         bl .__floatunsidf
>         nop
>         mr 9,3
>         std 9,120(1)
>         nop
>         addi 1,1,128
> .LCFI1:
>         ld 0,16(1)
>         mtlr 0
>         blr
>         .long 0
>         .byte 0,0,0,1,128,0,0,1
>
> Here, you can see sign extension before calling the __floatunsidf routine.
> As per my understanding it should emit zero extension here because
> __floatunsidf  has  it argument as unsigned type.
>
> Like to know ,  Reason behind doing  sign extension here , rather than
> zero extension.
> or if this is a bug?
> is there Any work around or hook?
> Even you can point me to the right direction in the source? where we need
> to do modification?
>
> Thanks
> ~Kamlesh
>
>
> Thanks !
> Kamlesh
>

Reply via email to