On Sat, Jan 22, 2011 at 5:45 PM, Robert Reif <r...@earthlink.net> wrote:
> Blue Swirl wrote:
>>
>> On Sat, Jan 22, 2011 at 3:30 PM, Mateusz Loskot<mate...@loskot.net>
>>  wrote:
>>
>>>
>>> On 18/01/11 21:51, Blue Swirl wrote:
>>>
>>>>
>>>> On Tue, Jan 18, 2011 at 6:00 PM, Mateusz Loskot<mate...@loskot.net>
>>>>  wrote:
>>>>
>>>>>
>>>>> On 18/01/11 17:36, Blue Swirl wrote:
>>>>>
>>>>>>
>>>>>> On Tue, Jan 18, 2011 at 3:27 PM, Mateusz Loskot<mate...@loskot.net>
>>>>>>  wrote:
>>>>>>
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> Recently, I have reported mysterious issues on NetBSD 5.1
>>>>>>> emulated on SPARC. The whole first thread is here:
>>>>>>>
>>>>>>> http://lists.gnu.org/archive/html/qemu-devel/2011-01/msg01509.html
>>>>>>>
>>>>>>> I decided to investigate the problem deeper and with great help
>>>>>>> from NetBSD folks, I managed to find reproducible test case.
>>>>>>> Initially, it was AWK command:
>>>>>>>
>>>>>>> # echo NaN | awk '{print "test"}'
>>>>>>> awk: floating point exception 8
>>>>>>>  source line number 1
>>>>>>>
>>>>>>> and next it boiled down to simple C program (see below).
>>>>>>> Details of the investigation are archived in the NetBSD Problem
>>>>>>> Report #44389 here:
>>>>>>>
>>>>>>> http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=44389
>>>>>>>
>>>>>>>
>>>>>>> Here is final version of the test program which reproduces the
>>>>>>> problem:
>>>>>>>
>>>>>>> #include<stdio.h>
>>>>>>> #include<stdlib.h>
>>>>>>> #include<math.h>
>>>>>>> #include<errno.h>
>>>>>>>
>>>>>>> int is_number(const char *s)
>>>>>>> {
>>>>>>>        double r;
>>>>>>>        char *ep;
>>>>>>>        errno = 0;
>>>>>>>        r = strtod(s,&ep);
>>>>>>>        if (r == HUGE_VAL)
>>>>>>>                printf("X:%g\n", r);
>>>>>>>
>>>>>>>        if (ep == s || r == HUGE_VAL || errno == ERANGE)
>>>>>>>                return 0;
>>>>>>>        while (*ep == ' ' || *ep == '\t' || *ep == '\n')
>>>>>>>                ep++;
>>>>>>>        if (*ep == '\0')
>>>>>>>                return 1;
>>>>>>>        else
>>>>>>>                return 0;
>>>>>>> }
>>>>>>>
>>>>>>> int main(int argc, char **argv)
>>>>>>> {
>>>>>>>        double v;
>>>>>>>
>>>>>>>        if (is_number("NaN")) {
>>>>>>>                printf("is a number\n");
>>>>>>>                v = atof("NaN");
>>>>>>>        } else {
>>>>>>>                printf("not a number\n");
>>>>>>>                v = 0.0;
>>>>>>>        }
>>>>>>>        printf("%.4f\n", v);
>>>>>>>
>>>>>>>        return 0;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> On NetBSD/SPARC, the program receives SIGFPE:
>>>>>>>
>>>>>>> $ gcc ./nan_test_2.c
>>>>>>>  $ ./a.out
>>>>>>>  [1]   Floating point exception (core dumped) ./a.out
>>>>>>>
>>>>>>> Specifically, it's caused by r == HUGE_VAL condition in
>>>>>>>  if (ep == s || r == HUGE_VAL || errno == ERANGE)
>>>>>>> where r is NaN.
>>>>>>>
>>>>>>> All the signs indicate there is a bug in QEMU.
>>>>>>>
>>>>>>
>>>>>> I'll install 5.1, but on 4.0 which I had installed, the program works
>>>>>> fine:
>>>>>> $ ./sigfpe
>>>>>> is a number
>>>>>> nan
>>>>>>
>>>>>
>>>>> I just tested on NetBSD 5.0/SPARC under QEMU 0.13 (same version I use
>>>>> with
>>>>> NetBSD 5.1/SPARC) and it works well indeed:
>>>>>
>>>>> mloskot@qemu-netbsd-50-sparc:~/tmp# ./a.out
>>>>> is a number
>>>>> nan
>>>>> mloskot@qemu-netbsd-50-sparc:~/tmp#
>>>>>
>>>>> Hmm, this is becoming interesting.
>>>>>
>>>>> I run QEMU 0.13 on Windows Vista (64-bit).
>>>>> Perhaps host system and QEMU binaries are relevant here.
>>>>> I will try on Linux host system later tonight.
>>>>>
>>>>> BTW, here are my images:
>>>>>
>>>>> http://mateusz.loskot.net/tmp/qemu/
>>>>>
>>>>
>>>> The problem was with NaN handling in fcmped instruction. I've
>>>> committed a patch that fixes the problem, please test. Thanks for
>>>> reporting and the test case.
>>>>
>>>
>>> FYI, this problem seems to be occurring in qemu on Windows only.
>>> I tested git version dated before you applied the fix
>>> and built on Linux and the problem does not happening there.
>>>
>>
>> No, it was generic problem. I could reproduce it with your test case
>> and with a small assembler program which only used fcmped using user
>> emulator.
>>
>>
>>
>
> There is still a floating point exception problem that may or may not be
> related.

AFAICS they are not related. Strictly speaking they are not FP
problems but deferred trap processing problems.

> Booting an ss5-170 with a real sun ROM image still fails FP tests:
>
> 4.1.1  fpu    reg          regfile                  Pass
> 4.1.2  fpu    reg          misalign                 Pass
> 4.1.3  fpu    reg          single precision         Pass
> 4.1.4  fpu    reg          double precision         Pass
> 4.2.1  fpu    exceptions   single precision         Failed
> Exception Didn't Block Store : 0 : exp= 00000000, obs= FFFFFFFF
> 4.2.2  fpu    exceptions   double precision         Failed
> Exception Didn't Block Store : 0 : exp= 00000000, obs= FFFFFFFF
>
>
>



-- 
Regards,
Artyom Tarasenko

solaris/sparc under qemu blog: http://tyom.blogspot.com/

Reply via email to