Hi Andy!

Nice trick, but gcc likes to reorder loads and causes SIGFPE when
converting to integer (assuming exceptions are enabled).
Such as here:

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.

-- 
Csaba/Jester

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

Reply via email to