svn commit: r307761 - in head: . contrib/binutils/bfd contrib/gcc/config/rs6000 gnu/lib/libgcc gnu/lib/libgomp gnu/usr.bin/binutils gnu/usr.bin/cc gnu/usr.bin/cc/cc_tools gnu/usr.bin/cc/include gnu...

Justin Hibbits jhibbits at FreeBSD.org
Sat Oct 22 01:57:20 UTC 2016


Author: jhibbits
Date: Sat Oct 22 01:57:15 2016
New Revision: 307761
URL: https://svnweb.freebsd.org/changeset/base/307761

Log:
  Create a new MACHINE_ARCH for Freescale PowerPC e500v2
  
  Summary:
  The Freescale e500v2 PowerPC core does not use a standard FPU.
  Instead, it uses a Signal Processing Engine (SPE)--a DSP-style vector processor
  unit, which doubles as a FPU.  The PowerPC SPE ABI is incompatible with the
  stock powerpc ABI, so a new MACHINE_ARCH was created to deal with this.
  Additionaly, the SPE opcodes overlap with Altivec, so these are mutually
  exclusive.  Taking advantage of this fact, a new file, powerpc/booke/spe.c, was
  created with the same function set as in powerpc/powerpc/altivec.c, so it
  becomes effectively a drop-in replacement.  setjmp/longjmp were modified to save
  the upper 32-bits of the now-64-bit GPRs (upper 32-bits are only accessible by
  the SPE).
  
  Note: This does _not_ support the SPE in the e500v1, as the e500v1 SPE does not
  support double-precision floating point.
  
  Also, without a new MACHINE_ARCH it would be impossible to provide binary
  packages which utilize the SPE.
  
  Additionally, no work has been done to support ports, work is needed for this.
  This also means no newer gcc can yet be used.  However, gcc's powerpc support
  has been refactored which would make adding a powerpcspe-freebsd target very
  easy.
  
  Test Plan:
  This was lightly tested on a RouterBoard RB800 and an AmigaOne A1222
  (P1022-based) board, compiled against the new ABI.  Base system utilities
  (/bin/sh, /bin/ls, etc) still function appropriately, the system is able to boot
  multiuser.
  
  Reviewed By:	bdrewery, imp
  Relnotes:	yes
  Differential Revision:	https://reviews.freebsd.org/D5683

Added:
  head/contrib/gcc/config/rs6000/freebsdspe.h   (contents, props changed)
  head/lib/libc/powerpcspe/
  head/lib/libc/powerpcspe/Makefile.inc   (contents, props changed)
  head/lib/libc/powerpcspe/SYS.h   (contents, props changed)
  head/lib/libc/powerpcspe/Symbol.map   (contents, props changed)
  head/lib/libc/powerpcspe/_fpmath.h   (contents, props changed)
  head/lib/libc/powerpcspe/arith.h   (contents, props changed)
  head/lib/libc/powerpcspe/gd_qnan.h   (contents, props changed)
  head/lib/libc/powerpcspe/gen/
  head/lib/libc/powerpcspe/gen/Makefile.inc   (contents, props changed)
  head/lib/libc/powerpcspe/gen/_ctx_start.S   (contents, props changed)
  head/lib/libc/powerpcspe/gen/_set_tp.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/_setjmp.S   (contents, props changed)
  head/lib/libc/powerpcspe/gen/eabi.S   (contents, props changed)
  head/lib/libc/powerpcspe/gen/fabs.S   (contents, props changed)
  head/lib/libc/powerpcspe/gen/flt_rounds.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/fpgetmask.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/fpgetround.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/fpgetsticky.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/fpsetmask.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/fpsetround.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/infinity.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/makecontext.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/setjmp.S   (contents, props changed)
  head/lib/libc/powerpcspe/gen/signalcontext.c   (contents, props changed)
  head/lib/libc/powerpcspe/gen/sigsetjmp.S   (contents, props changed)
  head/lib/libc/powerpcspe/gen/syncicache.c   (contents, props changed)
  head/lib/libc/powerpcspe/softfloat/
  head/lib/libc/powerpcspe/softfloat/milieu.h   (contents, props changed)
  head/lib/libc/powerpcspe/softfloat/powerpc-gcc.h   (contents, props changed)
  head/lib/libc/powerpcspe/softfloat/softfloat.h   (contents, props changed)
  head/lib/libc/powerpcspe/sys/
  head/lib/libc/powerpcspe/sys/Makefile.inc   (contents, props changed)
  head/lib/libc/powerpcspe/sys/brk.S   (contents, props changed)
  head/lib/libc/powerpcspe/sys/cerror.S   (contents, props changed)
  head/lib/libc/powerpcspe/sys/exect.S   (contents, props changed)
  head/lib/libc/powerpcspe/sys/ptrace.S   (contents, props changed)
  head/lib/libc/powerpcspe/sys/sbrk.S   (contents, props changed)
  head/lib/libc/powerpcspe/sys/setlogin.S   (contents, props changed)
  head/sys/conf/ldscript.powerpcspe   (contents, props changed)
  head/sys/powerpc/booke/spe.c   (contents, props changed)
  head/sys/powerpc/conf/MPC85XXSPE   (contents, props changed)
