Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 May 2014 14:22:37 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r266314 - in stable/10/lib: libc/arm libc/arm/aeabi msun/arm
Message-ID:  <201405171422.s4HEMbNR044944@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sat May 17 14:22:37 2014
New Revision: 266314
URL: http://svnweb.freebsd.org/changeset/base/266314

Log:
  MFC 262989, 263210, 263230, 263231, 263239, 263242, 263243,
  
    Export _libc_arm_fpu_present as a private symbol to be used by other
    system libraries, for example libm.
  
    On armv6 access both the softfloat and, when available, the vfp to get and
    set the floating-point environment.
  
    Build fenv-vfp.c with the softfp float abi. Without this gcc generates an
    incorrect assembly file that doesn't allow for vfp instructions.
  
    Only build the vfp/softfp switching code on armv6 as we don't support vfp
    on anything earlier than this. This should fix the armeb and arm builds
    when using gcc.
  
    Add an optimised version of the float and double helper functions.

Added:
  stable/10/lib/libc/arm/aeabi/aeabi_vfp.h
     - copied, changed from r263239, head/lib/libc/arm/aeabi/aeabi_vfp.h
  stable/10/lib/libc/arm/aeabi/aeabi_vfp_double.S
     - copied unchanged from r263239, head/lib/libc/arm/aeabi/aeabi_vfp_double.S
  stable/10/lib/libc/arm/aeabi/aeabi_vfp_float.S
     - copied unchanged from r263239, head/lib/libc/arm/aeabi/aeabi_vfp_float.S
  stable/10/lib/msun/arm/fenv-mangle.h
     - copied unchanged from r263210, head/lib/msun/arm/fenv-mangle.h
  stable/10/lib/msun/arm/fenv-softfp.c
     - copied unchanged from r263210, head/lib/msun/arm/fenv-softfp.c
  stable/10/lib/msun/arm/fenv-vfp.c
     - copied unchanged from r263210, head/lib/msun/arm/fenv-vfp.c
Modified:
  stable/10/lib/libc/arm/Symbol.map
  stable/10/lib/libc/arm/aeabi/Makefile.inc
  stable/10/lib/libc/arm/aeabi/aeabi_double.c
  stable/10/lib/libc/arm/aeabi/aeabi_float.c
  stable/10/lib/msun/arm/Makefile.inc
  stable/10/lib/msun/arm/Symbol.map
  stable/10/lib/msun/arm/fenv.c
  stable/10/lib/msun/arm/fenv.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/arm/Symbol.map
==============================================================================
--- stable/10/lib/libc/arm/Symbol.map	Sat May 17 14:03:46 2014	(r266313)
+++ stable/10/lib/libc/arm/Symbol.map	Sat May 17 14:22:37 2014	(r266314)
@@ -76,4 +76,6 @@ FBSDprivate_1.0 {
 	__fixunsdfsi;
 	__extendsfdf2;
 	__truncdfsf2;
+
+	_libc_arm_fpu_present;
 };

Modified: stable/10/lib/libc/arm/aeabi/Makefile.inc
==============================================================================
--- stable/10/lib/libc/arm/aeabi/Makefile.inc	Sat May 17 14:03:46 2014	(r266313)
+++ stable/10/lib/libc/arm/aeabi/Makefile.inc	Sat May 17 14:22:37 2014	(r266314)
@@ -6,6 +6,10 @@ SRCS+=	aeabi_atexit.c		\
 	aeabi_double.c		\
 	aeabi_float.c		\
 	aeabi_unwind_cpp.c
+.if ${MACHINE_ARCH:Marmv6*}
+SRCS+=	aeabi_vfp_double.S	\
+	aeabi_vfp_float.S
+.endif
 
 # Add the aeabi_mem* functions. While they live in compiler-rt they call into
 # libc. This causes issues when other parts of libc call these functions.

Modified: stable/10/lib/libc/arm/aeabi/aeabi_double.c
==============================================================================
--- stable/10/lib/libc/arm/aeabi/aeabi_double.c	Sat May 17 14:03:46 2014	(r266313)
+++ stable/10/lib/libc/arm/aeabi/aeabi_double.c	Sat May 17 14:22:37 2014	(r266314)
@@ -32,70 +32,45 @@ __FBSDID("$FreeBSD$");
 #include "milieu.h"
 #include "softfloat.h"
 
