Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Mar 2016 20:43:02 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r296680 - in projects/powerpcspe: . 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...
Message-ID:  <201603112043.u2BKh2An055541@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Fri Mar 11 20:43:02 2016
New Revision: 296680
URL: https://svnweb.freebsd.org/changeset/base/296680

Log:
  Introduce SPE ABI for PowerPC Book-E
  
  Changes include:
  * New MACHINE_ARCH (powerpcspe)
  * Makefile changes to support the new MACHINE_ARCH
  * libc changes for fp* and setjmp
  * lim changes for fenv.h.
   * Hard-coded the SPEFSCR SPR definition (512), to avoid #include-ing
     machine/spr.h
  * Toolchain changes to enable the ABI.
  
  There is currently one gotcha -- when using -mspe, -mcpu=8540 is required, else
  an internal compiler error is generated in gcc.
  
  This ABI is incompatible with the standard 32-bit PowerPC ABI.

Added:
  projects/powerpcspe/contrib/gcc/config/rs6000/freebsdspe.h   (contents, props changed)
  projects/powerpcspe/lib/libc/powerpcspe/
     - copied from r289406, projects/powerpcspe/lib/libc/powerpc/
  projects/powerpcspe/sys/conf/ldscript.powerpcspe
  projects/powerpcspe/sys/powerpc/booke/spe.c   (contents, props changed)
Modified:
  projects/powerpcspe/Makefile.inc1
  projects/powerpcspe/contrib/binutils/bfd/config.bfd
  projects/powerpcspe/gnu/lib/libgcc/Makefile
  projects/powerpcspe/gnu/lib/libgomp/Makefile
  projects/powerpcspe/gnu/usr.bin/binutils/Makefile.inc0
  projects/powerpcspe/gnu/usr.bin/cc/Makefile.tgt
  projects/powerpcspe/gnu/usr.bin/cc/cc_tools/Makefile
  projects/powerpcspe/gnu/usr.bin/cc/include/Makefile
  projects/powerpcspe/gnu/usr.bin/gdb/Makefile.inc
  projects/powerpcspe/gnu/usr.bin/gdb/libgdb/Makefile
  projects/powerpcspe/lib/libc/powerpcspe/gen/_setjmp.S
  projects/powerpcspe/lib/libc/powerpcspe/gen/fabs.S
  projects/powerpcspe/lib/libc/powerpcspe/gen/flt_rounds.c
  projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetmask.c
  projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetround.c
  projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetsticky.c
  projects/powerpcspe/lib/libc/powerpcspe/gen/fpsetmask.c
  projects/powerpcspe/lib/libc/powerpcspe/gen/fpsetround.c
  projects/powerpcspe/lib/libc/powerpcspe/gen/setjmp.S
  projects/powerpcspe/lib/libc/powerpcspe/gen/sigsetjmp.S
  projects/powerpcspe/lib/libkvm/Makefile
  projects/powerpcspe/lib/msun/powerpc/fenv.h
  projects/powerpcspe/share/mk/bsd.cpu.mk
  projects/powerpcspe/share/mk/bsd.endian.mk
  projects/powerpcspe/share/mk/sys.mk
  projects/powerpcspe/sys/boot/powerpc/Makefile
  projects/powerpcspe/sys/conf/files.powerpc
  projects/powerpcspe/sys/conf/kern.mk
  projects/powerpcspe/sys/conf/options.powerpc

