Add feraiseexcept optimization for x86-32
authorUlrich Drepper <drepper@gmail.com>
Thu, 22 Dec 2011 22:52:30 +0000 (17:52 -0500)
committerUlrich Drepper <drepper@gmail.com>
Thu, 22 Dec 2011 22:52:30 +0000 (17:52 -0500)
ChangeLog
sysdeps/i386/fpu/bits/fenv.h

index 7c79547..450d827 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2011-12-22  Ulrich Drepper  <drepper@gmail.com>
 
+       * sysdeps/i386/fpu/bits/fenv.h [__SSE_MATH__]: Add feraiseexcept
+       optimization.
+
        [BZ #13185]
        * sysdeps/i386/fpu/fgetexcptflg.c (__fegetexceptflag): Also return
        SSE flags if possible.
index ef3fcb3..e11e83f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 1999, 2000, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -88,3 +88,41 @@ fenv_t;
 /* Floating-point environment where none of the exception is masked.  */
 # define FE_NOMASK_ENV ((__const fenv_t *) -2)
 #endif
+
+
+#if defined __SSE_MATH__ && defined __USE_EXTERN_INLINES
+__BEGIN_DECLS
+
+/* Optimized versions.  */
+extern int __REDIRECT_NTH (__feraiseexcept_renamed, (int), feraiseexcept);
+__extern_inline int
+__NTH (feraiseexcept (int __excepts))
+{
+  if (__builtin_constant_p (__excepts)
+      && (__excepts & ~(FE_INVALID | FE_DIVBYZERO)) == 0)
+    {
+      if ((FE_INVALID & __excepts) != 0)
+       {
+         /* One example of a invalid operation is 0.0 / 0.0.  */
+         float __f = 0.0;
+
+         __asm__ __volatile__ ("divss %0, %0 " : : "x" (__f));
+         (void) &__f;
+       }
+      if ((FE_DIVBYZERO & __excepts) != 0)
+       {
+         float __f = 1.0;
+         float __g = 0.0;
+
+         __asm__ __volatile__ ("divss %1, %0" : : "x" (__f), "x" (__g));
+         (void) &__f;
+       }
+
+      return 0;
+    }
+
+  return __feraiseexcept_renamed (__excepts);
+}
+
+__END_DECLS
+#endif