+#include "aeabi_vfp.h"
+
+extern int _libc_arm_fpu_present;
+
 flag __unorddf2(float64, float64);
 
-int __aeabi_dcmpeq(float64 a, float64 b)
-{
-	return float64_eq(a, b);
-}
-
-int __aeabi_dcmplt(float64 a, float64 b)
-{
-	return float64_lt(a, b);
-}
-
-int __aeabi_dcmple(float64 a, float64 b)
-{
-	return float64_le(a, b);
-}
-
-int __aeabi_dcmpge(float64 a, float64 b)
-{
-	return float64_le(b, a);
-}
-
-int __aeabi_dcmpgt(float64 a, float64 b)
-{
-	return float64_lt(b, a);
-}
-
-int __aeabi_dcmpun(float64 a, float64 b)
-{
-	return __unorddf2(a, b);
-}
-
-int __aeabi_d2iz(float64 a)
-{
-	return float64_to_int32_round_to_zero(a);
-}
-
-float32 __aeabi_d2f(float64 a)
-{
-	return float64_to_float32(a);
-}
-
-float64 __aeabi_i2d(int a)
-{
-	return int32_to_float64(a);
-}
-
-float64 __aeabi_dadd(float64 a, float64 b)
-{
-	return float64_add(a, b);
-}
-
-float64 __aeabi_ddiv(float64 a, float64 b)
-{
-	return float64_div(a, b);
-}
-
-float64 __aeabi_dmul(float64 a, float64 b)
-{
-	return float64_mul(a, b);
-}
-
-float64 __aeabi_dsub(float64 a, float64 b)
-{
-	return float64_sub(a, b);
-}
+/* These are written in asm and are only called from this file */
+int __aeabi_dcmpeq_vfp(float64, float64);
+int __aeabi_dcmplt_vfp(float64, float64);
+int __aeabi_dcmple_vfp(float64, float64);
+int __aeabi_dcmpgt_vfp(float64, float64);
+int __aeabi_dcmpge_vfp(float64, float64);
+int __aeabi_dcmpun_vfp(float64, float64);
+int __aeabi_d2iz_vfp(float64);
+float32 __aeabi_d2f_vfp(float64);
+float64 __aeabi_i2d_vfp(int);
+float64 __aeabi_dadd_vfp(float64, float64);
+float64 __aeabi_ddiv_vfp(float64, float64);
+float64 __aeabi_dmul_vfp(float64, float64);
+float64 __aeabi_dsub_vfp(float64, float64);
+
+/*
+ * Depending on the target these will:
+ *  On armv6 with a vfp call the above function, or
+ *  Call the softfloat function in the 3rd argument.
+ */
+int AEABI_FUNC2(dcmpeq, float64, float64_eq)
+int AEABI_FUNC2(dcmplt, float64, float64_lt)
+int AEABI_FUNC2(dcmple, float64, float64_le)
+int AEABI_FUNC2_REV(dcmpge, float64, float64_le)
+int AEABI_FUNC2_REV(dcmpgt, float64, float64_lt)
+int AEABI_FUNC2(dcmpun, float64, __unorddf2)
+
+int AEABI_FUNC(d2iz, float64, float64_to_int32_round_to_zero)
+float32 AEABI_FUNC(d2f, float64, float64_to_float32)
+float64 AEABI_FUNC(i2d, int, int32_to_float64)
+
+float64 AEABI_FUNC2(dadd, float64, float64_add)
+float64 AEABI_FUNC2(ddiv, float64, float64_div)
+float64 AEABI_FUNC2(dmul, float64, float64_mul)
+float64 AEABI_FUNC2(dsub, float64, float64_sub)
 

Modified: stable/10/lib/libc/arm/aeabi/aeabi_float.c
==============================================================================
--- stable/10/lib/libc/arm/aeabi/aeabi_float.c	Sat May 17 14:03:46 2014	(r266313)
+++ stable/10/lib/libc/arm/aeabi/aeabi_float.c	Sat May 17 14:22:37 2014	(r266314)
@@ -32,70 +32,45 @@ __FBSDID("$FreeBSD$");
 #include "milieu.h"
 #include "softfloat.h"
 