Modified: projects/powerpcspe/Makefile.inc1
==============================================================================
--- projects/powerpcspe/Makefile.inc1	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/Makefile.inc1	Fri Mar 11 20:43:02 2016	(r296680)
@@ -146,7 +146,7 @@ SRCRELDATE!=	awk '/^\#define[[:space:]]*
 VERSION=	FreeBSD ${REVISION}-${BRANCH:C/-p[0-9]+$//} ${TARGET_ARCH} ${SRCRELDATE}
 .endif
 
-KNOWN_ARCHES?=	aarch64/arm64 amd64 arm armeb/arm armv6/arm armv6hf/arm i386 i386/pc98 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/mips powerpc powerpc64/powerpc sparc64
+KNOWN_ARCHES?=	aarch64/arm64 amd64 arm armeb/arm armv6/arm armv6hf/arm i386 i386/pc98 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/mips powerpc powerpc64/powerpc powerpcspe/powerpc sparc64
 .if ${TARGET} == ${TARGET_ARCH}
 _t=		${TARGET}
 .else

Modified: projects/powerpcspe/contrib/binutils/bfd/config.bfd
==============================================================================
--- projects/powerpcspe/contrib/binutils/bfd/config.bfd	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/contrib/binutils/bfd/config.bfd	Fri Mar 11 20:43:02 2016	(r296680)
@@ -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: projects/powerpcspe/contrib/gcc/config/rs6000/freebsdspe.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/powerpcspe/contrib/gcc/config/rs6000/freebsdspe.h	Fri Mar 11 20:43:02 2016	(r296680)
@@ -0,0 +1,76 @@
+/* Definitions of target machine for GNU compiler,
+   for PowerPC e500 machines running GNU/Linux.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+   Contributed by Aldy Hernandez (aldy@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: projects/powerpcspe/gnu/lib/libgcc/Makefile
==============================================================================
--- projects/powerpcspe/gnu/lib/libgcc/Makefile	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/lib/libgcc/Makefile	Fri Mar 11 20:43:02 2016	(r296680)
@@ -132,7 +132,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: projects/powerpcspe/gnu/lib/libgomp/Makefile
==============================================================================
--- projects/powerpcspe/gnu/lib/libgomp/Makefile	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/lib/libgomp/Makefile	Fri Mar 11 20:43:02 2016	(r296680)
@@ -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: projects/powerpcspe/gnu/usr.bin/binutils/Makefile.inc0
==============================================================================
--- projects/powerpcspe/gnu/usr.bin/binutils/Makefile.inc0	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/usr.bin/binutils/Makefile.inc0	Fri Mar 11 20:43:02 2016	(r296680)
@@ -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|hf)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/:C/powerpcspe/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: projects/powerpcspe/gnu/usr.bin/cc/Makefile.tgt
==============================================================================
--- projects/powerpcspe/gnu/usr.bin/cc/Makefile.tgt	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/usr.bin/cc/Makefile.tgt	Fri Mar 11 20:43:02 2016	(r296680)
@@ -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|hf)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/:C/powerpcspe/powerpc/}
 .else
 TARGET_CPUARCH=${MACHINE_CPUARCH}
 .endif

Modified: projects/powerpcspe/gnu/usr.bin/cc/cc_tools/Makefile
==============================================================================
--- projects/powerpcspe/gnu/usr.bin/cc/cc_tools/Makefile	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/usr.bin/cc/cc_tools/Makefile	Fri Mar 11 20:43:02 2016	(r296680)
@@ -57,6 +57,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: projects/powerpcspe/gnu/usr.bin/cc/include/Makefile
==============================================================================
--- projects/powerpcspe/gnu/usr.bin/cc/include/Makefile	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/usr.bin/cc/include/Makefile	Fri Mar 11 20:43:02 2016	(r296680)
@@ -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: projects/powerpcspe/gnu/usr.bin/gdb/Makefile.inc
==============================================================================
--- projects/powerpcspe/gnu/usr.bin/gdb/Makefile.inc	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/usr.bin/gdb/Makefile.inc	Fri Mar 11 20:43:02 2016	(r296680)
@@ -21,7 +21,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|hf)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/:C/powerpcspe/powerpc/}
 .else
 TARGET_CPUARCH=${MACHINE_CPUARCH}
 .endif

Modified: projects/powerpcspe/gnu/usr.bin/gdb/libgdb/Makefile
==============================================================================
--- projects/powerpcspe/gnu/usr.bin/gdb/libgdb/Makefile	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/gnu/usr.bin/gdb/libgdb/Makefile	Fri Mar 11 20:43:02 2016	(r296680)
@@ -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|hf)?/arm/:C/powerpc64/powerpc/}
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/:C/powerpcspe/powerpc/}
 .else
 TARGET_CPUARCH=${MACHINE_CPUARCH}
 .endif

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/_setjmp.S
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/_setjmp.S	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/_setjmp.S	Fri Mar 11 20:43:02 2016	(r296680)
@@ -53,60 +53,61 @@ __FBSDID("$FreeBSD$");
 ENTRY(_setjmp)
 	mflr	%r11
 	mfcr	%r12
-	mr	%r10,%r1
-	mr	%r9,%r2
-	stmw	%r9,20(%r3)
-
-	/* FPRs */
-	stfd	%f14,112+0*8(%r3)
-	stfd	%f15,112+1*8(%r3)
-	stfd	%f16,112+2*8(%r3)
-	stfd	%f17,112+3*8(%r3)
-	stfd	%f18,112+4*8(%r3)
-	stfd	%f19,112+5*8(%r3)
-	stfd	%f20,112+6*8(%r3)
-	stfd	%f21,112+7*8(%r3)
-	stfd	%f22,112+8*8(%r3)
-	stfd	%f23,112+9*8(%r3)
-	stfd	%f24,112+10*8(%r3)
-	stfd	%f25,112+11*8(%r3)
-	stfd	%f26,112+12*8(%r3)
-	stfd	%f27,112+13*8(%r3)
-	stfd	%f28,112+14*8(%r3)
-	stfd	%f29,112+15*8(%r3)
-	stfd	%f30,112+16*8(%r3)
-	stfd	%f31,112+17*8(%r3)
+	evstdd	%r1,24+0*8(%r6)
+	evstdd	%r2,24+1*8(%r6)
+	evstdd	%r11,24+2*8(%r6)
+	evstdd	%r12,24+3*8(%r6)
+	evstdd	%r13,24+4*8(%r6)
+	evstdd	%r14,24+5*8(%r6)
+	evstdd	%r15,24+6*8(%r6)
+	evstdd	%r16,24+7*8(%r6)
+	evstdd	%r17,24+8*8(%r6)
+	evstdd	%r18,24+9*8(%r6)
+	evstdd	%r19,24+10*8(%r6)
+	evstdd	%r20,24+11*8(%r6)
+	evstdd	%r21,24+12*8(%r6)
+	evstdd	%r22,24+13*8(%r6)
+	evstdd	%r23,24+14*8(%r6)
+	evstdd	%r24,24+15*8(%r6)
+	evstdd	%r25,24+16*8(%r6)
+	evstdd	%r26,24+17*8(%r6)
+	evstdd	%r27,24+18*8(%r6)
+	evstdd	%r28,24+19*8(%r6)
+	evstdd	%r29,24+20*8(%r6)
+	evstdd	%r30,24+21*8(%r6)
+	evstdd	%r31,24+22*8(%r6)
 
 	li	%r3,0
 	blr
 END(_setjmp)
 
 ENTRY(_longjmp)
-	lmw	%r9,20(%r3)
-
-	/* FPRs */
-	lfd	%f14,112+0*8(%r3)
-	lfd	%f15,112+1*8(%r3)
-	lfd	%f16,112+2*8(%r3)
-	lfd	%f17,112+3*8(%r3)
-	lfd	%f18,112+4*8(%r3)
-	lfd	%f19,112+5*8(%r3)
-	lfd	%f20,112+6*8(%r3)
-	lfd	%f21,112+7*8(%r3)
-	lfd	%f22,112+8*8(%r3)
-	lfd	%f23,112+9*8(%r3)
-	lfd	%f24,112+10*8(%r3)
-	lfd	%f25,112+11*8(%r3)
-	lfd	%f26,112+12*8(%r3)
-	lfd	%f27,112+13*8(%r3)
-	lfd	%f28,112+14*8(%r3)
-	lfd	%f29,112+15*8(%r3)
-	lfd	%f30,112+16*8(%r3)
-	lfd	%f31,112+17*8(%r3)
+	evldd	%r1,24+0*8(%r6)
+	evldd	%r2,24+1*8(%r6)
+	evldd	%r11,24+2*8(%r6)
+	evldd	%r12,24+3*8(%r6)
+	evldd	%r13,24+4*8(%r6)
+	evldd	%r14,24+5*8(%r6)
+	evldd	%r15,24+6*8(%r6)
+	evldd	%r16,24+7*8(%r6)
+	evldd	%r17,24+8*8(%r6)
+	evldd	%r18,24+9*8(%r6)
+	evldd	%r19,24+10*8(%r6)
+	evldd	%r20,24+11*8(%r6)
+	evldd	%r21,24+12*8(%r6)
+	evldd	%r22,24+13*8(%r6)
+	evldd	%r23,24+14*8(%r6)
+	evldd	%r24,24+15*8(%r6)
+	evldd	%r25,24+16*8(%r6)
+	evldd	%r26,24+17*8(%r6)
+	evldd	%r27,24+18*8(%r6)
+	evldd	%r28,24+19*8(%r6)
+	evldd	%r29,24+20*8(%r6)
+	evldd	%r30,24+21*8(%r6)
+	evldd	%r31,24+22*8(%r6)
 
 	mtlr	%r11
 	mtcr	%r12
-	mr	%r1,%r10
 	or.	%r3,%r4,%r4
 	bnelr
 	li	%r3,1

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/fabs.S
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/fabs.S	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/fabs.S	Fri Mar 11 20:43:02 2016	(r296680)
@@ -31,7 +31,7 @@ __FBSDID("$FreeBSD$");
  * double fabs(double)
  */
 ENTRY(fabs)
-	fabs	%f1,%f1
+	efdabs	%f1,%f1
 	blr
 END(fabs)
 

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/flt_rounds.c
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/flt_rounds.c	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/flt_rounds.c	Fri Mar 11 20:43:02 2016	(r296680)
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
 #include <machine/float.h>
+#include <machine/spr.h>
 
 #ifndef _SOFT_FLOAT
 static const int map[] = {
@@ -48,9 +49,9 @@ static const int map[] = {
 int
 __flt_rounds()
 {
-	uint64_t fpscr;
+	uint32_t fpscr;
 
-	__asm__ __volatile("mffs %0" : "=f"(fpscr));
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
 	return map[(fpscr & 0x03)];
 }
 #endif

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetmask.c
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/fpgetmask.c	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetmask.c	Fri Mar 11 20:43:02 2016	(r296680)
@@ -34,15 +34,16 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <machine/spr.h>
 #include <ieeefp.h>
 
 #ifndef _SOFT_FLOAT
 fp_except_t
 fpgetmask()
 {
-	u_int64_t fpscr;
+	uint32_t fpscr;
 
-	__asm__("mffs %0" : "=f"(fpscr));
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
 	return ((fp_except_t)((fpscr >> 3) & 0x1f));
 }
 #endif

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetround.c
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/fpgetround.c	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetround.c	Fri Mar 11 20:43:02 2016	(r296680)
@@ -34,15 +34,16 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <machine/spr.h>
 #include <ieeefp.h>
 
 #ifndef _SOFT_FLOAT
 fp_rnd_t
 fpgetround()
 {
-	u_int64_t fpscr;
+	uint32_t fpscr;
 
-	__asm__("mffs %0" : "=f"(fpscr));
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
 	return ((fp_rnd_t)(fpscr & 0x3));
 }
 #endif

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetsticky.c
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/fpgetsticky.c	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/fpgetsticky.c	Fri Mar 11 20:43:02 2016	(r296680)
@@ -36,6 +36,7 @@
 #include "namespace.h"
 
 #include <sys/types.h>
+#include <machine/spr.h>
 #include <ieeefp.h>
 
 #ifndef _SOFT_FLOAT
@@ -46,9 +47,9 @@ __weak_alias(fpgetsticky,_fpgetsticky)
 fp_except_t
 fpgetsticky()
 {
-	u_int64_t fpscr;
+	uint32_t fpscr;
 
-	__asm__ __volatile("mffs %0" : "=f"(fpscr));
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
 	return ((fp_except_t)((fpscr >> 25) & 0x1f));
 }
 #endif

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/fpsetmask.c
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/fpsetmask.c	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/fpsetmask.c	Fri Mar 11 20:43:02 2016	(r296680)
@@ -34,19 +34,20 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <machine/spr.h>
 #include <ieeefp.h>
 
 #ifndef _SOFT_FLOAT
 fp_except_t
 fpsetmask(fp_except_t mask)
 {
-	u_int64_t fpscr;
+	uint32_t fpscr;
 	fp_rnd_t old;
 
-	__asm__("mffs %0" : "=f"(fpscr));
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
 	old = (fp_rnd_t)((fpscr >> 3) & 0x1f);
 	fpscr = (fpscr & 0xffffff07) | (mask << 3);
-	__asm__ __volatile("mtfsf 0xff,%0" :: "f"(fpscr));
+	__asm__ __volatile("mtspr %1,%0" :: "r"(fpscr), "K"(SPR_SPEFSCR));
 	return (old);
 }
 #endif

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/fpsetround.c
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/fpsetround.c	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/fpsetround.c	Fri Mar 11 20:43:02 2016	(r296680)
@@ -34,19 +34,20 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <machine/spr.h>
 #include <ieeefp.h>
 
 #ifndef _SOFT_FLOAT
 fp_rnd_t
 fpsetround(fp_rnd_t rnd_dir)
 {
-	u_int64_t fpscr;
+	uint32_t fpscr;
 	fp_rnd_t old;
 
-	__asm__ __volatile("mffs %0" : "=f"(fpscr));
+	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR) );
 	old = (fp_rnd_t)(fpscr & 0x3);
 	fpscr = (fpscr & 0xfffffffc) | rnd_dir;
-	__asm__ __volatile("mtfsf 0xff,%0" :: "f"(fpscr));
+	__asm__ __volatile("mtspr %1, %0" :: "r"(fpscr), "K"(SPR_SPEFSCR));
 	return (old);
 }
 #endif

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/setjmp.S
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/setjmp.S	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/setjmp.S	Fri Mar 11 20:43:02 2016	(r296680)
@@ -65,27 +65,29 @@ ENTRY(setjmp)
 	mfcr	%r12			/* r12 <- condition reg */
 	mr	%r10,%r1		/* r10 <- stackptr */
 	mr	%r9,%r2			/*  r9 <- global ptr */
-	stmw	%r9,20(%r6)
-
-	/* FPRs */
-	stfd	%f14,112+0*8(%r6)
-	stfd	%f15,112+1*8(%r6)
-	stfd	%f16,112+2*8(%r6)
-	stfd	%f17,112+3*8(%r6)
-	stfd	%f18,112+4*8(%r6)
-	stfd	%f19,112+5*8(%r6)
-	stfd	%f20,112+6*8(%r6)
-	stfd	%f21,112+7*8(%r6)
-	stfd	%f22,112+8*8(%r6)
-	stfd	%f23,112+9*8(%r6)
-	stfd	%f24,112+10*8(%r6)
-	stfd	%f25,112+11*8(%r6)
-	stfd	%f26,112+12*8(%r6)
-	stfd	%f27,112+13*8(%r6)
-	stfd	%f28,112+14*8(%r6)
-	stfd	%f29,112+15*8(%r6)
-	stfd	%f30,112+16*8(%r6)
-	stfd	%f31,112+17*8(%r6)
+	evstdd	%r9,24+0*8(%r6)
+	evstdd	%r10,24+1*8(%r6)
+	evstdd	%r11,24+2*8(%r6)
+	evstdd	%r12,24+3*8(%r6)
+	evstdd	%r13,24+4*8(%r6)
+	evstdd	%r14,24+5*8(%r6)
+	evstdd	%r15,24+6*8(%r6)
+	evstdd	%r16,24+7*8(%r6)
+	evstdd	%r17,24+8*8(%r6)
+	evstdd	%r18,24+9*8(%r6)
+	evstdd	%r19,24+10*8(%r6)
+	evstdd	%r20,24+11*8(%r6)
+	evstdd	%r21,24+12*8(%r6)
+	evstdd	%r22,24+13*8(%r6)
+	evstdd	%r23,24+14*8(%r6)
+	evstdd	%r24,24+15*8(%r6)
+	evstdd	%r25,24+16*8(%r6)
+	evstdd	%r26,24+17*8(%r6)
+	evstdd	%r27,24+18*8(%r6)
+	evstdd	%r28,24+19*8(%r6)
+	evstdd	%r29,24+20*8(%r6)
+	evstdd	%r30,24+21*8(%r6)
+	evstdd	%r31,24+22*8(%r6)
 
 	li	%r3,0			/* return (0) */
 	blr
@@ -93,27 +95,29 @@ END(setjmp)
 
 	WEAK_REFERENCE(CNAME(__longjmp), longjmp)
 ENTRY(__longjmp)
-	lmw	%r9,20(%r3)		/* restore regs */
-
-	/* FPRs */
-	lfd	%f14,112+0*8(%r3)
-	lfd	%f15,112+1*8(%r3)
-	lfd	%f16,112+2*8(%r3)
-	lfd	%f17,112+3*8(%r3)
-	lfd	%f18,112+4*8(%r3)
-	lfd	%f19,112+5*8(%r3)
-	lfd	%f20,112+6*8(%r3)
-	lfd	%f21,112+7*8(%r3)
-	lfd	%f22,112+8*8(%r3)
-	lfd	%f23,112+9*8(%r3)
-	lfd	%f24,112+10*8(%r3)
-	lfd	%f25,112+11*8(%r3)
-	lfd	%f26,112+12*8(%r3)
-	lfd	%f27,112+13*8(%r3)
-	lfd	%f28,112+14*8(%r3)
-	lfd	%f29,112+15*8(%r3)
-	lfd	%f30,112+16*8(%r3)
-	lfd	%f31,112+17*8(%r3)
+	evldd	%r9,24+0*8(%r6)
+	evldd	%r10,24+1*8(%r6)
+	evldd	%r11,24+2*8(%r6)
+	evldd	%r12,24+3*8(%r6)
+	evldd	%r13,24+4*8(%r6)
+	evldd	%r14,24+5*8(%r6)
+	evldd	%r15,24+6*8(%r6)
+	evldd	%r16,24+7*8(%r6)
+	evldd	%r17,24+8*8(%r6)
+	evldd	%r18,24+9*8(%r6)
+	evldd	%r19,24+10*8(%r6)
+	evldd	%r20,24+11*8(%r6)
+	evldd	%r21,24+12*8(%r6)
+	evldd	%r22,24+13*8(%r6)
+	evldd	%r23,24+14*8(%r6)
+	evldd	%r24,24+15*8(%r6)
+	evldd	%r25,24+16*8(%r6)
+	evldd	%r26,24+17*8(%r6)
+	evldd	%r27,24+18*8(%r6)
+	evldd	%r28,24+19*8(%r6)
+	evldd	%r29,24+20*8(%r6)
+	evldd	%r30,24+21*8(%r6)
+	evldd	%r31,24+22*8(%r6)
 
 	mr	%r6,%r4			/* save val param */
 	mtlr	%r11			/* r11 -> link reg */

Modified: projects/powerpcspe/lib/libc/powerpcspe/gen/sigsetjmp.S
==============================================================================
--- projects/powerpcspe/lib/libc/powerpc/gen/sigsetjmp.S	Fri Oct 16 03:21:24 2015	(r289406)
+++ projects/powerpcspe/lib/libc/powerpcspe/gen/sigsetjmp.S	Fri Mar 11 20:43:02 2016	(r296680)
@@ -70,54 +70,62 @@ ENTRY(sigsetjmp)
 	mfcr	%r12
 	mr	%r10,%r1
 	mr	%r9,%r2
-	stmw	%r9,20(%r6)
 
 	/* FPRs */
-	stfd	%f14,112+0*8(%r6)
-	stfd	%f15,112+1*8(%r6)
-	stfd	%f16,112+2*8(%r6)
-	stfd	%f17,112+3*8(%r6)
-	stfd	%f18,112+4*8(%r6)
-	stfd	%f19,112+5*8(%r6)
-	stfd	%f20,112+6*8(%r6)
-	stfd	%f21,112+7*8(%r6)
-	stfd	%f22,112+8*8(%r6)
-	stfd	%f23,112+9*8(%r6)
-	stfd	%f24,112+10*8(%r6)
-	stfd	%f25,112+11*8(%r6)
-	stfd	%f26,112+12*8(%r6)
-	stfd	%f27,112+13*8(%r6)
-	stfd	%f28,112+14*8(%r6)
-	stfd	%f29,112+15*8(%r6)
-	stfd	%f30,112+16*8(%r6)
-	stfd	%f31,112+17*8(%r6)
+	evstdd	%r9,24+0*8(%r6)
+	evstdd	%r10,24+1*8(%r6)
+	evstdd	%r11,24+2*8(%r6)
+	evstdd	%r12,24+3*8(%r6)
+	evstdd	%r13,24+4*8(%r6)
+	evstdd	%r14,24+5*8(%r6)
+	evstdd	%r15,24+6*8(%r6)
+	evstdd	%r16,24+7*8(%r6)
+	evstdd	%r17,24+8*8(%r6)
+	evstdd	%r18,24+9*8(%r6)
+	evstdd	%r19,24+10*8(%r6)
+	evstdd	%r20,24+11*8(%r6)
+	evstdd	%r21,24+12*8(%r6)
+	evstdd	%r22,24+13*8(%r6)
+	evstdd	%r23,24+14*8(%r6)
+	evstdd	%r24,24+15*8(%r6)
+	evstdd	%r25,24+16*8(%r6)
+	evstdd	%r26,24+17*8(%r6)
+	evstdd	%r27,24+18*8(%r6)
+	evstdd	%r28,24+19*8(%r6)
+	evstdd	%r29,24+20*8(%r6)
+	evstdd	%r30,24+21*8(%r6)
+	evstdd	%r31,24+22*8(%r6)
 
 	li	%r3,0
 	blr
 END(sigsetjmp)
 
 ENTRY(siglongjmp)
-	lmw	%r9,20(%r3)
 
 	/* FPRs */
-	lfd	%f14,112+0*8(%r3)
-	lfd	%f15,112+1*8(%r3)
-	lfd	%f16,112+2*8(%r3)
-	lfd	%f17,112+3*8(%r3)
-	lfd	%f18,112+4*8(%r3)
-	lfd	%f19,112+5*8(%r3)
-	lfd	%f20,112+6*8(%r3)
-	lfd	%f21,112+7*8(%r3)
-	lfd	%f22,112+8*8(%r3)
-	lfd	%f23,112+9*8(%r3)
-	lfd	%f24,112+10*8(%r3)
-	lfd	%f25,112+11*8(%r3)
-	lfd	%f26,112+12*8(%r3)
-	lfd	%f27,112+13*8(%r3)
-	lfd	%f28,112+14*8(%r3)
-	lfd	%f29,112+15*8(%r3)
-	lfd	%f30,112+16*8(%r3)
-	lfd	%f31,112+17*8(%r3)
+	evldd	%r9,24+0*8(%r6)
+	evldd	%r10,24+1*8(%r6)
+	evldd	%r11,24+2*8(%r6)
+	evldd	%r12,24+3*8(%r6)
+	evldd	%r13,24+4*8(%r6)
+	evldd	%r14,24+5*8(%r6)
+	evldd	%r15,24+6*8(%r6)
+	evldd	%r16,24+7*8(%r6)
+	evldd	%r17,24+8*8(%r6)
+	evldd	%r18,24+9*8(%r6)
+	evldd	%r19,24+10*8(%r6)
+	evldd	%r20,24+11*8(%r6)
+	evldd	%r21,24+12*8(%r6)
+	evldd	%r22,24+13*8(%r6)
+	evldd	%r23,24+14*8(%r6)
+	evldd	%r24,24+15*8(%r6)
+	evldd	%r25,24+16*8(%r6)
+	evldd	%r26,24+17*8(%r6)
+	evldd	%r27,24+18*8(%r6)
+	evldd	%r28,24+19*8(%r6)
+	evldd	%r29,24+20*8(%r6)
+	evldd	%r30,24+21*8(%r6)
+	evldd	%r31,24+22*8(%r6)
 
 	lwz	%r7,0(%r3)
 	mr	%r6,%r4

Modified: projects/powerpcspe/lib/libkvm/Makefile
==============================================================================
--- projects/powerpcspe/lib/libkvm/Makefile	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/lib/libkvm/Makefile	Fri Mar 11 20:43:02 2016	(r296680)
@@ -3,7 +3,7 @@
 
 .if defined(TARGET_ARCH) && !defined(COMPAT_32BIT)
 KVM_XARCH=${TARGET_ARCH}
-KVM_XCPUARCH=${KVM_XARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/}
+KVM_XCPUARCH=${KVM_XARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc(64|spe)/powerpc/}
 .else
 KVM_XARCH=${MACHINE_ARCH}
 KVM_XCPUARCH=${MACHINE_CPUARCH}

Modified: projects/powerpcspe/lib/msun/powerpc/fenv.h
==============================================================================
--- projects/powerpcspe/lib/msun/powerpc/fenv.h	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/lib/msun/powerpc/fenv.h	Fri Mar 11 20:43:02 2016	(r296680)
@@ -87,8 +87,13 @@ extern const fenv_t	__fe_dfl_env;
 			 FE_OVERFLOW | FE_UNDERFLOW) >> _FPUSW_SHIFT)
 
 #ifndef _SOFT_FLOAT
