This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: RS6000 emitting sign extention for unsigned type
- From: kamlesh kumar <kamleshbhalui at gmail dot com>
- To: gcc at gcc dot gnu dot org, Umesh Kalappa <umesh dot kalappa0 at gmail dot com>, jakub at redhat dot com
- Date: Tue, 15 Jan 2019 16:48:27 +0530
- Subject: Re: RS6000 emitting sign extention for unsigned type
- References: <CABKRkghcMLwaiEbo24J1dh6h6QGKSXo57aEpEziLj-0mGBWsqA@mail.gmail.com>
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 <kamleshbhalui@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
>