+#include "aeabi_vfp.h"
+
+extern int _libc_arm_fpu_present;
+
 flag __unordsf2(float32, float32);
 
-int __aeabi_fcmpeq(float32 a, float32 b)
-{
-	return float32_eq(a, b);
-}
-
-int __aeabi_fcmplt(float32 a, float32 b)
-{
-	return float32_lt(a, b);
-}
-
-int __aeabi_fcmple(float32 a, float32 b)
-{
-	return float32_le(a, b);
-}
-
-int __aeabi_fcmpge(float32 a, float32 b)
-{
-	return float32_le(b, a);
-}
-
-int __aeabi_fcmpgt(float32 a, float32 b)
-{
-	return float32_lt(b, a);
-}
-
-int __aeabi_fcmpun(float32 a, float32 b)
-{
-	return __unordsf2(a, b);
-}
-
-int __aeabi_f2iz(float32 a)
-{
-	return float32_to_int32_round_to_zero(a);
-}
-
-float32 __aeabi_f2d(float32 a)
-{
-	return float32_to_float64(a);
-}
-
-float32 __aeabi_i2f(int a)
-{
-	return int32_to_float32(a);
-}
-
-float32 __aeabi_fadd(float32 a, float32 b)
-{
-	return float32_add(a, b);
-}
-
-float32 __aeabi_fdiv(float32 a, float32 b)
-{
-	return float32_div(a, b);
-}
-
-float32 __aeabi_fmul(float32 a, float32 b)
-{
-	return float32_mul(a, b);
-}
-
-float32 __aeabi_fsub(float32 a, float32 b)
-{
-	return float32_sub(a, b);
-}
+/* These are written in asm and are only called from this file */
+int __aeabi_fcmpeq_vfp(float32, float32);
+int __aeabi_fcmplt_vfp(float32, float32);
+int __aeabi_fcmple_vfp(float32, float32);
+int __aeabi_fcmpgt_vfp(float32, float32);
+int __aeabi_fcmpge_vfp(float32, float32);
+int __aeabi_fcmpun_vfp(float32, float32);
+int __aeabi_f2iz_vfp(float32);
+float64 __aeabi_f2d_vfp(float32);
+float32 __aeabi_i2f_vfp(int);
+float32 __aeabi_fadd_vfp(float32, float32);
+float32 __aeabi_fdiv_vfp(float32, float32);
+float32 __aeabi_fmul_vfp(float32, float32);
+float32 __aeabi_fsub_vfp(float32, float32);
+
+/*
+ * Depending on the target these will:
+ *  On armv6 with a vfp call the above function, or
+ *  Call the softfloat function in the 3rd argument.
+ */
+int AEABI_FUNC2(fcmpeq, float32, float32_eq)
+int AEABI_FUNC2(fcmplt, float32, float32_lt)
+int AEABI_FUNC2(fcmple, float32, float32_le)
+int AEABI_FUNC2_REV(fcmpge, float32, float32_le)
+int AEABI_FUNC2_REV(fcmpgt, float32, float32_lt)
+int AEABI_FUNC2(fcmpun, float32, __unordsf2)
+
+int AEABI_FUNC(f2iz, float32, float32_to_int32_round_to_zero)
+float64 AEABI_FUNC(f2d, float32, float32_to_float64)
+float32 AEABI_FUNC(i2f, int, int32_to_float32)
+
+float32 AEABI_FUNC2(fadd, float32, float32_add)
+float32 AEABI_FUNC2(fdiv, float32, float32_div)
+float32 AEABI_FUNC2(fmul, float32, float32_mul)
+float32 AEABI_FUNC2(fsub, float32, float32_sub)
 

Copied and modified: stable/10/lib/libc/arm/aeabi/aeabi_vfp.h (from r263239, head/lib/libc/arm/aeabi/aeabi_vfp.h)
==============================================================================
--- head/lib/libc/arm/aeabi/aeabi_vfp.h	Sun Mar 16 13:16:30 2014	(r263239, copy source)
+++ stable/10/lib/libc/arm/aeabi/aeabi_vfp.h	Sat May 17 14:22:37 2014	(r266314)
@@ -65,7 +65,7 @@
  * C Helper macros
  */
 