+#ifdef __SPE__
+#define	__mffs(__env)	__asm __volatile("mfspr %0, 512" : "=r" (*(__env)))
+#define	__mtfsf(__env)	__asm __volatile("mtspr 512,%0" : : "r" (__env))
+#else
 #define	__mffs(__env)	__asm __volatile("mffs %0" : "=f" (*(__env)))
 #define	__mtfsf(__env)	__asm __volatile("mtfsf 255,%0" : : "f" (__env))
+#endif
 #else
 #define	__mffs(__env)
 #define	__mtfsf(__env)

Modified: projects/powerpcspe/share/mk/bsd.cpu.mk
==============================================================================
--- projects/powerpcspe/share/mk/bsd.cpu.mk	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/share/mk/bsd.cpu.mk	Fri Mar 11 20:43:02 2016	(r296680)
@@ -120,6 +120,8 @@ _CPUCFLAGS = -Wa,-me500 -msoft-float
 .  else
 _CPUCFLAGS = -mcpu=${CPUTYPE} -mno-powerpc64
 .  endif
+. elif ${MACHINE_ARCH} == "powerpcspe"
+_CPUCFLAGS = -Wa,-me500 -mspe=yes -mabi=spe -mfloat-gprs=double
 . elif ${MACHINE_ARCH} == "powerpc64"
 _CPUCFLAGS = -mcpu=${CPUTYPE}
 . elif ${MACHINE_CPUARCH} == "mips"