Modified:
  head/Makefile
  head/Makefile.inc1
  head/contrib/binutils/bfd/config.bfd
  head/gnu/lib/libgcc/Makefile
  head/gnu/lib/libgomp/Makefile
  head/gnu/usr.bin/binutils/Makefile.inc0
  head/gnu/usr.bin/cc/Makefile.tgt
  head/gnu/usr.bin/cc/cc_tools/Makefile.hdrs
  head/gnu/usr.bin/cc/include/Makefile
  head/gnu/usr.bin/gdb/Makefile.inc
  head/gnu/usr.bin/gdb/libgdb/Makefile
  head/lib/libarchive/Makefile
  head/lib/msun/powerpc/fenv.h
  head/share/mk/bsd.cpu.mk
  head/share/mk/bsd.endian.mk
  head/share/mk/local.meta.sys.mk
  head/share/mk/sys.mk
  head/sys/boot/powerpc/Makefile
  head/sys/conf/Makefile.powerpc
  head/sys/conf/files.powerpc
  head/sys/conf/kern.mk
  head/sys/conf/options.powerpc
  head/sys/modules/Makefile
  head/sys/powerpc/booke/booke_machdep.c
  head/sys/powerpc/include/param.h
  head/sys/powerpc/include/spr.h
  head/sys/powerpc/include/trap.h
  head/sys/powerpc/powerpc/trap.c
  head/usr.sbin/Makefile.powerpc

Modified: head/Makefile
==============================================================================
--- head/Makefile	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/Makefile	Sat Oct 22 01:57:15 2016	(r307761)
@@ -239,7 +239,7 @@ _MAKE+=	MK_META_MODE=no
 _TARGET_ARCH=	${TARGET:S/pc98/i386/:S/arm64/aarch64/}
 .elif !defined(TARGET) && defined(TARGET_ARCH) && \
     ${TARGET_ARCH} != ${MACHINE_ARCH}
-_TARGET=		${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/aarch64/arm64/:C/powerpc64/powerpc/:C/riscv64/riscv/}
+_TARGET=		${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/aarch64/arm64/:C/powerpc64/powerpc/:C/powerpcspe/powerpc/:C/riscv64/riscv/}
 .endif
 .if defined(TARGET) && !defined(_TARGET)
 _TARGET=${TARGET}
@@ -422,7 +422,7 @@ _UNIVERSE_TARGETS=	${TARGETS}
 TARGET_ARCHES_arm?=	arm armeb armv6
 TARGET_ARCHES_arm64?=	aarch64
 TARGET_ARCHES_mips?=	mipsel mips mips64el mips64 mipsn32
-TARGET_ARCHES_powerpc?=	powerpc powerpc64
+TARGET_ARCHES_powerpc?=	powerpc powerpc64 powerpcspe
 TARGET_ARCHES_pc98?=	i386
 .for target in ${TARGETS}
 TARGET_ARCHES_${target}?= ${target}

Modified: head/Makefile.inc1
==============================================================================
--- head/Makefile.inc1	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/Makefile.inc1	Sat Oct 22 01:57:15 2016	(r307761)
@@ -358,6 +358,7 @@ KNOWN_ARCHES?=	aarch64/arm64 \
 		mipsn32/mips \
 		powerpc \
 		powerpc64/powerpc \
+		powerpcspe/powerpc \
 		riscv64/riscv \
 		sparc64
 