-#if 1 && defined(__FreeBSD_ARCH_armv6__) || (defined(__ARM_ARCH) && __ARM_ARCH >= 6)
+#if defined(__FreeBSD_ARCH_armv6__) || (defined(__ARM_ARCH) && __ARM_ARCH >= 6)
 /*
  * Generate a function that will either call into the VFP implementation,
  * or the soft float version for a given __aeabi_* helper. The function

Copied: stable/10/lib/libc/arm/aeabi/aeabi_vfp_double.S (from r263239, head/lib/libc/arm/aeabi/aeabi_vfp_double.S)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/libc/arm/aeabi/aeabi_vfp_double.S	Sat May 17 14:22:37 2014	(r266314, copy of r263239, head/lib/libc/arm/aeabi/aeabi_vfp_double.S)
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2013 Andrew Turner
+ * 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.
+ *
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include "aeabi_vfp.h"
+
+.fpu	vfp
+.syntax	unified
+
+/* int __aeabi_dcmpeq(double, double) */
+AEABI_ENTRY(dcmpeq)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vcmp.f64 d0, d1
+	vmrs     APSR_nzcv, fpscr
+	movne    r0, #0
+	moveq    r0, #1
+	RET
+AEABI_END(dcmpeq)
+
+/* int __aeabi_dcmplt(double, double) */
+AEABI_ENTRY(dcmplt)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vcmp.f64 d0, d1
+	vmrs     APSR_nzcv, fpscr
+	movcs    r0, #0
+	movlt    r0, #1
+	RET
+AEABI_END(dcmplt)
+
+/* int __aeabi_dcmple(double, double) */
+AEABI_ENTRY(dcmple)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vcmp.f64 d0, d1
+	vmrs     APSR_nzcv, fpscr
+	movhi    r0, #0
+	movls    r0, #1
+	RET
+AEABI_END(dcmple)
+
+/* int __aeabi_dcmpge(double, double) */
+AEABI_ENTRY(dcmpge)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vcmp.f64 d0, d1
+	vmrs     APSR_nzcv, fpscr
+	movlt    r0, #0
+	movge    r0, #1
+	RET
+AEABI_END(dcmpge)
+
+/* int __aeabi_dcmpgt(double, double) */
+AEABI_ENTRY(dcmpgt)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vcmp.f64 d0, d1
+	vmrs     APSR_nzcv, fpscr
+	movle    r0, #0
+	movgt    r0, #1
+	RET
+AEABI_END(dcmpgt)
+
+/* int __aeabi_dcmpun(double, double) */
+AEABI_ENTRY(dcmpun)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vcmp.f64 d0, d1
+	vmrs     APSR_nzcv, fpscr
+	movvc    r0, #0
+	movvs    r0, #1
+	RET
+AEABI_END(dcmpun)
+
+/* int __aeabi_d2iz(double) */
+AEABI_ENTRY(d2iz)
+	LOAD_DREG(d0, r0, r1)
+#if 0
+	/*
+	 * This should be the correct instruction, but binutils incorrectly
+	 * encodes it as the version that used FPSCR to determine the rounding.
+	 * When binutils is fixed we can use this again.
+	 */
+	vcvt.s32.f64 s0, d0
+#else
+	ftosizd s0, d0
+#endif
+	vmov         r0, s0
+	RET
+AEABI_END(d2iz)
+
+/* float __aeabi_d2f(double) */
+AEABI_ENTRY(d2f)
+	LOAD_DREG(d0, r0, r1)
+	vcvt.f32.f64 s0, d0
+	UNLOAD_SREG(r0, s0)
+	RET
+AEABI_END(d2f)
+
+/* double __aeabi_i2d(int) */
+AEABI_ENTRY(i2d)
+	vmov         s0, r0
+	vcvt.f64.s32 d0, s0
+	UNLOAD_DREG(r0, r1, d0)
+	RET
+AEABI_END(i2d)
+
+/* double __aeabi_dadd(double, double) */
+AEABI_ENTRY(dadd)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vadd.f64 d0, d0, d1
+	UNLOAD_DREG(r0, r1, d0)
+	RET
+AEABI_END(dadd)
+
+/* double __aeabi_ddiv(double, double) */
+AEABI_ENTRY(ddiv)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vdiv.f64 d0, d0, d1
+	UNLOAD_DREG(r0, r1, d0)
+	RET
+AEABI_END(ddiv)
+
+/* double __aeabi_dmul(double, double) */
+AEABI_ENTRY(dmul)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vmul.f64 d0, d0, d1
+	UNLOAD_DREG(r0, r1, d0)
+	RET
+AEABI_END(dmul)
+
+/* double __aeabi_dsub(double, double) */
+AEABI_ENTRY(dsub)
+	LOAD_DREG(d0, r0, r1)
+	LOAD_DREG(d1, r2, r3)
+	vsub.f64 d0, d0, d1
+	UNLOAD_DREG(r0, r1, d0)
+	RET
+AEABI_END(dsub)
+

