[haiku-commits] haiku: hrev53201 - in src/system/libroot/posix/glibc: arch/arm include/arch/arm include/arch/arm/bits

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 17 Jun 2019 20:45:20 -0400 (EDT)

hrev53201 adds 5 changesets to branch 'master'
old head: f861a8596a52c9f0c0b0f0fa90d4c005a74373b9
new head: f1e80d365b23a31801dd69c4b84d3a9965a6f9d0
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=f1e80d365b23+%5Ef861a8596a52

----------------------------------------------------------------------------

b6b66df0c5a0: ArchitectureRules: Disable usage of -mapcs-frame on ARM.
  
  It has been long since deprecated by GCC.

c6b9a07f4469: ArchitectureRules: Allow overriding HAIKU_LINK.
  
  I am using this to use clang+lld for linking on ARM builds,
  which seems to be more tolerant than binutils ld is, and
  gets the build a bit farther for now.

750161f4c0d1: ArchitectureRules: Remove -Wcast-align from the default set.
  
  It is incredibly noisy on GCC8, and not really that valuable
  for us at present. Individual architectures (SPARC?) can turn
  it on if desired.

57e40b440654: Debugger: Use the BVariant default constructor in Token().
  
  The value-based constructor does the same. Fixes an "ambiguous
  call" error on ARM builds.

f1e80d365b23: libroot: Flesh out glibc floating point support for ARM.
  
  The last time someone touched this directory, there was no floating
  point support configured in ARM. Now we are targeting ARMv7a+, which
  always has a hard FPU, so we need this now.
  
  With this, a haiku.hpkg can (finally) be built again (at least
  under lld, anyway!)

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

----------------------------------------------------------------------------

11 files changed, 796 insertions(+), 88 deletions(-)
build/jam/ArchitectureRules                      |  13 +-
.../c_family/CLanguageTokenizer.cpp              |   2 +-
src/system/libroot/posix/glibc/arch/arm/Jamfile  | 167 +++++++-----
.../libroot/posix/glibc/arch/arm/feholdexcpt.c   |  35 +++
.../libroot/posix/glibc/arch/arm/fesetenv.c      |  66 +++++
.../libroot/posix/glibc/arch/arm/fesetround.c    |  39 +++
.../libroot/posix/glibc/arch/arm/fraiseexcpt.c   | 107 ++++++++
.../posix/glibc/include/arch/arm/arm-features.h  |  59 +++++
.../posix/glibc/include/arch/arm/bits/fenv.h     |  70 ++++--
.../posix/glibc/include/arch/arm/fenv_private.h  | 251 +++++++++++++++++++
.../posix/glibc/include/arch/arm/fpu_control.h   |  75 ++++++

############################################################################

Commit:      b6b66df0c5a0b2c8a1be096ff57b30b9c40d9ae3
URL:         https://git.haiku-os.org/haiku/commit/?id=b6b66df0c5a0
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Mon Jun 17 23:57:22 2019 UTC

ArchitectureRules: Disable usage of -mapcs-frame on ARM.

It has been long since deprecated by GCC.

----------------------------------------------------------------------------

diff --git a/build/jam/ArchitectureRules b/build/jam/ArchitectureRules
index daddcbd284..fb8f7fe65a 100644
--- a/build/jam/ArchitectureRules
+++ b/build/jam/ArchitectureRules
@@ -54,13 +54,6 @@ rule ArchitectureSetup architecture
        }
        ccBaseFlags += $(archFlags) ;
 
