help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: unsigned int to float conversion


From: sveiki
Subject: Re: unsigned int to float conversion
Date: Tue, 28 Jul 2009 08:28:33 -0700 (PDT)
User-agent: G2/1.0

You're compiling here in 64-bit, but keep in mind that your unsigned
int is 32 bits wide. With the top 32 bits in rax zeroed, rax (signed)
is equivalent to eax (unsigned), keeping int mind that eax is just the
least significant 32 bits of rax. The conversion instruction
(cvtsi2ss) works on 64-bit signed integers (since your operand is a 64-
bit register).

The 32-bit encoded move, by default zero-extends to 64-bit (according
to x86).

You might want to check these out: 
http://www.intel.com/products/processor/manuals/index.htm

Jeremy


On Jul 20, 1:15 pm, FÖLDY Lajos <fo...@rmki.kfki.hu> wrote:
> Hi guys,
>
> I have some weird results from my program. The suspect is unsigned int to
> float conversion. I have created the following simple test:
>
> // a.cc
>
> void
> cvt_u4_f4(unsigned int* u4, float* f4)
> {
>    *f4=*u4;
>
> }
>
> Compiling it with g++-4.4 -m64 -O3 -S a.cc creates the following listing:
>
>          .file   "a.cc"
>          .text
>          .p2align 4,,15
> .globl _Z9cvt_u4_f4PjPf
>          .type   _Z9cvt_u4_f4PjPf, @function
> _Z9cvt_u4_f4PjPf:
> .LFB0:
>          .cfi_startproc
>          .cfi_personality 0x3,__gxx_personality_v0
>          mov     (%rdi), %eax
>          cvtsi2ssq       %rax, %xmm0
>          movss   %xmm0, (%rsi)
>          ret
>          .cfi_endproc
> .LFE0:
>          .size   _Z9cvt_u4_f4PjPf, .-_Z9cvt_u4_f4PjPf
>          .ident  "GCC: (GNU) 4.4.0"
>          .section        .note.GNU-stack,"",@progbits
>
> Now, here %eax is filled with the unsigned int value, then %rax is
> converted to float. It seems to me that the higher 32 bit of %rax is never
> set, I miss an xor %rax, %rax before mov. Am I right, or I miss something
> else?
>
> thanks,
> lajos



reply via email to

[Prev in Thread] Current Thread [Next in Thread]