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