-       if $(cpu) = arm {
-               if $(HAIKU_CC_IS_CLANG_$(architecture)) != 1 {
-                       # For stackcrawls - not supported by Clang
-                       ccBaseFlags += -mapcs-frame ;
-               }
-       }
-
        # activating graphite optimizations
        if $(HAIKU_USE_GCC_GRAPHITE_$(architecture)) = 1 {
                ccBaseFlags += -floop-interchange -ftree-loop-distribution

############################################################################

Commit:      c6b9a07f4469c8296ca55d1c404282678be01db0
URL:         https://git.haiku-os.org/haiku/commit/?id=c6b9a07f4469
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Mon Jun 17 23:57:58 2019 UTC

ArchitectureRules: Allow overriding HAIKU_LINK.

I am using this to use clang+lld for linking on ARM builds,
which seems to be more tolerant than binutils ld is, and
gets the build a bit farther for now.

----------------------------------------------------------------------------

diff --git a/build/jam/ArchitectureRules b/build/jam/ArchitectureRules
index fb8f7fe65a..6f9b2129b0 100644
--- a/build/jam/ArchitectureRules
+++ b/build/jam/ArchitectureRules
@@ -62,7 +62,7 @@ rule ArchitectureSetup architecture
 
        # initial state for flags etc.
        HAIKU_C++_$(architecture) ?= $(HAIKU_CC_$(architecture)) ;
-       HAIKU_LINK_$(architecture) = $(HAIKU_CC_$(architecture)) ;
+       HAIKU_LINK_$(architecture) ?= $(HAIKU_CC_$(architecture)) ;
 
        HAIKU_CCFLAGS_$(architecture) += $(ccBaseFlags) -nostdinc ;
        HAIKU_C++FLAGS_$(architecture) += $(ccBaseFlags) -nostdinc ;

############################################################################

Commit:      750161f4c0d100968e0118f50ed3d30fa15dc6a8
URL:         https://git.haiku-os.org/haiku/commit/?id=750161f4c0d1
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Mon Jun 17 23:58:39 2019 UTC

ArchitectureRules: Remove -Wcast-align from the default set.

It is incredibly noisy on GCC8, and not really that valuable
for us at present. Individual architectures (SPARC?) can turn
it on if desired.

----------------------------------------------------------------------------

diff --git a/build/jam/ArchitectureRules b/build/jam/ArchitectureRules
index 6f9b2129b0..e8cf9642ba 100644
--- a/build/jam/ArchitectureRules
+++ b/build/jam/ArchitectureRules
@@ -104,11 +104,11 @@ rule ArchitectureSetup architecture
        # warning flags
        HAIKU_WARNING_CCFLAGS_$(architecture) = -Wall
                -Wno-multichar
-               -Wpointer-arith -Wsign-compare -Wcast-align
+               -Wpointer-arith -Wsign-compare
                -Wmissing-prototypes ;
        HAIKU_WARNING_C++FLAGS_$(architecture) = -Wall
                -Wno-multichar
-               -Wpointer-arith -Wsign-compare -Wcast-align
+               -Wpointer-arith -Wsign-compare
                -Wno-ctor-dtor-privacy -Woverloaded-virtual ;
 
        # disable some Clang warnings that are not very useful

############################################################################

Commit:      57e40b4406542c2581e93d5d2f413bbd7c1ed0ea
URL:         https://git.haiku-os.org/haiku/commit/?id=57e40b440654
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Mon Jun 17 23:59:40 2019 UTC

Debugger: Use the BVariant default constructor in Token().

The value-based constructor does the same. Fixes an "ambiguous
call" error on ARM builds.

----------------------------------------------------------------------------

diff --git a/src/kits/debugger/source_language/c_family/CLanguageTokenizer.cpp 
b/src/kits/debugger/source_language/c_family/CLanguageTokenizer.cpp
index 18eb1415de..b4f75a60e5 100644
--- a/src/kits/debugger/source_language/c_family/CLanguageTokenizer.cpp
+++ b/src/kits/debugger/source_language/c_family/CLanguageTokenizer.cpp
@@ -29,7 +29,7 @@ Token::Token()
        :
        string(""),
        type(TOKEN_NONE),
-       value(0L),
+       value(),
        position(0)
 {
 }

############################################################################

Revision:    hrev53201
Commit:      f1e80d365b23a31801dd69c4b84d3a9965a6f9d0
URL:         https://git.haiku-os.org/haiku/commit/?id=f1e80d365b23
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Tue Jun 18 00:44:56 2019 UTC

libroot: Flesh out glibc floating point support for ARM.

The last time someone touched this directory, there was no floating
point support configured in ARM. Now we are targeting ARMv7a+, which
always has a hard FPU, so we need this now.

With this, a haiku.hpkg can (finally) be built again (at least
under lld, anyway!)

----------------------------------------------------------------------------

diff --git a/src/system/libroot/posix/glibc/arch/arm/Jamfile 
b/src/system/libroot/posix/glibc/arch/arm/Jamfile
index 56ef3e16cc..fc6e101675 100644
--- a/src/system/libroot/posix/glibc/arch/arm/Jamfile
+++ b/src/system/libroot/posix/glibc/arch/arm/Jamfile
@@ -3,15 +3,16 @@ SubDir HAIKU_TOP src system libroot posix glibc arch arm ;
 SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc include arch 
$(TARGET_ARCH) ;
 SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc include arch generic 
;
 SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc include ;
-SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc libio ;
 SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc stdlib ;
 SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc math ;
+SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc libio ;
 SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc ;
 
 SubDirHdrs $(HAIKU_TOP) src system libroot posix glibc arch generic ;
 
 UsePrivateHeaders libroot ;
 
+
 if $(OPTIM) = -O0 {
        OPTIM = -O ;
 }
@@ -21,67 +22,116 @@ DEBUG = 0 ;
 
 SubDirCcFlags -D_GNU_SOURCE -D_IEEE_LIBM ;
 
+# Note: There is no *l() support yet. Our compiler says sizeof(long double) = 
8,
+# while there are only 96 and 128 bit implementation in glibc.
 local genericSources =
        lshift.c rshift.c submul_1.c
-       s_finite.c s_finitef.c
        add_n.c sub_n.c
        addmul_1.c mul_1.c
-       
-       cmp.c dbl2mpn.c divrem.c 
-       mpn2dbl.c mpn2flt.c mpn2ldbl.c
-       mul.c mul_n.c
-       s_isinf.c s_isinff.c
-       s_isnan.c s_isnanf.c
-       s_signbit.c s_signbitf.c
 
-       s_nan.c s_nanf.c
-       e_hypot.c e_hypotf.c
-       w_hypot.c w_hypotf.c
-       s_fpclassify.c s_fpclassifyf.c
-       s_clog.c s_clogf.c
-       s_log1p.c s_log1pf.c
-       s_csqrt.c s_csqrtf.c
-       s_floor.c s_floorf.c
-       s_ceil.c s_ceilf.c
-       s_modf.c
-       w_powf.c e_powf.c
-       w_pow.c e_pow.c slowpow.c
-       w_exp.c e_exp.c slowexp.c
-       s_frexp.c s_expm1.c
-       dosincos.c
-       doasin.c
-       sincos32.c
        branred.c
+       cmp.c dbl2mpn.c divrem.c
+       doasin.c dosincos.c
        halfulp.c
-       mpa.c mplog.c mpexp.c
-       s_sin.c
-       s_atan.c s_atanf.c
-       s_tan.c
-       e_asin.c e_asinl.c
-       w_asin.c
-       e_log10.c w_log10.c
-       e_logf.c e_logl.c
-       e_acos.c w_acos.c
-       e_atan2.c
-       w_atan2.c mpatan2.c mpatan.c mptan.c mpsqrt.c w_sqrt.c w_sqrtf.c
-       e_sqrtl.c
-       e_fmod.c w_fmod.c
-       e_log.c w_log.c
-       e_cosh.c w_cosh.c
-       e_sinh.c w_sinh.c
-       s_cosf.c k_cosf.c
-       s_sinf.c k_sinf.c
-       s_ldexp.c s_ldexpf.c
-       s_scalbnf.c s_scalbn.c
-       s_copysign.c s_copysignf.c
-       s_tanh.c s_tanf.c k_tanf.c
-       s_lround.c s_lroundf.c s_round.c s_roundf.c
-       s_rint.c s_rintf.c s_lrintf.c
-       e_fmodf.c w_fmodf.c
-       e_atan2f.c w_atan2f.c
-       e_rem_pio2f.c k_rem_pio2f.c
-
        memrchr.c
+       mpa.c mpatan.c mpatan2.c mpexp.c mplog.c mpn2dbl.c
+       mpn2flt.c mpn2ldbl.c mpsqrt.c mptan.c
+       mul.c mul_n.c
+       sincos32.c
+       slowexp.c
+       slowpow.c
+
+       e_acos.c e_acosf.c # e_acosl.c
+       e_acosh.c e_acoshf.c # e_acoshl.c
+       e_asin.c e_asinf.c # e_asinl.c
+       e_atan2.c e_atan2f.c # e_atan2l.c
+       e_atanh.c e_atanhf.c # e_atanhl.c
+       e_cosh.c e_coshf.c # e_coshl.c
+       e_exp.c e_expf.c
+       e_fmod.c e_fmodf.c # e_fmodl.c
+       e_gamma_r.c e_gammaf_r.c
+       e_hypot.c e_hypotf.c # e_hypotl.c
+       e_j0.c e_j0f.c
+       e_j1.c e_j1f.c
+       e_jn.c e_jnf.c
+       e_lgamma_r.c e_lgammaf_r.c
+       e_log.c e_logf.c
+       e_log10.c e_log10f.c
+       e_pow.c e_powf.c # e_powl.c
+       e_rem_pio2f.c
+       e_remainder.c e_remainderf.c # e_remainderl.c
+       e_scalb.c e_scalbf.c # e_scalbl.c
+       e_sinh.c e_sinhf.c # e_sinhl.c
+       k_cos.c k_cosf.c
+       k_sin.c k_sinf.c
+       k_rem_pio2.c k_rem_pio2f.c # k_rem_pio2l.c
+       k_tan.c k_tanf.c
+       s_asinh.c s_asinhf.c # s_asinhl.c
+       s_atan.c s_atanf.c # s_atanl.c
+       s_cbrt.c s_cbrtf.c # s_cbrtl.c
+       s_ceil.c s_ceilf.c # s_ceill.c
+       s_cos.c s_cosf.c
+       s_copysign.c s_copysignf.c
+       s_erf.c s_erff.c # s_erfl.c
+       s_expm1f.c s_expm1.c
+       s_finite.c s_finitef.c # s_finitel.c
+       s_clog.c s_clogf.c # s_clogl.c
+       s_csqrt.c s_csqrtf.c # s_csqrtl.c
+       s_floor.c s_floorf.c # s_floorl.c
+       s_fabs.c s_fabsf.c
+       s_fdim.c s_fdimf.c
+       s_fma.c s_fmaf.c # s_fmal.c
+       s_fmax.c s_fmaxf.c
+       s_fmin.c s_fminf.c
+       s_fpclassify.c s_fpclassifyf.c # s_fpclassifyl.c
+       s_frexp.c s_frexpf.c # s_frexpl.c
+       s_ilogb.c s_ilogbf.c
+       s_isinf.c s_isinff.c # s_isinfl.c
+       s_isnan.c s_isnanf.c
+       s_ldexp.c s_ldexpf.c # s_ldexpl.c
+       s_llrint.c s_llrintf.c # s_llrintl.c
+       s_log1p.c s_log1pf.c
+       s_logb.c s_logbf.c # s_logbl.c
+       s_lrint.c s_lrintf.c # s_lrintl.c
+       s_lround.c s_lroundf.c
+       s_modf.c s_modff.c # s_modfl.c
+       s_nan.c s_nanf.c # s_nanl.c
+       # s_nexttoward.c s_nexttowardf.c s_nexttowardl.c
+       s_round.c s_roundf.c # s_roundl.c
+       s_rint.c s_rintf.c
+       s_scalbn.c s_scalbnf.c # s_scalbnl.c
+       s_signbit.c s_signbitf.c # s_signbitl.c
+       s_significand.c s_significandf.c
+       s_signgam.c
+       s_sin.c s_sinf.c # s_sinl.c
+       s_sincos.c s_sincosf.c
+       s_tan.c s_tanf.c
+       s_tanh.c s_tanhf.c
+       s_trunc.c s_truncf.c
+       t_exp.c
+       w_acos.c w_acosf.c # w_acosl.c
+       w_acosh.c w_acoshf.c # w_acoshl.c
+       w_atan2.c w_atan2f.c # w_atan2l.c
+       w_asin.c w_asinf.c # w_asinl.c
+       w_atanh.c w_atanhf.c # w_atanhl.c
+       w_cosh.c w_coshf.c # w_coshl.c
+       w_drem.c w_dremf.c # w_dreml.c
+       w_exp.c w_expf.c # w_expl.c
+       w_fmod.c w_fmodf.c # w_fmodl.c
+       w_hypot.c w_hypotf.c # w_hypotl.c
+       w_j0.c w_j0f.c
+       w_j1.c w_j1f.c
+       w_jn.c w_jnf.c
+       w_lgamma.c w_lgammaf.c
+       w_lgamma_r.c w_lgammaf_r.c
+       w_log.c w_logf.c # w_logl.c
+       w_log10.c w_log10f.c # w_log10l.c
+       w_pow.c w_powf.c # w_powl.c
+       w_remainder.c w_remainderf.c # w_remainderl.c
+       w_scalb.c w_scalbf.c # w_scalbl.c
+       w_sinh.c w_sinhf.c # w_sinhl.c
+       w_sqrt.c w_sqrtf.c
+       w_tgamma.c w_tgammaf.c # w_tgammal.c
        ;
 
 local architectureObject ;
@@ -93,15 +143,16 @@ for architectureObject in [ MultiArchSubDirSetup arm ] {
                        $(genericSources)
                        ;
 
-               MergeObject 
<$(architecture)>posix_gnu_arch_$(TARGET_ARCH)_others.o :
-                       e_sqrt.c
-                       e_sqrtf.c
+               MergeObject 
<$(architecture)>posix_gnu_arch_$(TARGET_ARCH)_other.o :
+                       e_sqrt.c e_sqrtf.c # e_sqrtl.c
+
+                       feholdexcpt.c fesetenv.c fesetround.c fraiseexcpt.c
                        ;
 
                MergeObjectFromObjects 
<$(architecture)>posix_gnu_arch_$(TARGET_ARCH).o
                        : :
                        <$(architecture)>posix_gnu_arch_$(TARGET_ARCH)_generic.o
-                       <$(architecture)>posix_gnu_arch_$(TARGET_ARCH)_others.o
+                       <$(architecture)>posix_gnu_arch_$(TARGET_ARCH)_other.o
                        ;
 
                SEARCH on [ FGristFiles $(genericSources) ]
diff --git a/src/system/libroot/posix/glibc/arch/arm/feholdexcpt.c 
b/src/system/libroot/posix/glibc/arch/arm/feholdexcpt.c
new file mode 100644
index 0000000000..8c146af1c4
--- /dev/null
+++ b/src/system/libroot/posix/glibc/arch/arm/feholdexcpt.c
@@ -0,0 +1,35 @@
+/* Store current floating-point environment and clear exceptions.
+   Copyright (C) 1997-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv_private.h>
+#include <arm-features.h>
+
+
+int
+__feholdexcept (fenv_t *envp)
+{
+  /* Fail if a VFP unit isn't present.  */
+  if (!ARM_HAVE_VFP)
+    return 1;
+
+  libc_feholdexcept_vfp (envp);
+  return 0;
+}
+libm_hidden_def (__feholdexcept)
+weak_alias (__feholdexcept, feholdexcept)
+libm_hidden_weak (feholdexcept)
diff --git a/src/system/libroot/posix/glibc/arch/arm/fesetenv.c 
b/src/system/libroot/posix/glibc/arch/arm/fesetenv.c
new file mode 100644
index 0000000000..6c3475a479
--- /dev/null
+++ b/src/system/libroot/posix/glibc/arch/arm/fesetenv.c
@@ -0,0 +1,66 @@
+/* Install given floating-point environment.
+   Copyright (C) 2004-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <arm-features.h>
+
+
+int
+__fesetenv (const fenv_t *envp)
+{
+  fpu_control_t fpscr, new_fpscr, updated_fpscr;
+
+  /* Fail if a VFP unit isn't present.  */
+  if (!ARM_HAVE_VFP)
+    return 1;
+
+  _FPU_GETCW (fpscr);
+
+  if ((envp != FE_DFL_ENV) && (envp != FE_NOMASK_ENV))
+    {
+      /* The new FPSCR is valid, so don't merge the reserved flags.  */
+      new_fpscr = envp->__cw;
+
+      /* Write new FPSCR if different (ignoring NZCV flags).  */
+      if (((fpscr ^ new_fpscr) & ~_FPU_MASK_NZCV) != 0)
+       _FPU_SETCW (new_fpscr);
+
+      return 0;
+    }
+
+  /* Preserve the reserved FPSCR flags.  */
+  new_fpscr = fpscr & _FPU_RESERVED;
+  new_fpscr |= (envp == FE_DFL_ENV) ? _FPU_DEFAULT : _FPU_IEEE;
+
+  if (((new_fpscr ^ fpscr) & ~_FPU_MASK_NZCV) != 0)
+    {
+      _FPU_SETCW (new_fpscr);
+
+      /* Not all VFP architectures support trapping exceptions, so
+        test whether the relevant bits were set and fail if not.  */
+      _FPU_GETCW (updated_fpscr);
+
+      return new_fpscr & ~updated_fpscr;
+    }
+
+  return 0;
+}
+libm_hidden_def (__fesetenv)
+weak_alias (__fesetenv, fesetenv)
+libm_hidden_weak (fesetenv)
diff --git a/src/system/libroot/posix/glibc/arch/arm/fesetround.c 
b/src/system/libroot/posix/glibc/arch/arm/fesetround.c
new file mode 100644
index 0000000000..379dfdca9d
--- /dev/null
+++ b/src/system/libroot/posix/glibc/arch/arm/fesetround.c
@@ -0,0 +1,39 @@
+/* Set current rounding direction.
+   Copyright (C) 2004-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv_private.h>
+#include <arm-features.h>
+
+
+int
+__fesetround (int round)
+{
+  /* FE_TONEAREST is the only supported rounding mode
+     if a VFP unit isn't present.  */
+  if (!ARM_HAVE_VFP)
+    return (round == FE_TONEAREST) ? 0 : 1;
+
+  if (round & ~_FPU_MASK_RM)
+    return 1;
+
+  libc_fesetround_vfp (round);
+  return 0;
+}
+libm_hidden_def (__fesetround)
+weak_alias (__fesetround, fesetround)
+libm_hidden_weak (fesetround)
diff --git a/src/system/libroot/posix/glibc/arch/arm/fraiseexcpt.c 
b/src/system/libroot/posix/glibc/arch/arm/fraiseexcpt.c
new file mode 100644
index 0000000000..2558b21204
--- /dev/null
+++ b/src/system/libroot/posix/glibc/arch/arm/fraiseexcpt.c
@@ -0,0 +1,107 @@
+/* Raise given exceptions.
+   Copyright (C) 2004-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fpu_control.h>
+#include <fenv.h>
+#include <float.h>
+#include <arm-features.h>
+
+
+int
+__feraiseexcept (int excepts)
+{
+  /* Fail if a VFP unit isn't present unless nothing needs to be done.  */
+  if (!ARM_HAVE_VFP)
+    return (excepts != 0);
+  else
+    {
+      fpu_control_t fpscr;
+      const float fp_zero = 0.0, fp_one = 1.0, fp_max = FLT_MAX,
+                  fp_min = FLT_MIN, fp_1e32 = 1.0e32f, fp_two = 2.0,
+                 fp_three = 3.0;
+
+      /* Raise exceptions represented by EXPECTS.  But we must raise only
+        one signal at a time.  It is important that if the overflow/underflow
+        exception and the inexact exception are given at the same time,
+        the overflow/underflow exception follows the inexact exception.  After
+        each exception we read from the fpscr, to force the exception to be
+        raised immediately.  */
+
+      /* There are additional complications because this file may be compiled
+         without VFP support enabled, and we also can't assume that the
+        assembler has VFP instructions enabled. To get around this we use the
+        generic coprocessor mnemonics and avoid asking GCC to put float values
+        in VFP registers.  */
+
+      /* First: invalid exception.  */
+      if (FE_INVALID & excepts)
+       __asm__ __volatile__ (
+         "ldc p10, cr0, %1\n\t"                        /* flds s0, %1  */
+         "cdp p10, 8, cr0, cr0, cr0, 0\n\t"            /* fdivs s0, s0, s0  */
+         "mrc p10, 7, %0, cr1, cr0, 0" : "=r" (fpscr)  /* fmrx %0, fpscr  */
+                                       : "m" (fp_zero)
+                                       : "s0");
+
+      /* Next: division by zero.  */
+      if (FE_DIVBYZERO & excepts)
+       __asm__ __volatile__ (
+         "ldc p10, cr0, %1\n\t"                        /* flds s0, %1  */
+         "ldcl p10, cr0, %2\n\t"                       /* flds s1, %2  */
+         "cdp p10, 8, cr0, cr0, cr0, 1\n\t"            /* fdivs s0, s0, s1  */
+         "mrc p10, 7, %0, cr1, cr0, 0" : "=r" (fpscr)  /* fmrx %0, fpscr  */
+                                       : "m" (fp_one), "m" (fp_zero)
+                                       : "s0", "s1");
+
+      /* Next: overflow.  */
+      if (FE_OVERFLOW & excepts)
+       /* There's no way to raise overflow without also raising inexact.  */
+       __asm__ __volatile__ (
+         "ldc p10, cr0, %1\n\t"                        /* flds s0, %1  */
+         "ldcl p10, cr0, %2\n\t"                       /* flds s1, %2  */
+         "cdp p10, 3, cr0, cr0, cr0, 1\n\t"            /* fadds s0, s0, s1  */
+         "mrc p10, 7, %0, cr1, cr0, 0" : "=r" (fpscr)  /* fmrx %0, fpscr  */
+                                       : "m" (fp_max), "m" (fp_1e32)
+                                       : "s0", "s1");
+
+      /* Next: underflow.  */
+      if (FE_UNDERFLOW & excepts)
+       __asm__ __volatile__ (
+         "ldc p10, cr0, %1\n\t"                        /* flds s0, %1  */
+         "ldcl p10, cr0, %2\n\t"                       /* flds s1, %2  */
+         "cdp p10, 8, cr0, cr0, cr0, 1\n\t"            /* fdivs s0, s0, s1  */
+         "mrc p10, 7, %0, cr1, cr0, 0" : "=r" (fpscr)  /* fmrx %0, fpscr  */
+                                       : "m" (fp_min), "m" (fp_three)
+                                       : "s0", "s1");
+
+      /* Last: inexact.  */
+      if (FE_INEXACT & excepts)
+       __asm__ __volatile__ (
+         "ldc p10, cr0, %1\n\t"                        /* flds s0, %1  */
+         "ldcl p10, cr0, %2\n\t"                       /* flds s1, %2  */
+         "cdp p10, 8, cr0, cr0, cr0, 1\n\t"            /* fdivs s0, s0, s1  */
+         "mrc p10, 7, %0, cr1, cr0, 0" : "=r" (fpscr)  /* fmrx %0, fpscr  */
+                                       : "m" (fp_two), "m" (fp_three)
+                                       : "s0", "s1");
+
+      /* Success.  */
+      return 0;
+    }
+}
+libm_hidden_def (__feraiseexcept)
+weak_alias (__feraiseexcept, feraiseexcept)
+libm_hidden_weak (feraiseexcept)
diff --git a/src/system/libroot/posix/glibc/include/arch/arm/arm-features.h 
b/src/system/libroot/posix/glibc/include/arch/arm/arm-features.h
new file mode 100644
index 0000000000..69c4f9d604
--- /dev/null
+++ b/src/system/libroot/posix/glibc/include/arch/arm/arm-features.h
@@ -0,0 +1,59 @@
+/* Macros to test for CPU features on ARM.  Generic ARM version.
+   Copyright (C) 2012-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _ARM_ARM_FEATURES_H
+#define _ARM_ARM_FEATURES_H 1
+
+/* An OS-specific arm-features.h file should define ARM_HAVE_VFP to
+   an appropriate expression for testing at runtime whether the VFP
+   hardware is present.  We'll then redefine it to a constant if we
+   know at compile time that we can assume VFP.  */
+
+#ifndef __SOFTFP__
+/* The compiler is generating VFP instructions, so we're already
+   assuming the hardware exists.  */
+# undef ARM_HAVE_VFP
+# define ARM_HAVE_VFP  1
+#endif
+
+/* An OS-specific arm-features.h file may define ARM_ASSUME_NO_IWMMXT
+   to indicate at compile time that iWMMXt hardware is never present
+   at runtime (or that we never care about its state) and so need not
+   be checked for.  */
+
+/* A more-specific arm-features.h file may define ARM_ALWAYS_BX to indicate
+   that instructions using pc as a destination register must never be used,
+   so a "bx" (or "blx") instruction is always required.  */
+
+/* The log2 of the minimum alignment required for an address that
+   is the target of a computed branch (i.e. a "bx" instruction).
+   A more-specific arm-features.h file may define this to set a more
+   stringent requirement.
+
+   Using this only makes sense for code in ARM mode (where instructions
+   always have a fixed size of four bytes), or for Thumb-mode code that is
+   specifically aligning all the related branch targets to match (since
+   Thumb instructions might be either two or four bytes).  */
+#ifndef ARM_BX_ALIGN_LOG2
+# define ARM_BX_ALIGN_LOG2     2
+#endif
+
+/* An OS-specific arm-features.h file may define ARM_NO_INDEX_REGISTER to
+   indicate that the two-register addressing modes must never be used.  */
+
+#endif  /* arm-features.h */
diff --git a/src/system/libroot/posix/glibc/include/arch/arm/bits/fenv.h 
b/src/system/libroot/posix/glibc/include/arch/arm/bits/fenv.h
index 7bd242385f..d3bbbc0f06 100644
--- a/src/system/libroot/posix/glibc/include/arch/arm/bits/fenv.h
+++ b/src/system/libroot/posix/glibc/include/arch/arm/bits/fenv.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 2004-2018 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
@@ -12,9 +12,8 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #ifndef _FENV_H
 # error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