@@ -296,6 +298,10 @@ CFLAGS += -mfloat-abi=softfp
 .endif
 .endif
 
+.if ${MACHINE_ARCH} == "powerpcspe"
+CFLAGS += -mcpu=8540 -Wa,-me500 -mspe=yes -mabi=spe -mfloat-gprs=double
+.endif
+
 # NB: COPTFLAGS is handled in /usr/src/sys/conf/kern.pre.mk
 
 .if !defined(NO_CPU_CFLAGS)

Modified: projects/powerpcspe/share/mk/bsd.endian.mk
==============================================================================
--- projects/powerpcspe/share/mk/bsd.endian.mk	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/share/mk/bsd.endian.mk	Fri Mar 11 20:43:02 2016	(r296680)
@@ -8,6 +8,7 @@
 TARGET_ENDIANNESS= 1234
 .elif ${MACHINE_ARCH} == "powerpc" || \
     ${MACHINE_ARCH} == "powerpc64" || \
+    ${MACHINE_ARCH} == "powerpcspe" || \
     ${MACHINE_ARCH} == "sparc64" || \
     (${MACHINE} == "arm" && ${MACHINE_ARCH:Marm*eb*} != "") || \
     ${MACHINE_ARCH:Mmips*} != ""

Modified: projects/powerpcspe/share/mk/sys.mk
==============================================================================
--- projects/powerpcspe/share/mk/sys.mk	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/share/mk/sys.mk	Fri Mar 11 20:43:02 2016	(r296680)
@@ -13,7 +13,7 @@ unix		?=	We run FreeBSD, not UNIX.
 # and/or endian.  This is called MACHINE_CPU in NetBSD, but that's used
 # for something different in FreeBSD.
 #