Copied: stable/10/lib/libc/arm/aeabi/aeabi_vfp_float.S (from r263239, head/lib/libc/arm/aeabi/aeabi_vfp_float.S)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/libc/arm/aeabi/aeabi_vfp_float.S	Sat May 17 14:22:37 2014	(r266314, copy of r263239, head/lib/libc/arm/aeabi/aeabi_vfp_float.S)
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2013 Andrew Turner
+ * 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.
+ *
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include "aeabi_vfp.h"
+
+.fpu	vfp
+.syntax	unified
+
+/* int __aeabi_fcmpeq(float, float) */
+AEABI_ENTRY(fcmpeq)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vcmp.f32 s0, s1
+	vmrs     APSR_nzcv, fpscr
+	movne    r0, #0
+	moveq    r0, #1
+	RET
+AEABI_END(fcmpeq)
+
+/* int __aeabi_fcmplt(float, float) */
+AEABI_ENTRY(fcmplt)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vcmp.f32 s0, s1
+	vmrs     APSR_nzcv, fpscr
+	movcs    r0, #0
+	movlt    r0, #1
+	RET
+AEABI_END(fcmplt)
+
+/* int __aeabi_fcmple(float, float) */
+AEABI_ENTRY(fcmple)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vcmp.f32 s0, s1
+	vmrs     APSR_nzcv, fpscr
+	movhi    r0, #0
+	movls    r0, #1
+	RET
+AEABI_END(fcmple)
+
+/* int __aeabi_fcmpge(float, float) */
+AEABI_ENTRY(fcmpge)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vcmp.f32 s0, s1
+	vmrs     APSR_nzcv, fpscr
+	movlt    r0, #0
+	movge    r0, #1
+	RET
+AEABI_END(fcmpge)
+
+/* int __aeabi_fcmpgt(float, float) */
+AEABI_ENTRY(fcmpgt)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vcmp.f32 s0, s1
+	vmrs     APSR_nzcv, fpscr
+	movle    r0, #0
+	movgt    r0, #1
+	RET
+AEABI_END(fcmpgt)
+
+/* int __aeabi_fcmpun(float, float) */
+AEABI_ENTRY(fcmpun)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vcmp.f32 s0, s1
+	vmrs     APSR_nzcv, fpscr
+	movvc    r0, #0
+	movvs    r0, #1
+	RET
+AEABI_END(fcmpun)
+
+/* int __aeabi_f2iz(float) */
+AEABI_ENTRY(f2iz)
+	LOAD_SREG(s0, r0)
+#if 0
+	/*
+	 * This should be the correct instruction, but binutils incorrectly
+	 * encodes it as the version that used FPSCR to determine the rounding.
+	 * When binutils is fixed we can use this again.
+	 */
+	vcvt.s32.f32 s0, s0
+#else
+	ftosizs      s0, s0
+#endif
+	vmov         r0, s0
+	RET
+AEABI_END(f2iz)
+
+/* double __aeabi_f2d(float) */
+AEABI_ENTRY(f2d)
+	LOAD_SREG(s0, r0)
+	vcvt.f64.f32 d0, s0
+	UNLOAD_DREG(r0, r1, d0)
+	RET
+AEABI_END(f2d)
+
+/* float __aeabi_i2f(int) */
+AEABI_ENTRY(i2f)
+	vmov         s0, r0
+	vcvt.f32.s32 s0, s0
+	UNLOAD_SREG(r0, s0)
+	RET
+AEABI_END(i2f)
+
+/* float __aeabi_fadd(float, float) */
+AEABI_ENTRY(fadd)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vadd.f32 s0, s0, s1
+	UNLOAD_SREG(r0, s0)
+	RET
+AEABI_END(fadd)
+
+/* float __aeabi_fmul(float, float) */
+AEABI_ENTRY(fdiv)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vdiv.f32 s0, s0, s1
+	UNLOAD_SREG(r0, s0)
+	RET
+AEABI_END(fdiv)
+
+/* float __aeabi_fmul(float, float) */
+AEABI_ENTRY(fmul)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vmul.f32 s0, s0, s1
+	UNLOAD_SREG(r0, s0)
+	RET
+AEABI_END(fmul)
+
+/* float __aeabi_fsub(float, float) */
+AEABI_ENTRY(fsub)
+	LOAD_SREGS(s0, s1, r0, r1)
+	vsub.f32 s0, s0, s1
+	UNLOAD_SREG(r0, s0)
+	RET
+AEABI_END(fsub)
+