Modified: head/contrib/binutils/bfd/config.bfd
==============================================================================
--- head/contrib/binutils/bfd/config.bfd	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/contrib/binutils/bfd/config.bfd	Sat Oct 22 01:57:15 2016	(r307761)
@@ -1103,7 +1103,7 @@ case "${targ}" in
     want64=true
     ;;
 #endif
-  powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \
+  powerpc-*-*bsd* | powerpcspe-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \
   powerpc-*-solaris2* | powerpc-*-linux-* | powerpc-*-rtems* | \
   powerpc-*-chorus*)
     targ_defvec=bfd_elf32_powerpc_vec

Added: head/contrib/gcc/config/rs6000/freebsdspe.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/contrib/gcc/config/rs6000/freebsdspe.h	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,77 @@
+/* Definitions of target machine for GNU compiler,
+   for PowerPC e500 machines running FreeBSD.
+   Based on linuxspe.h
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+   Contributed by Aldy Hernandez (aldy at quesejoda.com).
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 2, or (at your
+   option) any later version.
+
+   GCC 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 General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING.  If not, write to the
+   Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#undef  TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (PowerPC E500 FreeBSD)");
+
+/* Override rs6000.h and sysv4.h definition.  */
+#undef	TARGET_DEFAULT
+#define	TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_STRICT_ALIGN)
+
+#undef TARGET_SPE_ABI
+#undef TARGET_SPE
+#undef TARGET_E500
+#undef TARGET_ISEL
+#undef TARGET_FPRS
+#undef TARGET_E500_SINGLE
+#undef TARGET_E500_DOUBLE
+
+#define TARGET_SPE_ABI rs6000_spe_abi
+#define TARGET_SPE rs6000_spe
+#define TARGET_E500 (rs6000_cpu == PROCESSOR_PPC8540)
+#define TARGET_ISEL rs6000_isel
+#define TARGET_FPRS (rs6000_float_gprs == 0)
+#define TARGET_E500_SINGLE (TARGET_HARD_FLOAT && rs6000_float_gprs == 1)
+#define TARGET_E500_DOUBLE (TARGET_HARD_FLOAT && rs6000_float_gprs == 2)
+
+#undef  SUBSUBTARGET_OVERRIDE_OPTIONS
+#define SUBSUBTARGET_OVERRIDE_OPTIONS \
+  if (rs6000_select[1].string == NULL) \
+    rs6000_cpu = PROCESSOR_PPC8540; \
+  if (!rs6000_explicit_options.abi) \
+    rs6000_spe_abi = 1; \
+  if (!rs6000_explicit_options.float_gprs) \
+    rs6000_float_gprs = 1; \
+  /* See note below.  */ \
+  /*if (!rs6000_explicit_options.long_double)*/ \
+  /*  rs6000_long_double_type_size = 128;*/ \
+  if (!rs6000_explicit_options.spe) \
+    rs6000_spe = 1; \
+  if (!rs6000_explicit_options.isel) \
+    rs6000_isel = 1; \
+  if (target_flags & MASK_64BIT) \
+    error ("-m64 not supported in this configuration")
+
+/* The e500 ABI says that either long doubles are 128 bits, or if
+   implemented in any other size, the compiler/linker should error out.
+   We have no emulation libraries for 128 bit long doubles, and I hate
+   the dozens of failures on the regression suite.  So I'm breaking ABI
+   specifications, until I properly fix the emulation.
+
+   Enable these later.
+#undef CPP_LONGDOUBLE_DEFAULT_SPEC
+#define CPP_LONGDOUBLE_DEFAULT_SPEC "-D__LONG_DOUBLE_128__=1"
+*/
+
+#undef  ASM_DEFAULT_SPEC
+#define	ASM_DEFAULT_SPEC "-mppc -mspe -me500"

Modified: head/gnu/lib/libgcc/Makefile
==============================================================================
--- head/gnu/lib/libgcc/Makefile	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/lib/libgcc/Makefile	Sat Oct 22 01:57:15 2016	(r307761)
@@ -173,7 +173,7 @@ LIB2FUNCS_EXTRA+= fixdfdi.c fixunssfsi.c
 .endif
 .endif
 