-MACHINE_CPUARCH=${MACHINE_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/}
+MACHINE_CPUARCH=${MACHINE_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc(64|spe)/powerpc/}
 .endif
 
 

Modified: projects/powerpcspe/sys/boot/powerpc/Makefile
==============================================================================
--- projects/powerpcspe/sys/boot/powerpc/Makefile	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/sys/boot/powerpc/Makefile	Fri Mar 11 20:43:02 2016	(r296680)
@@ -1,5 +1,8 @@
 # $FreeBSD$
 
-SUBDIR=		boot1.chrp kboot ofw ps3 uboot
+SUBDIR=		boot1.chrp kboot ofw uboot
+.if ${MACHINE_ARCH} != "powerpcspe"
+SUBDIR+=	ps3
+.endif
 
 .include <bsd.subdir.mk>

Modified: projects/powerpcspe/sys/conf/files.powerpc
==============================================================================
--- projects/powerpcspe/sys/conf/files.powerpc	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/sys/conf/files.powerpc	Fri Mar 11 20:43:02 2016	(r296680)
@@ -80,24 +80,24 @@ kern/kern_clocksource.c		standard
 kern/subr_dummy_vdso_tc.c	standard
 kern/syscalls.c			optional	ktr
 kern/subr_sfbuf.c		standard
