qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [sparc] Floating point exception issue


From: Mateusz Loskot
Subject: Re: [Qemu-devel] [sparc] Floating point exception issue
Date: Wed, 19 Jan 2011 12:03:50 +0000
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Thunderbird/3.1.7

On 18/01/11 21:51, Blue Swirl wrote:
On Tue, Jan 18, 2011 at 6:00 PM, Mateusz Loskot<address@hidden>  wrote:
On 18/01/11 17:36, Blue Swirl wrote:

On Tue, Jan 18, 2011 at 3:27 PM, Mateusz Loskot<address@hidden>
  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:

address@hidden:~/tmp# ./a.out
is a number
nan
address@hidden:~/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.

I'm having problems with building qemu under MinGW, so I will need to wait for someone to update binaries.

Stefan, are you planning to update your binaries?
I would be grateful.

Thanks for reporting and the test case.

Thanks for fixing!

Best regards,
--
Mateusz Loskot, http://mateusz.loskot.net
Charter Member of OSGeo, http://osgeo.org
Member of ACCU, http://accu.org



reply via email to

[Prev in Thread] Current Thread [Next in Thread]