Modified: stable/10/lib/msun/arm/Makefile.inc
==============================================================================
--- stable/10/lib/msun/arm/Makefile.inc	Sat May 17 14:03:46 2014	(r266313)
+++ stable/10/lib/msun/arm/Makefile.inc	Sat May 17 14:22:37 2014	(r266314)
@@ -2,3 +2,11 @@
 
 LDBL_PREC = 53
 SYM_MAPS += ${.CURDIR}/arm/Symbol.map
+
+.if ${TARGET_ARCH} == "armv6"
+ARCH_SRCS = fenv-softfp.c fenv-vfp.c
+.endif
+
+CFLAGS.fenv-vfp.c=	-mfloat-abi=softfp
+CFLAGS+=		${CFLAGS.${.IMPSRC:T}}
+

Modified: stable/10/lib/msun/arm/Symbol.map
==============================================================================
--- stable/10/lib/msun/arm/Symbol.map	Sat May 17 14:03:46 2014	(r266313)
+++ stable/10/lib/msun/arm/Symbol.map	Sat May 17 14:22:37 2014	(r266314)
@@ -15,4 +15,7 @@ FBSD_1.3 {
 	fegetenv;
 	feholdexcept;
 	feupdateenv;
+	feenableexcept;
+	fedisableexcept;
+	fegetexcept;
 };

