On Sat, Jan 3, 2009 at 10:15 PM, Csaba Halász <csaba.hal...@gmail.com> wrote:
>
> lib.c:67:
>    int len = 0, start = (int)naNumValue(args[1]).num;
>    if(argc < 2) return naNil();
>    nlen = argc > 2 ? naNumValue(args[2]) : naNil();
>    if(!naIsNil(nlen))
>        len = (int)nlen.num;
>
> gcc creates code that performs:
>        len = (int)nlen.num;
>        if(naIsNil(nlen)) nlen = 0;
>
> 0x986256 <f_subvec+70>: xor    %r13d,%r13d
> 0x986259 <f_subvec+73>: callq  0x986b50 <naIsNil>
> 0x98625e <f_subvec+78>: mov    %rbx,(%rsp)
> 0x986262 <f_subvec+82>: movlpd 0x8(%rsp),%xmm2
> 0x986268 <f_subvec+88>: test   %eax,%eax
> 0x98626a <f_subvec+90>: movlpd (%rsp),%xmm0
> 0x98626f <f_subvec+95>: mov    %r14,%rdi
> 0x986272 <f_subvec+98>: cvttsd2si %xmm2,%ebp
> 0x986276 <f_subvec+102>:        cvttsd2si %xmm0,%edx
> 0x98627a <f_subvec+106>:        cmove  %edx,%r13d
>
> This may qualify as a gcc bug. I am using version 4.1.2, I guess I
> need to try a newer version.

Tim was kind enough to show what his gcc 4.3 generated (thanks!), and
that looks okay:

0x962936 <f_subvec+70>: xor    %r12d,%r12d
0x962939 <f_subvec+73>: callq  0x9632c0 <naIsNil>
0x96293e <f_subvec+78>: test   %eax,%eax
0x962940 <f_subvec+80>: jne    0x96294e <f_subvec+94>
0x962942 <f_subvec+82>: mov    %rbx,0x8(%rsp)
0x962947 <f_subvec+87>: cvttsd2si 0x8(%rsp),%r12d

The last instruction is the cast to int, and it is only performed if
the naIsNil test returns false.
Hopefully gcc always does the right thing, and it wasn't just a
coincidence here.

-- 
Csaba/Jester

------------------------------------------------------------------------------
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel

Reply via email to