From 758eb57e17251a1ca87d5a757966de83dd84be40 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 8 Nov 2013 00:01:41 +0100 Subject: [PATCH] sfp-machine.c (FP_HANDLE_EXCEPTIONS): Handle FP_EX_DENORM. * config/i386/32/sfp-machine.c (FP_HANDLE_EXCEPTIONS): Handle FP_EX_DENORM. * config/i386/64/sfp-machine.c (FP_HANDLE_EXCEPTIONS): Ditto. From-SVN: r204549 --- libgcc/ChangeLog | 11 +++++++++-- libgcc/config/i386/32/sfp-machine.h | 8 ++++++++ libgcc/config/i386/64/sfp-machine.h | 8 ++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index c25c281be07e..dc4fa739d607 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-07 Uros Bizjak + + * config/i386/32/sfp-machine.c (FP_HANDLE_EXCEPTIONS): Handle + FP_EX_DENORM. + * config/i386/64/sfp-machine.c (FP_HANDLE_EXCEPTIONS): Ditto. + 2013-08-01 Maxim Kuvyrkov Backport from trunk: Fix licenses on several libgcc files. @@ -10,7 +16,7 @@ Backport from mainline: 2013-06-08 Walter Lee - + * config/tilepro/atomic.h: Don't include stdint.h or features.h. Replace int64_t with long long. Add __extension__ where appropriate. @@ -50,7 +56,8 @@ PR target/49880 * config/sh/lib1funcs.S (sdivsi3_i4, udivsi3_i4): Enable for SH2A. - (sdivsi3, udivsi3): Remove SH4 check and always compile these functions. + (sdivsi3, udivsi3): Remove SH4 check and always compile these + functions. 2013-03-06 Oleg Endo diff --git a/libgcc/config/i386/32/sfp-machine.h b/libgcc/config/i386/32/sfp-machine.h index 131b2c453f25..7e7952908de1 100644 --- a/libgcc/config/i386/32/sfp-machine.h +++ b/libgcc/config/i386/32/sfp-machine.h @@ -140,6 +140,14 @@ struct fenv __asm__ __volatile__ ("fdiv {%y0, %0|%0, %y0}" : "+t" (f)); \ __asm__ __volatile__ ("fwait"); \ } \ + if (_fex & FP_EX_DENORM) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_DENORM; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ if (_fex & FP_EX_DIVZERO) \ { \ float f = 1.0, g = 0.0; \ diff --git a/libgcc/config/i386/64/sfp-machine.h b/libgcc/config/i386/64/sfp-machine.h index f90305a7642a..57cc873ca9ec 100644 --- a/libgcc/config/i386/64/sfp-machine.h +++ b/libgcc/config/i386/64/sfp-machine.h @@ -89,6 +89,14 @@ struct fenv float f = 0.0; \ __asm__ __volatile__ (ASM_INVALID : : "x" (f)); \ } \ + if (_fex & FP_EX_DENORM) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_DENORM; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ if (_fex & FP_EX_DIVZERO) \ { \ float f = 1.0, g = 0.0; \ -- 2.47.2