-.if ${TARGET_ARCH} == "powerpc"
+.if ${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpcspe"
 #	from config/rs6000/t-ppccomm
 LIB2FUNCS_EXTRA = tramp.asm
 LIB2FUNCS_STATIC_EXTRA = eabi.asm

Modified: head/gnu/lib/libgomp/Makefile
==============================================================================
--- head/gnu/lib/libgomp/Makefile	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/lib/libgomp/Makefile	Sat Oct 22 01:57:15 2016	(r307761)
@@ -24,7 +24,7 @@ VERSION_MAP=	${SRCDIR}/libgomp.map
 
 # Target-specific OpenMP configuration
 .if ${MACHINE_CPUARCH} == arm || ${MACHINE_CPUARCH} == i386 || \
-    ${MACHINE_ARCH} == powerpc || \
+    ${MACHINE_ARCH} == powerpc || ${MACHINE_ARCH} == powerpcspe || \
     (${MACHINE_CPUARCH} == mips &&  ${MACHINE_ARCH:Mmips64*} == "")
 OMP_LOCK_ALIGN	=	4
 OMP_LOCK_KIND=		4

Modified: head/gnu/usr.bin/binutils/Makefile.inc0
==============================================================================
--- head/gnu/usr.bin/binutils/Makefile.inc0	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/usr.bin/binutils/Makefile.inc0	Sat Oct 22 01:57:15 2016	(r307761)
@@ -7,7 +7,7 @@
 VERSION=	"2.17.50 [FreeBSD] 2007-07-03"
 
 .if defined(TARGET_ARCH)
-TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64|spe)/powerpc/}
 .else
 TARGET_CPUARCH=${MACHINE_CPUARCH}
 .endif
@@ -30,7 +30,7 @@ RELSRC=	${RELTOP}/../../../contrib/binut
 SRCDIR=	${.CURDIR}/${RELSRC}
 
 .if ${TARGET_CPUARCH} == "arm" || ${TARGET_CPUARCH} == "i386" || \
-	${TARGET_ARCH} == "powerpc" || \
+	${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpcspe" || \
 	(${TARGET_CPUARCH} == "mips" && ${TARGET_ARCH:Mmips64*} == "")
 CFLAGS+= -DBFD_DEFAULT_TARGET_SIZE=32
 .else

Modified: head/gnu/usr.bin/cc/Makefile.tgt
==============================================================================
--- head/gnu/usr.bin/cc/Makefile.tgt	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/usr.bin/cc/Makefile.tgt	Sat Oct 22 01:57:15 2016	(r307761)
@@ -4,7 +4,7 @@
 # MACHINE_CPUARCH, but there's no easy way to export make functions...
 
 .if defined(TARGET_ARCH)
-TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64spe)/powerpc/}
 .else
 TARGET_CPUARCH=${MACHINE_CPUARCH}
 .endif

Modified: head/gnu/usr.bin/cc/cc_tools/Makefile.hdrs
==============================================================================
--- head/gnu/usr.bin/cc/cc_tools/Makefile.hdrs	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/usr.bin/cc/cc_tools/Makefile.hdrs	Sat Oct 22 01:57:15 2016	(r307761)
@@ -46,6 +46,10 @@ TARGET_INC+=	${GCC_CPU}/bpabi.h
 TARGET_INC+=	${GCC_CPU}/biarch64.h
 TARGET_INC+=    ${GCC_CPU}/default64.h
 .endif
+.if ${TARGET_ARCH} == "powerpcspe" 	 
+TARGET_INC+=    ${GCC_CPU}/freebsdspe.h 	 
+TARGET_INC+=    ${GCC_CPU}/e500-double.h 	 
+.endif
 TARGET_INC+=	${GCC_CPU}/freebsd.h
 .if ${TARGET_CPUARCH} == "amd64"
 TARGET_INC+=	${GCC_CPU}/freebsd64.h

Modified: head/gnu/usr.bin/cc/include/Makefile
==============================================================================
--- head/gnu/usr.bin/cc/include/Makefile	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/usr.bin/cc/include/Makefile	Sat Oct 22 01:57:15 2016	(r307761)
@@ -14,7 +14,8 @@ INCS=	ammintrin.h emmintrin.h mmintrin.h
 INCS+=	wmmintrin.h __wmmintrin_aes.h __wmmintrin_pclmul.h
 .elif ${TARGET_ARCH} == "arm"
 INCS=	mmintrin.h