Copied: stable/10/lib/msun/arm/fenv-mangle.h (from r263210, head/lib/msun/arm/fenv-mangle.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/msun/arm/fenv-mangle.h	Sat May 17 14:22:37 2014	(r266314, copy of r263210, head/lib/msun/arm/fenv-mangle.h)
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
+ * 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$
+ */
+
+#ifdef _FENV_MANGLE_H_
+#error Only include fenv-mangle.h once
+#endif
+
+#define	_FENV_MANGLE_H_
+
+#ifndef FENV_MANGLE
+#error FENV_MANGLE is undefined
+#endif
+
+#define	feclearexcept	FENV_MANGLE(feclearexcept)
+#define	fegetexceptflag	FENV_MANGLE(fegetexceptflag)
+#define	fesetexceptflag	FENV_MANGLE(fesetexceptflag)
+#define	feraiseexcept	FENV_MANGLE(feraiseexcept)
+#define	fetestexcept	FENV_MANGLE(fetestexcept)
+#define	fegetround	FENV_MANGLE(fegetround)
+#define	fesetround	FENV_MANGLE(fesetround)
+#define	fegetenv	FENV_MANGLE(fegetenv)
+#define	feholdexcept	FENV_MANGLE(feholdexcept)
+#define	fesetenv	FENV_MANGLE(fesetenv)
+#define	feupdateenv	FENV_MANGLE(feupdateenv)
+#define	feenableexcept	FENV_MANGLE(feenableexcept)
+#define	fedisableexcept	FENV_MANGLE(fedisableexcept)
+#define	fegetexcept	FENV_MANGLE(fegetexcept)
+

Copied: stable/10/lib/msun/arm/fenv-softfp.c (from r263210, head/lib/msun/arm/fenv-softfp.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/msun/arm/fenv-softfp.c	Sat May 17 14:22:37 2014	(r266314, copy of r263210, head/lib/msun/arm/fenv-softfp.c)
@@ -0,0 +1,32 @@
+/*-
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
+ * 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$
+ */
+
+#define	FENV_MANGLE(x)	__softfp_ ##x
+#include "fenv-mangle.h"
+#include "fenv.c"
+

Copied: stable/10/lib/msun/arm/fenv-vfp.c (from r263210, head/lib/msun/arm/fenv-vfp.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/msun/arm/fenv-vfp.c	Sat May 17 14:22:37 2014	(r266314, copy of r263210, head/lib/msun/arm/fenv-vfp.c)
@@ -0,0 +1,33 @@
+/*-
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
+ * 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$
+ */
+
+#define	FENV_MANGLE(x)	__vfp_ ##x
+#include "fenv-mangle.h"
+#define	__ARM_PCS_VFP
+#include "fenv.c"
+

Modified: stable/10/lib/msun/arm/fenv.c
==============================================================================
--- stable/10/lib/msun/arm/fenv.c	Sat May 17 14:03:46 2014	(r266313)
+++ stable/10/lib/msun/arm/fenv.c	Sat May 17 14:22:37 2014	(r266314)
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,11 +30,34 @@
 #define	__fenv_static
 #include "fenv.h"
 
+#if defined(__FreeBSD_ARCH_armv6__) || (defined(__ARM_ARCH) && __ARM_ARCH >= 6)
+#define FENV_ARMv6
+#endif
+
+/* When SOFTFP_ABI is defined we are using the softfp ABI. */
+#if defined(__VFP_FP__) && !defined(__ARM_PCS_VFP)
+#define SOFTFP_ABI
+#endif
+
+
+#ifndef FENV_MANGLE
+/*
+ * 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
+
+
+/* If this is a non-mangled softfp version special processing is required */
+#if defined(FENV_MANGLE) || !defined(SOFTFP_ABI) || !defined(FENV_ARMv6)
+
 /*
  * The following macros map between the softfloat emulator's flags and
  * the hardware's FPSR.  The hardware this file was written for doesn't
  * have rounding control bits, so we stick those in the system ID byte.
  */
+#ifndef __ARM_PCS_VFP
 #define	__set_env(env, flags, mask, rnd) env = ((flags)			\
 						| (mask)<<_FPUSW_SHIFT	\
 						| (rnd) << 24)
@@ -42,17 +66,12 @@
 						& FE_ALL_EXCEPT)
 #define	__env_round(env)		(((env) >> 24) & _ROUND_MASK)
 #include "fenv-softfloat.h"
+#endif
 
 #ifdef __GNUC_GNU_INLINE__
 #error "This file must be compiled with C99 'inline' semantics"
 #endif
 
-/*
- * 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;
-
 extern inline int feclearexcept(int __excepts);
 extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts);
 extern inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts);
@@ -64,3 +83,233 @@ extern inline int fegetenv(fenv_t *__env
 extern inline int feholdexcept(fenv_t *__envp);
 extern inline int fesetenv(const fenv_t *__envp);
 extern inline int feupdateenv(const fenv_t *__envp);
+extern inline int feenableexcept(int __mask);
+extern inline int fedisableexcept(int __mask);
+extern inline int fegetexcept(void);
+
+#else /* !FENV_MANGLE && SOFTFP_ABI */
+/* Set by libc when the VFP unit is enabled */
+extern int _libc_arm_fpu_present;
+
+int __softfp_feclearexcept(int __excepts);
+int __softfp_fegetexceptflag(fexcept_t *__flagp, int __excepts);
+int __softfp_fesetexceptflag(const fexcept_t *__flagp, int __excepts);
+int __softfp_feraiseexcept(int __excepts);
+int __softfp_fetestexcept(int __excepts);
+int __softfp_fegetround(void);
+int __softfp_fesetround(int __round);
+int __softfp_fegetenv(fenv_t *__envp);
+int __softfp_feholdexcept(fenv_t *__envp);
+int __softfp_fesetenv(const fenv_t *__envp);
+int __softfp_feupdateenv(const fenv_t *__envp);
+int __softfp_feenableexcept(int __mask);
+int __softfp_fedisableexcept(int __mask);
+int __softfp_fegetexcept(void);
+
+int __vfp_feclearexcept(int __excepts);
+int __vfp_fegetexceptflag(fexcept_t *__flagp, int __excepts);
+int __vfp_fesetexceptflag(const fexcept_t *__flagp, int __excepts);
+int __vfp_feraiseexcept(int __excepts);
+int __vfp_fetestexcept(int __excepts);
+int __vfp_fegetround(void);
+int __vfp_fesetround(int __round);
+int __vfp_fegetenv(fenv_t *__envp);
+int __vfp_feholdexcept(fenv_t *__envp);
+int __vfp_fesetenv(const fenv_t *__envp);
+int __vfp_feupdateenv(const fenv_t *__envp);
+int __vfp_feenableexcept(int __mask);
+int __vfp_fedisableexcept(int __mask);
+int __vfp_fegetexcept(void);
+
+static int
+__softfp_round_to_vfp(int round)
+{
+
+	switch (round) {
+	case FE_TONEAREST:
+	default:
+		return VFP_FE_TONEAREST;
+	case FE_TOWARDZERO:
+		return VFP_FE_TOWARDZERO;
+	case FE_UPWARD:
+		return VFP_FE_UPWARD;
+	case FE_DOWNWARD:
+		return VFP_FE_DOWNWARD;
+	}
+}
+
+static int
+__softfp_round_from_vfp(int round)
+{
+
+	switch (round) {
+	case VFP_FE_TONEAREST:
+	default:
+		return FE_TONEAREST;
+	case VFP_FE_TOWARDZERO:
+		return FE_TOWARDZERO;
+	case VFP_FE_UPWARD:
+		return FE_UPWARD;
+	case VFP_FE_DOWNWARD:
+		return FE_DOWNWARD;
+	}
+}
+
+int feclearexcept(int __excepts)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_feclearexcept(__excepts);
+	__softfp_feclearexcept(__excepts);
+
+	return (0);
+}
+
+int fegetexceptflag(fexcept_t *__flagp, int __excepts)
+{
+	fexcept_t __vfp_flagp;
+
+	__vfp_flagp = 0;
+	if (_libc_arm_fpu_present)
+		__vfp_fegetexceptflag(&__vfp_flagp, __excepts);
+	__softfp_fegetexceptflag(__flagp, __excepts);
+
+	*__flagp |= __vfp_flagp;
+
+	return (0);
+}
+
+int fesetexceptflag(const fexcept_t *__flagp, int __excepts)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_fesetexceptflag(__flagp, __excepts);
+	__softfp_fesetexceptflag(__flagp, __excepts);
+
+	return (0);
+}
+
+int feraiseexcept(int __excepts)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_feraiseexcept(__excepts);
+	__softfp_feraiseexcept(__excepts);
+
+	return (0);
+}
+
+int fetestexcept(int __excepts)
+{
+	int __got_excepts;
+
+	__got_excepts = 0;
+	if (_libc_arm_fpu_present)
+		__got_excepts = __vfp_fetestexcept(__excepts);
+	__got_excepts |= __softfp_fetestexcept(__excepts);
+
+	return (__got_excepts);
+}
+
+int fegetround(void)
+{
+
+	if (_libc_arm_fpu_present)
+		return __softfp_round_from_vfp(__vfp_fegetround());
+	return __softfp_fegetround();
+}
+
+int fesetround(int __round)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_fesetround(__softfp_round_to_vfp(__round));
+	__softfp_fesetround(__round);
+
+	return (0);
+}
+
+int fegetenv(fenv_t *__envp)
+{
+	fenv_t __vfp_envp;
+
+	__vfp_envp = 0;
+	if (_libc_arm_fpu_present)
+		__vfp_fegetenv(&__vfp_envp);
+	__softfp_fegetenv(__envp);
+	*__envp |= __vfp_envp;
+
+	return (0);
+}
+
+int feholdexcept(fenv_t *__envp)
+{
+	fenv_t __vfp_envp;
+
+	__vfp_envp = 0;
+	if (_libc_arm_fpu_present)
+		__vfp_feholdexcept(&__vfp_envp);
+	__softfp_feholdexcept(__envp);
+	*__envp |= __vfp_envp;
+
+	return (0);
+}
+
+int fesetenv(const fenv_t *__envp)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_fesetenv(__envp);
+	__softfp_fesetenv(__envp);
+
+	return (0);
+}
+
+int feupdateenv(const fenv_t *__envp)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_feupdateenv(__envp);
+	__softfp_feupdateenv(__envp);
+

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405171422.s4HEMbNR044944>