sfp-exceptions.c (__sfp_handle_exceptions): Handle FP_EX_DENORM.
* config/i386/sfp-exceptions.c (__sfp_handle_exceptions): Handle FP_EX_DENORM. Store result to volatile location after SSE division to close interrupt window. Remove unneeded fwait after x87 division since interrupt window will be closed by emitted fstp. From-SVN: r204540
This commit is contained in:
parent
f6de942eeb
commit
d59a8fcce6
@ -1,3 +1,10 @@
|
||||
2013-11-07 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* config/i386/sfp-exceptions.c (__sfp_handle_exceptions): Handle
|
||||
FP_EX_DENORM. Store result to volatile location after SSE division
|
||||
to close interrupt window. Remove unneeded fwait after x87
|
||||
division since interrupt window will be closed by emitted fstp.
|
||||
|
||||
2013-11-06 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* soft-fp/README: Update.
|
||||
|
@ -48,20 +48,32 @@ __sfp_handle_exceptions (int _fex)
|
||||
{
|
||||
float f = 0.0f;
|
||||
#ifdef __x86_64__
|
||||
volatile float r;
|
||||
asm volatile ("%vdivss\t{%0, %d0|%d0, %0}" : "+x" (f));
|
||||
r = f; /* Needed to trigger exception. */
|
||||
#else
|
||||
asm volatile ("fdiv\t{%y0, %0|%0, %y0}" : "+t" (f));
|
||||
asm volatile ("fwait");
|
||||
/* No need for fwait, exception is triggered by emitted fstp. */
|
||||
#endif
|
||||
}
|
||||
if (_fex & FP_EX_DENORM)
|
||||
{
|
||||
struct fenv temp;
|
||||
asm volatile ("fnstenv\t%0" : "=m" (temp));
|
||||
temp.__status_word |= FP_EX_DENORM;
|
||||
asm volatile ("fldenv\t%0" : : "m" (temp));
|
||||
asm volatile ("fwait");
|
||||
}
|
||||
if (_fex & FP_EX_DIVZERO)
|
||||
{
|
||||
float f = 1.0f, g = 0.0f;
|
||||
#ifdef __x86_64__
|
||||
volatile float r;
|
||||
asm volatile ("%vdivss\t{%1, %d0|%d0, %1}" : "+x" (f) : "xm" (g));
|
||||
r = f; /* Needed to trigger exception. */
|
||||
#else
|
||||
asm volatile ("fdivs\t%1" : "+t" (f) : "m" (g));
|
||||
asm volatile ("fwait");
|
||||
/* No need for fwait, exception is triggered by emitted fstp. */
|
||||
#endif
|
||||
}
|
||||
if (_fex & FP_EX_OVERFLOW)
|
||||
|
Loading…
Reference in New Issue
Block a user