[haiku-commits] r35527 - in haiku/trunk/src/system/libroot: . posix posix/arch/arm posix/arch/ppc posix/arch/x86

Author: korli
Date: 2010-02-19 23:48:35 +0100 (Fri, 19 Feb 2010)
New Revision: 35527
Changeset: http://dev.haiku-os.org/changeset/35527/haiku

Added:
   haiku/trunk/src/system/libroot/posix/arch/arm/Jamfile
   haiku/trunk/src/system/libroot/posix/arch/arm/fenv.c
   haiku/trunk/src/system/libroot/posix/arch/ppc/fenv.c
   haiku/trunk/src/system/libroot/posix/arch/x86/fenv.c
Removed:
   haiku/trunk/src/system/libroot/posix/fenv/
Modified:
   haiku/trunk/src/system/libroot/Jamfile
   haiku/trunk/src/system/libroot/posix/Jamfile
   haiku/trunk/src/system/libroot/posix/arch/ppc/Jamfile
   haiku/trunk/src/system/libroot/posix/arch/x86/Jamfile
Log:
moved fenv arch implementations to their respective directories


Modified: haiku/trunk/src/system/libroot/Jamfile
===================================================================
--- haiku/trunk/src/system/libroot/Jamfile      2010-02-19 21:35:46 UTC (rev 
35526)
+++ haiku/trunk/src/system/libroot/Jamfile      2010-02-19 22:48:35 UTC (rev 
35527)
@@ -15,7 +15,6 @@
        posix_crypt.o
        posix_locale.o
        posix_main.o
-       posix_fenv.o
        posix_pthread.o
        posix_signal.o
        posix_stdio.o

Modified: haiku/trunk/src/system/libroot/posix/Jamfile
===================================================================
--- haiku/trunk/src/system/libroot/posix/Jamfile        2010-02-19 21:35:46 UTC 
(rev 35526)
+++ haiku/trunk/src/system/libroot/posix/Jamfile        2010-02-19 22:48:35 UTC 
(rev 35527)
@@ -30,17 +30,6 @@
        utime.c
 ;
 
-if $(TARGET_ARCH) = x86 {
-       SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src system libroot posix fenv 
i387 ] ;
-} else if $(TARGET_ARCH) = ppc {
-       SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src system libroot posix fenv 
powerpc ] ;
-} else if $(TARGET_ARCH) = arm {
-       SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src system libroot posix fenv 
arm ] ;
-}
-MergeObject posix_fenv.o :
-       fenv.c
-;
-
 SubInclude HAIKU_TOP src system libroot posix arch $(TARGET_ARCH) ;
 
 SubInclude HAIKU_TOP src system libroot posix crypt ;

Added: haiku/trunk/src/system/libroot/posix/arch/arm/Jamfile
===================================================================
--- haiku/trunk/src/system/libroot/posix/arch/arm/Jamfile                       
        (rev 0)