-.elif ${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpc64"
+.elif ${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpc64" || \
+    ${TARGET_ARCH} == "powerpcspe"
 INCS=	ppc-asm.h altivec.h spe.h
 .endif
 

Modified: head/gnu/usr.bin/gdb/Makefile.inc
==============================================================================
--- head/gnu/usr.bin/gdb/Makefile.inc	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/usr.bin/gdb/Makefile.inc	Sat Oct 22 01:57:15 2016	(r307761)
@@ -23,7 +23,7 @@ OBJ_RL= ${OBJ_ROOT}/../lib/libreadline/r
 # MACHINE_CPUARCH, but there's no easy way to export make functions...
 
 .if defined(TARGET_ARCH)
-TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64|spe)/powerpc/}
 .else
 TARGET_CPUARCH=${MACHINE_CPUARCH}
 .endif

Modified: head/gnu/usr.bin/gdb/libgdb/Makefile
==============================================================================
--- head/gnu/usr.bin/gdb/libgdb/Makefile	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/gnu/usr.bin/gdb/libgdb/Makefile	Sat Oct 22 01:57:15 2016	(r307761)
@@ -4,7 +4,7 @@
 # MACHINE_CPUARCH, but there's no easy way to export make functions...
 
 .if defined(TARGET_ARCH)
-TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64|spe)/powerpc/}
 .else
 TARGET_CPUARCH=${MACHINE_CPUARCH}
 .endif

Modified: head/lib/libarchive/Makefile
==============================================================================
--- head/lib/libarchive/Makefile	Sat Oct 22 01:38:21 2016	(r307760)
+++ head/lib/libarchive/Makefile	Sat Oct 22 01:57:15 2016	(r307761)
@@ -30,7 +30,7 @@ SHARED_CFLAGS+=	-DHAVE_ICONV=1 -DHAVE_IC
 .endif
 
 .if ${MACHINE_ARCH:Marm*} != "" || ${MACHINE_ARCH:Mmips*} != "" || \
-	${MACHINE_ARCH:Msparc64*} != ""
+	${MACHINE_ARCH:Msparc64*} != "" || ${MACHINE_ARCH:Mpowerpc*} != ""
 NO_WCAST_ALIGN=	yes
 .if ${MACHINE_ARCH:M*64*} == ""
 CFLAGS+=	-DPPMD_32BIT

Added: head/lib/libc/powerpcspe/Makefile.inc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/Makefile.inc	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+SRCS+=	trivial-vdso_tc.c
+
+# Long double is 64-bits
+MDSRCS+=machdep_ldisd.c
+SYM_MAPS+=${LIBC_SRCTOP}/powerpcspe/Symbol.map