@@ -23,36 +22,69 @@
 /* Define bits representing exceptions in the FPU status word.  */
 enum
   {
-    FE_INVALID = 1,
-#define FE_INVALID FE_INVALID
-    FE_DIVBYZERO = 2,
-#define FE_DIVBYZERO FE_DIVBYZERO
-    FE_OVERFLOW = 4,
-#define FE_OVERFLOW FE_OVERFLOW
-    FE_UNDERFLOW = 8,
-#define FE_UNDERFLOW FE_UNDERFLOW
+    FE_INVALID =
+#define FE_INVALID     1
+      FE_INVALID,
+    FE_DIVBYZERO =
+#define FE_DIVBYZERO   2
+      FE_DIVBYZERO,
+    FE_OVERFLOW =
+#define FE_OVERFLOW    4
+      FE_OVERFLOW,
+    FE_UNDERFLOW =
+#define FE_UNDERFLOW   8
+      FE_UNDERFLOW,
+    FE_INEXACT =
+#define FE_INEXACT     16
+      FE_INEXACT,
   };
 
 /* Amount to shift by to convert an exception to a mask bit.  */
-#define FE_EXCEPT_SHIFT        16
+#define FE_EXCEPT_SHIFT        8
 
 /* All supported exceptions.  */
 #define FE_ALL_EXCEPT  \