-libkern/ashldi3.c		optional	powerpc
-libkern/ashrdi3.c		optional	powerpc
+libkern/ashldi3.c		optional	powerpc | powerpcspe
+libkern/ashrdi3.c		optional	powerpc | powerpcspe
 libkern/bcmp.c			standard
-libkern/cmpdi2.c		optional	powerpc
-libkern/divdi3.c		optional	powerpc
+libkern/cmpdi2.c		optional	powerpc | powerpcspe
+libkern/divdi3.c		optional	powerpc | powerpcspe
 libkern/ffs.c			standard
 libkern/ffsl.c			standard
 libkern/fls.c			standard
 libkern/flsl.c			standard
 libkern/flsll.c			standard
-libkern/lshrdi3.c		optional	powerpc
+libkern/lshrdi3.c		optional	powerpc | powerpcspe
 libkern/memmove.c		standard
 libkern/memset.c		standard
-libkern/moddi3.c		optional	powerpc
-libkern/qdivrem.c		optional	powerpc
-libkern/ucmpdi2.c		optional	powerpc
-libkern/udivdi3.c		optional	powerpc
-libkern/umoddi3.c		optional	powerpc
+libkern/moddi3.c		optional	powerpc | powerpcspe
+libkern/qdivrem.c		optional	powerpc | powerpcspe
+libkern/ucmpdi2.c		optional	powerpc | powerpcspe
+libkern/udivdi3.c		optional	powerpc | powerpcspe
+libkern/umoddi3.c		optional	powerpc | powerpcspe
 powerpc/aim/locore.S		optional	aim no-obj
 powerpc/aim/aim_machdep.c	optional	aim
 powerpc/aim/mmu_oea.c		optional	aim powerpc