+++ haiku/trunk/src/system/libroot/posix/arch/arm/Jamfile       2010-02-19 
22:48:35 UTC (rev 35527)
@@ -0,0 +1,13 @@
+SubDir HAIKU_TOP src system libroot posix arch arm ;
+
+local genericSources =
+;
+
+MergeObject posix_arch_$(TARGET_ARCH).o :
+       fenv.c
+
+       $(genericSources)
+;
+
+SEARCH on [ FGristFiles $(genericSources) ]
+       = [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;

Copied: haiku/trunk/src/system/libroot/posix/arch/arm/fenv.c (from rev 35524, 
haiku/trunk/src/system/libroot/posix/fenv/arm/fenv.c)
===================================================================
--- haiku/trunk/src/system/libroot/posix/arch/arm/fenv.c                        
        (rev 0)
+++ haiku/trunk/src/system/libroot/posix/arch/arm/fenv.c        2010-02-19 
22:48:35 UTC (rev 35527)
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@xxxxxxxxxxx>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#if 0 // disabled for now
+#include <posix/fenv.h>
+
+/*
+ * Hopefully the system ID byte is immutable, so it's valid to use
+ * this as a default environment.
+ */
+const fenv_t __fe_dfl_env = 0;
+#endif
+

Modified: haiku/trunk/src/system/libroot/posix/arch/ppc/Jamfile
===================================================================
--- haiku/trunk/src/system/libroot/posix/arch/ppc/Jamfile       2010-02-19 
21:35:46 UTC (rev 35526)
+++ haiku/trunk/src/system/libroot/posix/arch/ppc/Jamfile       2010-02-19 
22:48:35 UTC (rev 35527)
@@ -6,6 +6,7 @@
 ;
 
 MergeObject posix_arch_$(TARGET_ARCH).o :
+       fenv.c
        sigsetjmp.S
        siglongjmp.S
 

Copied: haiku/trunk/src/system/libroot/posix/arch/ppc/fenv.c (from rev 35524, 
haiku/trunk/src/system/libroot/posix/fenv/powerpc/fenv.c)
===================================================================
--- haiku/trunk/src/system/libroot/posix/arch/ppc/fenv.c                        
        (rev 0)
+++ haiku/trunk/src/system/libroot/posix/arch/ppc/fenv.c        2010-02-19 
22:48:35 UTC (rev 35527)
@@ -0,0 +1,33 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@xxxxxxxxxxx>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#if 0 // disabled for now
+#include <posix/fenv.h>
+
+const fenv_t __fe_dfl_env = 0x00000000;
+#endif

Modified: haiku/trunk/src/system/libroot/posix/arch/x86/Jamfile
===================================================================
--- haiku/trunk/src/system/libroot/posix/arch/x86/Jamfile       2010-02-19 
21:35:46 UTC (rev 35526)
+++ haiku/trunk/src/system/libroot/posix/arch/x86/Jamfile       2010-02-19 
22:48:35 UTC (rev 35527)
@@ -8,6 +8,7 @@
 ;
 
 MergeObject posix_arch_$(TARGET_ARCH).o :
+       fenv.c
        sigsetjmp.S
        siglongjmp.S
 

Copied: haiku/trunk/src/system/libroot/posix/arch/x86/fenv.c (from rev 35524, 
haiku/trunk/src/system/libroot/posix/fenv/i387/fenv.c)
===================================================================
--- haiku/trunk/src/system/libroot/posix/arch/x86/fenv.c                        
        (rev 0)
+++ haiku/trunk/src/system/libroot/posix/arch/x86/fenv.c        2010-02-19 
22:48:35 UTC (rev 35527)
@@ -0,0 +1,211 @@
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das@xxxxxxxxxxx>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <SupportDefs.h>
+#include <arch/x86/npx.h>
+#include <posix/fenv.h>
+
+const fenv_t __fe_dfl_env = {
+       __INITIAL_NPXCW__,
+       0x0000,
+       0x0000,
+       0x1f80,
+       0xffffffff,
+       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff }
+};
+
+enum __sse_support __has_sse =
+#ifdef __SSE__
+       __SSE_YES;
+#else
+       __SSE_UNK;
+#endif
+
+#define        getfl(x)        __asm __volatile("pushfl\n\tpopl %0" : "=mr" 
(*(x)))
+#define        setfl(x)        __asm __volatile("pushl %0\n\tpopfl" : : "g" 
(x))
+#define        cpuid_dx(x)     __asm __volatile("pushl %%ebx\n\tmovl $1, 
%%eax\n\t"  \
+                                        "cpuid\n\tpopl %%ebx"                \
+                                       : "=d" (*(x)) : : "eax", "ecx")
+
+/*
+ * Test for SSE support on this processor.  We need to do this because
+ * we need to use ldmxcsr/stmxcsr to get correct results if any part
+ * of the program was compiled to use SSE floating-point, but we can't
+ * use SSE on older processors.
+ */
+int
+__test_sse(void)
+{
+       int flag, nflag;
+       int dx_features;
+
+       /* Am I a 486? */
+       getfl(&flag);
+       nflag = flag ^ 0x200000;
+       setfl(nflag);
+       getfl(&nflag);
+       if (flag != nflag) {
+               /* Not a 486, so CPUID should work. */
+               cpuid_dx(&dx_features);
+               if (dx_features & 0x2000000) {
+                       __has_sse = __SSE_YES;
+                       return (1);
+               }
+       }
+       __has_sse = __SSE_NO;
+       return (0);
+}
+
+int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+       fenv_t env;
+       int mxcsr;
+
+       __fnstenv(&env);
+       env.__status &= ~excepts;
+       env.__status |= *flagp & excepts;
+       __fldenv(env);
+
+       if (__HAS_SSE()) {
+               __stmxcsr(&mxcsr);
+               mxcsr &= ~excepts;
+               mxcsr |= *flagp & excepts;
+               __ldmxcsr(mxcsr);
+       }
+
+       return (0);
+}
+
+int
+feraiseexcept(int excepts)
+{
+       fexcept_t ex = excepts;
+
+       fesetexceptflag(&ex, excepts);
+       __fwait();
+       return (0);
+}
+
+int
+fegetenv(fenv_t *envp)
+{
+       int mxcsr;
+
+       __fnstenv(envp);
+       /*
+        * fnstenv masks all exceptions, so we need to restore
+        * the old control word to avoid this side effect.
+        */
+       __fldcw(envp->__control);
+       if (__HAS_SSE()) {
+               __stmxcsr(&mxcsr);
+               __set_mxcsr(*envp, mxcsr);
+       }
+       return (0);
+}
+
+int
+feholdexcept(fenv_t *envp)
+{
+       int mxcsr;
+
+       __fnstenv(envp);
+       __fnclex();
+       if (__HAS_SSE()) {
+               __stmxcsr(&mxcsr);
+               __set_mxcsr(*envp, mxcsr);
+               mxcsr &= ~FE_ALL_EXCEPT;
+               mxcsr |= FE_ALL_EXCEPT << _SSE_EMASK_SHIFT;
+               __ldmxcsr(mxcsr);
+       }
+       return (0);
+}
+
+int
+feupdateenv(const fenv_t *envp)
+{
+       int mxcsr, status;
+
+       __fnstsw(&status);
+       if (__HAS_SSE())
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+       fesetenv(envp);
+       feraiseexcept((mxcsr | status) & FE_ALL_EXCEPT);
+       return (0);
+}
+
+int
+__feenableexcept(int mask)
+{
+       int mxcsr, control, omask;
+
+       mask &= FE_ALL_EXCEPT;
+       __fnstcw(&control);
+       if (__HAS_SSE())
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+       omask = (control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+       control &= ~mask;
+       __fldcw(control);
+       if (__HAS_SSE()) {
+               mxcsr &= ~(mask << _SSE_EMASK_SHIFT);
+               __ldmxcsr(mxcsr);
+       }
+       return (~omask);
+}
+
+int
+__fedisableexcept(int mask)
+{
+       int mxcsr, control, omask;
+
+       mask &= FE_ALL_EXCEPT;
+       __fnstcw(&control);
+       if (__HAS_SSE())
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+       omask = (control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+       control |= mask;
+       __fldcw(control);
+       if (__HAS_SSE()) {
+               mxcsr |= mask << _SSE_EMASK_SHIFT;
+               __ldmxcsr(mxcsr);
+       }
+       return (~omask);
+}
+
+__weak_reference(__feenableexcept, feenableexcept);
+__weak_reference(__fedisableexcept, fedisableexcept);


Other related posts:

  • » [haiku-commits] r35527 - in haiku/trunk/src/system/libroot: . posix posix/arch/arm posix/arch/ppc posix/arch/x86 - korli