On Sat, Jan 3, 2009 at 10:15 PM, Csaba Halász 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 : xor%r13d,%r13d
> 0x986259 : callq 0x986b50
> 0x98625e : mov%rbx,(%rsp)
> 0x986262 : movlpd 0x8(%rsp),%xmm2
> 0x986268 : test %eax,%eax
> 0x98626a : movlpd (%rsp),%xmm0
> 0x98626f : mov%r14,%rdi
> 0x986272 : cvttsd2si %xmm2,%ebp
> 0x986276 :cvttsd2si %xmm0,%edx
> 0x98627a :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 : xor%r12d,%r12d
0x962939 : callq 0x9632c0
0x96293e : test %eax,%eax
0x962940 : jne0x96294e
0x962942 : mov%rbx,0x8(%rsp)
0x962947 : 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