-       (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW)
+       (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)
 
-/* The ARM FPU basically only supports round-to-nearest.  Other rounding
-   modes exist, but you have to encode them in the actual instruction.  */
+/* VFP supports all of the four defined rounding modes.  */
+enum
+  {
+    FE_TONEAREST =
 #define FE_TONEAREST   0
+      FE_TONEAREST,
+    FE_UPWARD =
+#define FE_UPWARD      0x400000
+      FE_UPWARD,
+    FE_DOWNWARD =
+#define FE_DOWNWARD    0x800000
+      FE_DOWNWARD,
+    FE_TOWARDZERO =
+#define FE_TOWARDZERO  0xc00000
+      FE_TOWARDZERO
+  };
 
 /* Type representing exception flags. */
-typedef unsigned long int fexcept_t;
+typedef unsigned int fexcept_t;
 
 /* Type representing floating-point environment.  */
 typedef struct
   {
-    unsigned long int __cw;
+    unsigned int __cw;
   }
 fenv_t;
 
 /* If the default argument is used we use this value.  */
-#define FE_DFL_ENV     ((fenv_t *) -1l)
+#define FE_DFL_ENV     ((const fenv_t *) -1l)
+
+#ifdef __USE_GNU
+/* Floating-point environment where none of the exceptions are masked.  */
+# define FE_NOMASK_ENV  ((const fenv_t *) -2)
+#endif
+
+#if 0 // __GLIBC_USE (IEC_60559_BFP_EXT)
+/* Type representing floating-point control modes.  */
+typedef unsigned int femode_t;
+
+/* Default floating-point control modes.  */
+# define FE_DFL_MODE   ((const femode_t *) -1L)
+#endif
diff --git a/src/system/libroot/posix/glibc/include/arch/arm/fenv_private.h 
b/src/system/libroot/posix/glibc/include/arch/arm/fenv_private.h
new file mode 100644
index 0000000000..a60d676b0c
--- /dev/null
+++ b/src/system/libroot/posix/glibc/include/arch/arm/fenv_private.h
@@ -0,0 +1,251 @@
+/* Private floating point rounding and exceptions handling.  ARM VFP version.
+   Copyright (C) 2014-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef FENV_PRIVATE_H
+#define FENV_PRIVATE_H 1
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+#  define __glibc_unlikely(x)   __builtin_expect ((x), 0)
+
+static __always_inline void
+libc_feholdexcept_vfp (fenv_t *envp)
+{
+  fpu_control_t fpscr;
+
+  _FPU_GETCW (fpscr);
+  envp->__cw = fpscr;
+
+  /* Clear exception flags and set all exceptions to non-stop.  */
+  fpscr &= ~_FPU_MASK_EXCEPT;
+  _FPU_SETCW (fpscr);
+}
+
+static __always_inline void
+libc_fesetround_vfp (int round)
+{
+  fpu_control_t fpscr;
+
+  _FPU_GETCW (fpscr);
+
+  /* Set new rounding mode if different.  */
+  if (__glibc_unlikely ((fpscr & _FPU_MASK_RM) != round))
+    _FPU_SETCW ((fpscr & ~_FPU_MASK_RM) | round);
+}
+
+static __always_inline void
+libc_feholdexcept_setround_vfp (fenv_t *envp, int round)
+{
+  fpu_control_t fpscr;
+
+  _FPU_GETCW (fpscr);
+  envp->__cw = fpscr;
+
+  /* Clear exception flags, set all exceptions to non-stop,
+     and set new rounding mode.  */
+  fpscr &= ~(_FPU_MASK_EXCEPT | _FPU_MASK_RM);
+  _FPU_SETCW (fpscr | round);
+}
+
+static __always_inline void
+libc_feholdsetround_vfp (fenv_t *envp, int round)
+{
+  fpu_control_t fpscr;
+
+  _FPU_GETCW (fpscr);
+  envp->__cw = fpscr;
+
+  /* Set new rounding mode if different.  */
+  if (__glibc_unlikely ((fpscr & _FPU_MASK_RM) != round))
+    _FPU_SETCW ((fpscr & ~_FPU_MASK_RM) | round);
+}
+
+static __always_inline void
+libc_feresetround_vfp (fenv_t *envp)
+{
+  fpu_control_t fpscr, round;
+
+  _FPU_GETCW (fpscr);
+
+  /* Check whether rounding modes are different.  */
+  round = (envp->__cw ^ fpscr) & _FPU_MASK_RM;
+
+  /* Restore the rounding mode if it was changed.  */
+  if (__glibc_unlikely (round != 0))
+    _FPU_SETCW (fpscr ^ round);
+}
+
+static __always_inline int
+libc_fetestexcept_vfp (int ex)
+{
+  fpu_control_t fpscr;
+
+  _FPU_GETCW (fpscr);
+  return fpscr & ex & FE_ALL_EXCEPT;
+}
+
+static __always_inline void
+libc_fesetenv_vfp (const fenv_t *envp)
+{
+  fpu_control_t fpscr, new_fpscr;
+
+  _FPU_GETCW (fpscr);
+  new_fpscr = envp->__cw;
+
+  /* Write new FPSCR if different (ignoring NZCV flags).  */
+  if (__glibc_unlikely (((fpscr ^ new_fpscr) & ~_FPU_MASK_NZCV) != 0))
+    _FPU_SETCW (new_fpscr);
+}
+
+static __always_inline int
+libc_feupdateenv_test_vfp (const fenv_t *envp, int ex)
+{
+  fpu_control_t fpscr, new_fpscr;
+  int excepts;
+
+  _FPU_GETCW (fpscr);
+
+  /* Merge current exception flags with the saved fenv.  */
+  excepts = fpscr & FE_ALL_EXCEPT;
+  new_fpscr = envp->__cw | excepts;
+
+  /* Write new FPSCR if different (ignoring NZCV flags).  */
+  if (__glibc_unlikely (((fpscr ^ new_fpscr) & ~_FPU_MASK_NZCV) != 0))
+    _FPU_SETCW (new_fpscr);
+
+  /* Raise the exceptions if enabled in the new FP state.  */
+  if (__glibc_unlikely (excepts & (new_fpscr >> FE_EXCEPT_SHIFT)))
+    __feraiseexcept (excepts);
+
+  return excepts & ex;
+}
+
+static __always_inline void
+libc_feupdateenv_vfp (const fenv_t *envp)
+{
+  libc_feupdateenv_test_vfp (envp, 0);
+}
+
+static __always_inline void
+libc_feholdsetround_vfp_ctx (struct rm_ctx *ctx, int r)
+{
+  fpu_control_t fpscr, round;
+
+  _FPU_GETCW (fpscr);
+  ctx->updated_status = false;
+  ctx->env.__cw = fpscr;
+
+  /* Check whether rounding modes are different.  */
+  round = (fpscr ^ r) & _FPU_MASK_RM;
+
+  /* Set the rounding mode if changed.  */
+  if (__glibc_unlikely (round != 0))
+    {
+      ctx->updated_status = true;
+      _FPU_SETCW (fpscr ^ round);
+    }
+}
+
+static __always_inline void
+libc_feresetround_vfp_ctx (struct rm_ctx *ctx)
+{
+  /* Restore the rounding mode if updated.  */
+  if (__glibc_unlikely (ctx->updated_status))
+    {
+      fpu_control_t fpscr;
+
+      _FPU_GETCW (fpscr);
+      fpscr = (fpscr & ~_FPU_MASK_RM) | (ctx->env.__cw & _FPU_MASK_RM);
+      _FPU_SETCW (fpscr);
+    }
+}
+
+static __always_inline void
+libc_fesetenv_vfp_ctx (struct rm_ctx *ctx)
+{
+  fpu_control_t fpscr, new_fpscr;
+
+  _FPU_GETCW (fpscr);
+  new_fpscr = ctx->env.__cw;
+
+  /* Write new FPSCR if different (ignoring NZCV flags).  */
+  if (__glibc_unlikely (((fpscr ^ new_fpscr) & ~_FPU_MASK_NZCV) != 0))
+    _FPU_SETCW (new_fpscr);
+}
+
+#ifndef __SOFTFP__
+
+# define libc_feholdexcept  libc_feholdexcept_vfp
+# define libc_feholdexceptf libc_feholdexcept_vfp
+# define libc_feholdexceptl libc_feholdexcept_vfp
+
+# define libc_fesetround  libc_fesetround_vfp
+# define libc_fesetroundf libc_fesetround_vfp
+# define libc_fesetroundl libc_fesetround_vfp
+
+# define libc_feresetround  libc_feresetround_vfp
+# define libc_feresetroundf libc_feresetround_vfp
+# define libc_feresetroundl libc_feresetround_vfp
+
+# define libc_feresetround_noex  libc_fesetenv_vfp
+# define libc_feresetround_noexf libc_fesetenv_vfp
+# define libc_feresetround_noexl libc_fesetenv_vfp
+
+# define libc_feholdexcept_setround  libc_feholdexcept_setround_vfp
+# define libc_feholdexcept_setroundf libc_feholdexcept_setround_vfp
+# define libc_feholdexcept_setroundl libc_feholdexcept_setround_vfp
+
+# define libc_feholdsetround  libc_feholdsetround_vfp
+# define libc_feholdsetroundf libc_feholdsetround_vfp
+# define libc_feholdsetroundl libc_feholdsetround_vfp
+
+# define libc_fetestexcept  libc_fetestexcept_vfp
+# define libc_fetestexceptf libc_fetestexcept_vfp
+# define libc_fetestexceptl libc_fetestexcept_vfp
+
+# define libc_fesetenv  libc_fesetenv_vfp
+# define libc_fesetenvf libc_fesetenv_vfp
+# define libc_fesetenvl libc_fesetenv_vfp
+
+# define libc_feupdateenv  libc_feupdateenv_vfp
+# define libc_feupdateenvf libc_feupdateenv_vfp
+# define libc_feupdateenvl libc_feupdateenv_vfp
+
+# define libc_feupdateenv_test  libc_feupdateenv_test_vfp
+# define libc_feupdateenv_testf libc_feupdateenv_test_vfp
+# define libc_feupdateenv_testl libc_feupdateenv_test_vfp
+
+/* We have support for rounding mode context.  */
+#define HAVE_RM_CTX 1
+
+# define libc_feholdsetround_ctx       libc_feholdsetround_vfp_ctx
+# define libc_feresetround_ctx         libc_feresetround_vfp_ctx
+# define libc_feresetround_noex_ctx    libc_fesetenv_vfp_ctx
+
+# define libc_feholdsetroundf_ctx      libc_feholdsetround_vfp_ctx
+# define libc_feresetroundf_ctx                libc_feresetround_vfp_ctx
+# define libc_feresetround_noexf_ctx   libc_fesetenv_vfp_ctx
+
+# define libc_feholdsetroundl_ctx      libc_feholdsetround_vfp_ctx
+# define libc_feresetroundl_ctx                libc_feresetround_vfp_ctx
+# define libc_feresetround_noexl_ctx   libc_fesetenv_vfp_ctx
+
+#endif
+
+#endif /* FENV_PRIVATE_H */
diff --git a/src/system/libroot/posix/glibc/include/arch/arm/fpu_control.h 
b/src/system/libroot/posix/glibc/include/arch/arm/fpu_control.h
new file mode 100644
index 0000000000..6b1b176eae
--- /dev/null
+++ b/src/system/libroot/posix/glibc/include/arch/arm/fpu_control.h
@@ -0,0 +1,75 @@
+/* FPU control word definitions.  ARM VFP version.
+   Copyright (C) 2004-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+#if !(defined(_LIBC) && !defined(_LIBC_TEST)) && defined(__SOFTFP__)
+
+#define _FPU_RESERVED 0xffffffff
+#define _FPU_DEFAULT  0x00000000
+typedef unsigned int fpu_control_t;
+#define _FPU_GETCW(cw) (cw) = 0
+#define _FPU_SETCW(cw) (void) (cw)
+extern fpu_control_t __fpu_control;
+
+#else
+
+/* masking of interrupts */
+#define _FPU_MASK_IM   0x00000100      /* invalid operation */
+#define _FPU_MASK_ZM   0x00000200      /* divide by zero */
+#define _FPU_MASK_OM   0x00000400      /* overflow */
+#define _FPU_MASK_UM   0x00000800      /* underflow */
+#define _FPU_MASK_PM   0x00001000      /* inexact */
+
+#define _FPU_MASK_NZCV 0xf0000000      /* NZCV flags */
+#define _FPU_MASK_RM   0x00c00000      /* rounding mode */
+#define _FPU_MASK_EXCEPT 0x00001f1f    /* all exception flags */
+
+/* Some bits in the FPSCR are not yet defined.  They must be preserved when
+   modifying the contents.  */
+#define _FPU_RESERVED  0x00086060
+#define _FPU_DEFAULT    0x00000000
+
+/* Default + exceptions enabled.  */
+#define _FPU_IEEE      (_FPU_DEFAULT | 0x00001f00)
+
+/* Type of the control word.  */
+typedef unsigned int fpu_control_t;
+
+/* Macros for accessing the hardware control word.  */
+#ifdef __SOFTFP__
+/* This is fmrx %0, fpscr.  */
+# define _FPU_GETCW(cw) \
+  __asm__ __volatile__ ("mrc p10, 7, %0, cr1, cr0, 0" : "=r" (cw))
+/* This is fmxr fpscr, %0.  */
+# define _FPU_SETCW(cw) \
+  __asm__ __volatile__ ("mcr p10, 7, %0, cr1, cr0, 0" : : "r" (cw))
+#else
+# define _FPU_GETCW(cw) \
+  __asm__ __volatile__ ("vmrs %0, fpscr" : "=r" (cw))
+# define _FPU_SETCW(cw) \
+  __asm__ __volatile__ ("vmsr fpscr, %0" : : "r" (cw))
+#endif
+
+/* Default control word set at startup.  */
+extern fpu_control_t __fpu_control;
+
+#endif /* __SOFTFP__ */
+
+#endif /* _FPU_CONTROL_H */



Other related posts: