Re: [Flightgear-devel] NASAL_NAN64 causes SIGFPE with gcc optimization

2009-01-03 Thread Csaba Halász
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


[Flightgear-devel] NASAL_NAN64 causes SIGFPE with gcc optimization

2009-01-03 Thread Csaba Halász
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 : 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.

-- 
Csaba/Jester

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