Added: head/lib/libc/powerpcspe/SYS.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/SYS.h	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,70 @@
+/*-
+ * Copyright (c) 2002 Benno Rice.  All rights reserved.
+ * Copyright (c) 2002 David E. O'Brien.  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.
+ * 3. Neither the name of the author nor the names of any contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * 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 REGENTS 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.
+ *
+ *	$NetBSD: SYS.h,v 1.8 2002/01/14 00:55:56 thorpej Exp $
+ * $FreeBSD$
+ */
+
+#include <sys/syscall.h>
+#include <machine/asm.h>
+
+#define	_SYSCALL(name)						\
+	.text;							\
+	.align 2;						\
+	li	0,(SYS_##name);					\
+	sc
+
+#define	SYSCALL(name)						\
+	.text;							\
+	.align 2;						\
+2:	b	PIC_PLT(CNAME(HIDENAME(cerror)));		\
+ENTRY(__sys_##name);						\
+	WEAK_REFERENCE(__sys_##name, name);			\
+	WEAK_REFERENCE(__sys_##name, _##name);			\
+	_SYSCALL(name);						\
+	bso	2b
+
+#define	PSEUDO(name)						\
+	.text;							\
+	.align 2;						\
+ENTRY(__sys_##name);						\
+	WEAK_REFERENCE(__sys_##name, _##name);			\
+	_SYSCALL(name);						\
+	bnslr;							\
+	b	PIC_PLT(CNAME(HIDENAME(cerror)))
+
+#define	RSYSCALL(name)						\
+	.text;							\
+	.align 2;						\
+2:	b	PIC_PLT(CNAME(HIDENAME(cerror)));		\
+ENTRY(__sys_##name);						\
+	WEAK_REFERENCE(__sys_##name, name);			\
+	WEAK_REFERENCE(__sys_##name, _##name);			\
+	_SYSCALL(name);						\
+	bnslr;							\
+	b	PIC_PLT(CNAME(HIDENAME(cerror)))

Added: head/lib/libc/powerpcspe/Symbol.map
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/Symbol.map	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,59 @@
+/*
+ * $FreeBSD$
+ */
+
+/*
+ * This only needs to contain symbols that are not listed in
+ * symbol maps from other parts of libc (i.e., not found in
+ * stdlib/Symbol.map, string/Symbol.map, sys/Symbol.map, ...).
+ */
+FBSD_1.0 {
+	/* PSEUDO syscalls */
+	_exit;
+
+	_mcount;
+	_setjmp;
+	_longjmp;
+	fabs;
+	__flt_rounds;
+	fpgetmask;
+	fpgetround;
+	fpgetsticky;
+	fpsetmask;
+	fpsetround;
+	__infinity;
+	__nan;
+	makecontext;
+	setjmp;
+	longjmp;
+	sigsetjmp;
+	siglongjmp;
+	htonl;
+	htons;
+	ntohl;
+	ntohs;
+	brk;
+	exect;
+	sbrk;
+	vfork;
+};
+
+FBSD_1.3 {
+	__eabi;
+};
+
+FBSDprivate_1.0 {
+	/* PSEUDO syscalls */
+	__sys_getlogin;
+	_getlogin;
+	__sys_exit;
+
+	_set_tp;
+	_fpgetsticky;
+	__makecontext;
+	__longjmp;
+	signalcontext;
+	__signalcontext;
+	__syncicache;
+	_end;
+};

Added: head/lib/libc/powerpcspe/_fpmath.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/_fpmath.h	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,49 @@
+/*-
+ * Copyright (c) 2003 David Schultz <das at 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$
+ */
+
+union IEEEl2bits {
+	long double	e;
+	struct {
+		unsigned int		sign	:1;
+		unsigned int		exp	:11;
+		unsigned int		manh	:20;
+		unsigned int		manl	:32;
+	} bits;
+};
+
+#define	mask_nbit_l(u)	((void)0)
+#define	LDBL_IMPLICIT_NBIT
+#define	LDBL_NBIT	0
+
+#define	LDBL_MANH_SIZE	20
+#define	LDBL_MANL_SIZE	32
+
+#define	LDBL_TO_ARRAY32(u, a) do {			\
+	(a)[0] = (uint32_t)(u).bits.manl;		\
+	(a)[1] = (uint32_t)(u).bits.manh;		\
+} while(0)

Added: head/lib/libc/powerpcspe/arith.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/arith.h	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,16 @@
+/*
+ * MD header for contrib/gdtoa
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * NOTE: The definitions in this file must be correct or strtod(3) and
+ * floating point formats in printf(3) will break!  The file can be
+ * generated by running contrib/gdtoa/arithchk.c on the target
+ * architecture.  See contrib/gdtoa/gdtoaimp.h for details.
+ */
+
+#define IEEE_MC68k
+#define Arith_Kind_ASL 2
+#define Double_Align

Added: head/lib/libc/powerpcspe/gd_qnan.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gd_qnan.h	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,21 @@
+/*
+ * MD header for contrib/gdtoa
+ *
+ * This file can be generated by compiling and running contrib/gdtoa/qnan.c
+ * on the target architecture after arith.h has been generated.
+ *
+ * $FreeBSD$
+ */
+
+#define f_QNAN 0x7fc00000
+#define d_QNAN0 0x7ff80000
+#define d_QNAN1 0x0
+#define ld_QNAN0 0x7ff80000
+#define ld_QNAN1 0x0
+#define ld_QNAN2 0x0
+#define ld_QNAN3 0x0
+#define ldus_QNAN0 0x7ff8
+#define ldus_QNAN1 0x0
+#define ldus_QNAN2 0x0
+#define ldus_QNAN3 0x0
+#define ldus_QNAN4 0x0

Added: head/lib/libc/powerpcspe/gen/Makefile.inc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/Makefile.inc	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+SRCS += _ctx_start.S eabi.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
+	fpgetsticky.c fpsetmask.c fpsetround.c \
+	infinity.c ldexp.c makecontext.c _setjmp.S \
+	setjmp.S sigsetjmp.S signalcontext.c syncicache.c \
+	_set_tp.c \
+	trivial-getcontextx.c
+
+
+

Added: head/lib/libc/powerpcspe/gen/_ctx_start.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/_ctx_start.S	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2004 Suleiman Souhlal
+ * 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$");
+
+	.globl  CNAME(_ctx_done)
+	.globl  CNAME(abort)
+
+ ENTRY(_ctx_start)
+	mtlr	%r14
+	blrl			/* branch to start function */
+	mr	%r3,%r15	/* pass pointer to ucontext as argument */
+	bl	PIC_PLT(CNAME(_ctx_done)) /* branch to ctxt completion func */
+	/*
+	 * we should never return from the
+	 * above branch.
+	 */
+	bl	PIC_PLT(CNAME(abort))	/* abort */
+ END(_cts_start)
+
+	.section .note.GNU-stack,"",%progbits

Added: head/lib/libc/powerpcspe/gen/_set_tp.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/_set_tp.c	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2004 Doug Rabson
+ * 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 "libc_private.h"
+
+void
+_set_tp(void *tpval)
+{
+
+	__asm __volatile("mr 2,%0" :: "r"((char*)tpval + 0x7008));
+}

Added: head/lib/libc/powerpcspe/gen/_setjmp.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/_setjmp.S	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,117 @@
+/*-
+ * Copyright (c) 2016 Justin Hibbits
+ * 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.
+ */
+/*      $NetBSD: _setjmp.S,v 1.1 1997/03/29 20:55:53 thorpej Exp $      */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * C library -- _setjmp, _longjmp
+ *
+ *      _longjmp(a,v)
+ * will generate a "return(v?v:1)" from the last call to
+ *      _setjmp(a)
+ * by restoring registers from the stack.
+ * The previous signal state is NOT restored.
+ *
+ * jmpbuf layout:
+ *     +------------+
+ *     |   unused   |
+ *     +------------+
+ *     |   unused   |
+ *     |            |
+ *     | (4 words)  |
+ *     |            |
+ *     +------------+
+ *     | saved regs |
+ *     |    ...     |	
+ */
+
+ENTRY(_setjmp)
+	mflr	%r11
+	mfcr	%r12
+	evstdd	%r1,24+0*8(%r3)
+	evstdd	%r2,24+1*8(%r3)
+	evstdd	%r11,24+2*8(%r3)
+	evstdd	%r12,24+3*8(%r3)
+	evstdd	%r13,24+4*8(%r3)
+	evstdd	%r14,24+5*8(%r3)
+	evstdd	%r15,24+6*8(%r3)
+	evstdd	%r16,24+7*8(%r3)
+	evstdd	%r17,24+8*8(%r3)
+	evstdd	%r18,24+9*8(%r3)
+	evstdd	%r19,24+10*8(%r3)
+	evstdd	%r20,24+11*8(%r3)
+	evstdd	%r21,24+12*8(%r3)
+	evstdd	%r22,24+13*8(%r3)
+	evstdd	%r23,24+14*8(%r3)
+	evstdd	%r24,24+15*8(%r3)
+	evstdd	%r25,24+16*8(%r3)
+	evstdd	%r26,24+17*8(%r3)
+	evstdd	%r27,24+18*8(%r3)
+	evstdd	%r28,24+19*8(%r3)
+	evstdd	%r29,24+20*8(%r3)
+	evstdd	%r30,24+21*8(%r3)
+	evstdd	%r31,24+22*8(%r3)
+
+	li	%r3,0
+	blr
+END(_setjmp)
+
+ENTRY(_longjmp)
+	evldd	%r1,24+0*8(%r3)
+	evldd	%r2,24+1*8(%r3)
+	evldd	%r11,24+2*8(%r3)
+	evldd	%r12,24+3*8(%r3)
+	evldd	%r13,24+4*8(%r3)
+	evldd	%r14,24+5*8(%r3)
+	evldd	%r15,24+6*8(%r3)
+	evldd	%r16,24+7*8(%r3)
+	evldd	%r17,24+8*8(%r3)
+	evldd	%r18,24+9*8(%r3)
+	evldd	%r19,24+10*8(%r3)
+	evldd	%r20,24+11*8(%r3)
+	evldd	%r21,24+12*8(%r3)
+	evldd	%r22,24+13*8(%r3)
+	evldd	%r23,24+14*8(%r3)
+	evldd	%r24,24+15*8(%r3)
+	evldd	%r25,24+16*8(%r3)
+	evldd	%r26,24+17*8(%r3)
+	evldd	%r27,24+18*8(%r3)
+	evldd	%r28,24+19*8(%r3)
+	evldd	%r29,24+20*8(%r3)
+	evldd	%r30,24+21*8(%r3)
+	evldd	%r31,24+22*8(%r3)
+
+	mtlr	%r11
+	mtcr	%r12
+	or.	%r3,%r4,%r4
+	bnelr
+	li	%r3,1
+	blr
+END(_longjmp)
+
+	.section .note.GNU-stack,"",%progbits

Added: head/lib/libc/powerpcspe/gen/eabi.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/eabi.S	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2011 Marcel Moolenaar
+ * 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$");
+
+ENTRY(__eabi)
+	blr
+END(__eabi)
+
+	.section .note.GNU-stack,"",%progbits

Added: head/lib/libc/powerpcspe/gen/fabs.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/fabs.S	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016 Justin Hibbits
+ * 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$");
+
+/*
+ * double fabs(double)
+ */
+ENTRY(fabs)
+	efdabs	%f1,%f1
+	blr
+END(fabs)
+
+	.section .note.GNU-stack,"",%progbits

Added: head/lib/libc/powerpcspe/gen/flt_rounds.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/flt_rounds.c	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,57 @@
+/*	$NetBSD: flt_rounds.c,v 1.4.10.3 2002/03/22 20:41:53 nathanw Exp $	*/
+
+/*
+ * Copyright (c) 2016 Justin Hibbits
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Mark Brinicombe
+ *	for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <machine/float.h>
+#include <machine/spr.h>
+
+#ifndef _SOFT_FLOAT
+static const int map[] = {
+	1,	/* round to nearest */
+	0,	/* round to zero */
+	2,	/* round to positive infinity */
+	3	/* round to negative infinity */
+};
+
+int
+__flt_rounds()
+{
+	uint32_t fpscr;
+
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
+	return map[(fpscr & 0x03)];
+}
+#endif

Added: head/lib/libc/powerpcspe/gen/fpgetmask.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/fpgetmask.c	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,49 @@
+/*	$NetBSD: fpgetmask.c,v 1.3 2002/01/13 21:45:47 thorpej Exp $	*/
+
+/*
+ * Copyright (c) 2016 Justin Hibbits
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dan Winship.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <machine/spr.h>
+#include <ieeefp.h>
+
+#ifndef _SOFT_FLOAT
+fp_except_t
+fpgetmask()
+{
+	uint32_t fpscr;
+
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
+	return ((fp_except_t)((fpscr >> 3) & 0x1f));
+}
+#endif

Added: head/lib/libc/powerpcspe/gen/fpgetround.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/fpgetround.c	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,49 @@
+/*	$NetBSD: fpgetround.c,v 1.3 2002/01/13 21:45:47 thorpej Exp $	*/
+
+/*
+ * Copyright (c) 2016 Justin Hibbits
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dan Winship.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <machine/spr.h>
+#include <ieeefp.h>
+
+#ifndef _SOFT_FLOAT
+fp_rnd_t
+fpgetround()
+{
+	uint32_t fpscr;
+
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
+	return ((fp_rnd_t)(fpscr & 0x3));
+}
+#endif

Added: head/lib/libc/powerpcspe/gen/fpgetsticky.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/fpgetsticky.c	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,55 @@
+/*	$NetBSD: fpgetsticky.c,v 1.3 2002/01/13 21:45:48 thorpej Exp $	*/
+
+/*
+ * Copyright (c) 2016 Justin Hibbits
+ * All rights reserved.
+ * 
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dan Winship.
+ * 
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 "namespace.h"
+
+#include <sys/types.h>
+#include <machine/spr.h>
+#include <ieeefp.h>
+
+#ifndef _SOFT_FLOAT
+#ifdef __weak_alias
+__weak_alias(fpgetsticky,_fpgetsticky)
+#endif
+
+fp_except_t
+fpgetsticky()
+{
+	uint32_t fpscr;
+
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
+	return ((fp_except_t)((fpscr >> 25) & 0x1f));
+}
+#endif

Added: head/lib/libc/powerpcspe/gen/fpsetmask.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/powerpcspe/gen/fpsetmask.c	Sat Oct 22 01:57:15 2016	(r307761)
@@ -0,0 +1,53 @@
+/*	$NetBSD: fpsetmask.c,v 1.3 2002/01/13 21:45:48 thorpej Exp $	*/
+
+/*
+ * Copyright (c) 2016 Justin Hibbits

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


More information about the svn-src-all mailing list