@@ -112,6 +112,7 @@ powerpc/booke/machdep_e500.c	optional	bo
 powerpc/booke/mp_cpudep.c	optional	booke smp
 powerpc/booke/platform_bare.c	optional	booke
 powerpc/booke/pmap.c		optional	booke
+powerpc/booke/spe.c		optional	powerpcspe
 powerpc/cpufreq/dfs.c		optional	cpufreq
 powerpc/cpufreq/pcr.c		optional	cpufreq aim
 powerpc/cpufreq/pmufreq.c	optional	cpufreq aim pmu
@@ -175,7 +176,7 @@ powerpc/powermac/smusat.c	optional	power
 powerpc/powermac/uninorth.c	optional	powermac
 powerpc/powermac/uninorthpci.c	optional	powermac pci
 powerpc/powermac/vcoregpio.c	optional	powermac 
-powerpc/powerpc/altivec.c	standard
+powerpc/powerpc/altivec.c	optional	powerpc | powerpc64
 powerpc/powerpc/autoconf.c	standard
 powerpc/powerpc/bcopy.c		standard
 powerpc/powerpc/bus_machdep.c	standard
@@ -189,7 +190,7 @@ powerpc/powerpc/db_hwwatch.c	optional	dd
 powerpc/powerpc/db_interface.c	optional	ddb
 powerpc/powerpc/db_trace.c	optional	ddb
 powerpc/powerpc/dump_machdep.c	standard
-powerpc/powerpc/elf32_machdep.c	optional	powerpc | compat_freebsd32
+powerpc/powerpc/elf32_machdep.c	optional	powerpc | powerpcspe | compat_freebsd32
 powerpc/powerpc/elf64_machdep.c	optional	powerpc64
 powerpc/powerpc/exec_machdep.c	standard
 powerpc/powerpc/fpu.c		standard
@@ -212,9 +213,9 @@ powerpc/powerpc/platform_if.m	standard
 powerpc/powerpc/ptrace_machdep.c	standard
 powerpc/powerpc/sc_machdep.c	optional	sc
 powerpc/powerpc/setjmp.S	standard
-powerpc/powerpc/sigcode32.S	optional	powerpc | compat_freebsd32
+powerpc/powerpc/sigcode32.S	optional	powerpc | powerpcspe | compat_freebsd32
 powerpc/powerpc/sigcode64.S	optional	powerpc64
-powerpc/powerpc/swtch32.S	optional	powerpc
+powerpc/powerpc/swtch32.S	optional	powerpc | powerpcspe
 powerpc/powerpc/swtch64.S	optional	powerpc64
 powerpc/powerpc/stack_machdep.c	optional	ddb | stack
 powerpc/powerpc/suswintr.c	standard

Modified: projects/powerpcspe/sys/conf/kern.mk
==============================================================================
--- projects/powerpcspe/sys/conf/kern.mk	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/sys/conf/kern.mk	Fri Mar 11 20:43:02 2016	(r296680)
@@ -149,6 +149,10 @@ CFLAGS.gcc+=	-msoft-float
 INLINE_LIMIT?=	15000
 .endif
 
+.if ${MACHINE_ARCH} == "powerpcspe"
+CFLAGS+=	-mno-spe
+.endif
+
 #
 # Use dot symbols on powerpc64 to make ddb happy
 #

