Fix SH4 fraiseexcpt so to generate exceptions appropriately.

This commit is contained in:
Kaz Kojima 2012-04-05 11:53:49 +09:00
parent 15a946b57a
commit 8a53f50f2a
2 changed files with 48 additions and 6 deletions

View File

@ -1,3 +1,15 @@
2012-04-05 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
* sysdeps/sh/sh4/fpu/fraiseexcpt.c (feraiseexcept): Produce
an exception using FPU order intentionally.
2012-04-05 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
* sysdeps/sh/sh4/fpu/fedisblxcpt.c: New file.
* sysdeps/sh/sh4/fpu/feenablxcpt.c: New file.
* sysdeps/sh/sh4/fpu/fegetexcept.c: New file.
* sysdeps/sh/sh4/fpu/feupdateenv.c: New file.
2012-04-05 Simon Josefsson <simon@josefsson.org>
[BZ #12340]

View File

@ -1,6 +1,7 @@
/* Raise given exceptions.
Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2000, 2002, 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>, 2012.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -17,18 +18,47 @@
<http://www.gnu.org/licenses/>. */
#include <fenv.h>
#include <float.h>
#include <fpu_control.h>
#include <math.h>
int
feraiseexcept (int excepts)
{
if (excepts == 0)
return 0;
/* Raise exceptions represented by EXPECTS. */
fexcept_t temp;
_FPU_GETCW (temp);
temp |= (excepts & FE_ALL_EXCEPT);
temp |= (excepts & FE_ALL_EXCEPT) << 5;
_FPU_SETCW (temp);
if (excepts & FE_INEXACT)
{
double d = 1.0, x = 3.0;
__asm__ __volatile__ ("fdiv %1, %0" : "+d" (d) : "d" (x));
}
if (excepts & FE_UNDERFLOW)
{
long double d = LDBL_MIN, x = 10;
__asm__ __volatile__ ("fdiv %1, %0" : "+d" (d) : "d" (x));
}
if (excepts & FE_OVERFLOW)
{
long double d = LDBL_MAX;
__asm__ __volatile__ ("fmul %0, %0" : "+d" (d) : "d" (d));
}
if (excepts & FE_DIVBYZERO)
{
double d = 1.0, x = 0.0;
__asm__ __volatile__ ("fdiv %1, %0" : "+d" (d) : "d" (x));
}
if (excepts & FE_INVALID)
{
double d = HUGE_VAL, x = 0.0;
__asm__ __volatile__ ("fmul %1, %0" : "+d" (d) : "d" (x));
}
return 0;
}