svn commit: r336688 - in head: lib/libc/powerpcspe/gen sys/powerpc/include

Justin Hibbits jhibbits at FreeBSD.org
Tue Jul 24 22:04:57 UTC 2018


Author: jhibbits
Date: Tue Jul 24 22:04:56 2018
New Revision: 336688
URL: https://svnweb.freebsd.org/changeset/base/336688

Log:
  Fix floating point exception definitions for powerpcspe
  
  These were incorrectly implemented in the original port.

Modified:
  head/lib/libc/powerpcspe/gen/fpgetmask.c
  head/lib/libc/powerpcspe/gen/fpsetmask.c
  head/sys/powerpc/include/ieeefp.h

Modified: head/lib/libc/powerpcspe/gen/fpgetmask.c
==============================================================================
--- head/lib/libc/powerpcspe/gen/fpgetmask.c	Tue Jul 24 21:10:17 2018	(r336687)
+++ head/lib/libc/powerpcspe/gen/fpgetmask.c	Tue Jul 24 22:04:56 2018	(r336688)
@@ -44,6 +44,6 @@ fpgetmask()
 	uint32_t fpscr;
 
 	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
-	return ((fp_except_t)((fpscr >> 3) & 0x1f));
+	return ((fp_except_t)((fpscr >> 2) & 0x1f));
 }
 #endif

Modified: head/lib/libc/powerpcspe/gen/fpsetmask.c
==============================================================================
--- head/lib/libc/powerpcspe/gen/fpsetmask.c	Tue Jul 24 21:10:17 2018	(r336687)
+++ head/lib/libc/powerpcspe/gen/fpsetmask.c	Tue Jul 24 22:04:56 2018	(r336688)
@@ -45,8 +45,8 @@ fpsetmask(fp_except_t mask)
 	fp_rnd_t old;
 
 	__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
-	old = (fp_rnd_t)((fpscr >> 3) & 0x1f);
-	fpscr = (fpscr & 0xffffff07) | (mask << 3);
+	old = (fp_rnd_t)((fpscr >> 2) & 0x1f);
+	fpscr = (fpscr & 0xffffff83) | (mask << 2);
 	__asm__ __volatile("mtspr %1,%0" :: "r"(fpscr), "K"(SPR_SPEFSCR));
 	return (old);
 }

Modified: head/sys/powerpc/include/ieeefp.h
==============================================================================
--- head/sys/powerpc/include/ieeefp.h	Tue Jul 24 21:10:17 2018	(r336687)
+++ head/sys/powerpc/include/ieeefp.h	Tue Jul 24 22:04:56 2018	(r336688)
@@ -11,11 +11,19 @@
 /* Deprecated historical FPU control interface */
 
 typedef int fp_except_t;
+#ifdef __SPE__
+#define FP_X_OFL	0x01	/* overflow exception */
+#define FP_X_UFL	0x02	/* underflow exception */
+#define FP_X_DZ		0x04	/* divide-by-zero exception */
+#define FP_X_INV	0x08	/* invalid operation exception */
+#define FP_X_IMP	0x10	/* imprecise (loss of precision) */
+#else
 #define FP_X_IMP	0x01	/* imprecise (loss of precision) */
 #define FP_X_DZ		0x02	/* divide-by-zero exception */
 #define FP_X_UFL	0x04	/* underflow exception */
 #define FP_X_OFL	0x08	/* overflow exception */
 #define FP_X_INV	0x10	/* invalid operation exception */
+#endif
 
 typedef enum {
     FP_RN=0,			/* round to nearest representable number */


More information about the svn-src-head mailing list