Added: projects/powerpcspe/sys/conf/ldscript.powerpcspe
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/powerpcspe/sys/conf/ldscript.powerpcspe	Fri Mar 11 20:43:02 2016	(r296680)
@@ -0,0 +1,144 @@
+/* $FreeBSD: projects/powerpspe/sys/conf/ldscript.powerpc 277334 2015-01-18 18:32:43Z nwhitehorn $ */
+
+OUTPUT_FORMAT("elf32-powerpc-freebsd", "elf32-powerpc-freebsd",
+	      "elf32-powerpc-freebsd")
+OUTPUT_ARCH(powerpc)
+ENTRY(__start)
+SEARCH_DIR(/usr/lib);
+PROVIDE (__stack = 0);
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+
+  . = kernbase + SIZEOF_HEADERS;
+  PROVIDE (begin = . - SIZEOF_HEADERS);
+
+  .text      :
+  {
+    *(.text)
+    *(.stub)
+    /* .gnu.warning sections are handled specially by elf32.em.  */
+    *(.gnu.warning)
+    *(.gnu.linkonce.t*)
+  } =0
+  _etext = .;
+  PROVIDE (etext = .);
+
+  .interp     : { *(.interp) 	}
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rela.text     :
+    { *(.rela.text) *(.rela.gnu.linkonce.t*) }
+  .rela.data     :
+    { *(.rela.data) *(.rela.gnu.linkonce.d*) }
+  .rela.rodata   :
+    { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
+  .rela.got      : { *(.rela.got)		}
+  .rela.got1     : { *(.rela.got1)		}
+  .rela.got2     : { *(.rela.got2)		}
+  .rela.ctors    : { *(.rela.ctors)	}
+  .rela.dtors    : { *(.rela.dtors)	}
+  .rela.init     : { *(.rela.init)	}
+  .rela.fini     : { *(.rela.fini)	}
+  .rela.bss      : { *(.rela.bss)		}
+  .rela.plt      : { *(.rela.plt)		}
+  .rela.sdata    : { *(.rela.sdata)		}
+  .rela.sbss     : { *(.rela.sbss)		}
+  .rela.sdata2   : { *(.rela.sdata2)		}
+  .rela.sbss2    : { *(.rela.sbss2)		}
+
+  .init      : { *(.init)    } =0
+  .fini      : { *(.fini)    } =0
+  .rodata    : { *(.rodata) *(.gnu.linkonce.r*) }
+  .rodata1   : { *(.rodata1) }
+  .sdata2    : { *(.sdata2)  }
+  .sbss2     : { *(.sbss2)   }
+  /* Adjust the address for the data segment to the next page up. */
+  . = ((. + 0x1000) & ~(0x1000 - 1));
+  .data    :
+  {
+    *(.data)
+    *(.gnu.linkonce.d*)
+    CONSTRUCTORS
+  }
+  .data1   : { *(.data1) }
+  .got1           : { *(.got1) }
+  .dynamic        : { *(.dynamic) }
+  /* Put .ctors and .dtors next to the .got2 section, so that the pointers
+     get relocated with -mrelocatable. Also put in the .fixup pointers.
+     The current compiler no longer needs this, but keep it around for 2.7.2  */
+                PROVIDE (_GOT2_START_ = .);
+  .got2           :  { *(.got2) }
+                PROVIDE (__CTOR_LIST__ = .);
+  .ctors          : { *(.ctors) }
+                PROVIDE (__CTOR_END__ = .);
+                PROVIDE (__DTOR_LIST__ = .);
+  .dtors          : { *(.dtors) }
+                PROVIDE (__DTOR_END__ = .);
+                PROVIDE (_FIXUP_START_ = .);
+  .fixup          : { *(.fixup) }
+                PROVIDE (_FIXUP_END_ = .);
+                PROVIDE (_GOT2_END_ = .);
+                PROVIDE (_GOT_START_ = .);
+  .got            : { *(.got) }
+  .got.plt        : { *(.got.plt) }
+                PROVIDE (_GOT_END_ = .);
+  /* We want the small data sections together, so single-instruction offsets
+     can access them all, and initialized data all before uninitialized, so
+     we can shorten the on-disk segment size.  */
+  .sdata     : { *(.sdata) }
+  _edata  =  .;
+  PROVIDE (edata = .);
+  .sbss      :
+  {
+    PROVIDE (__sbss_start = .);
+    *(.sbss)
+    *(.scommon)
+    *(.dynsbss)
+    PROVIDE (__sbss_end = .);
+  }
+  .plt   : { *(.plt) }
+  .bss       :
+  {
+   PROVIDE (__bss_start = .);
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  _end = . ;
+  PROVIDE (end = .);
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* These must appear regardless of  .  */
+}
+

Modified: projects/powerpcspe/sys/conf/options.powerpc
==============================================================================
--- projects/powerpcspe/sys/conf/options.powerpc	Fri Mar 11 20:30:06 2016	(r296679)
+++ projects/powerpcspe/sys/conf/options.powerpc	Fri Mar 11 20:43:02 2016	(r296680)
@@ -9,6 +9,7 @@ CELL
 
 POWERPC
 POWERPC64
+POWERPCSPE
 
 FPU_EMU
 

Added: projects/powerpcspe/sys/powerpc/booke/spe.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/powerpcspe/sys/powerpc/booke/spe.c	Fri Mar 11 20:43:02 2016	(r296680)
@@ -0,0 +1,183 @@
+/*-
+ * Copyright (C) 1996 Wolfgang Solfrank.
+ * Copyright (C) 1996 TooLs GmbH.
+ * All rights reserved.

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



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