Module Name:    src
Committed By:   chs
Date:           Mon Feb 27 06:57:16 UTC 2017

Modified Files:
        src/sys/arch/mips/include: fenv.h

Log Message:
fix fesetround() to set the FPSR to the desired value rather than
a pointer to a local variable.  wrap the asm in inline functions so that
the compiler can do type checking for us.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/mips/include/fenv.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/include/fenv.h
diff -u src/sys/arch/mips/include/fenv.h:1.2 src/sys/arch/mips/include/fenv.h:1.3
--- src/sys/arch/mips/include/fenv.h:1.2	Fri Jan 13 19:10:14 2017
+++ src/sys/arch/mips/include/fenv.h	Mon Feb 27 06:57:16 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: fenv.h,v 1.2 2017/01/13 19:10:14 christos Exp $	*/
+/*	$NetBSD: fenv.h,v 1.3 2017/02/27 06:57:16 chs Exp $	*/
 
 /*-
  * Copyright (c) 2004-2005 David Schultz <d...@freebsd.org>
@@ -67,9 +67,21 @@ extern const fenv_t	__fe_dfl_env;
 #define	_ENABLE_MASK	(FE_ALL_EXCEPT << _ENABLE_SHIFT)
 #define _ENABLE_SHIFT    5
 
+static inline fpu_control_t
+__rfs(void)
+{
+	fpu_control_t __fpsr;
+
+	__asm __volatile("cfc1 %0,$31" : "=r" (__fpsr));
+	return __fpsr;
+}
 
-#define	__rfs(__fpsr)	__asm __volatile("cfc1 %0,$31" : "=r" ((*__fpsr)))
-#define	__wfs(__fpsr)	__asm __volatile("ctc1 %0,$31" : : "r" (__fpsr))
+static inline void
+__wfs(fpu_control_t __fpsr)
+{
+
+	__asm __volatile("ctc1 %0,$31" : : "r" (__fpsr));
+}
 
 __fenv_static inline int
 feclearexcept(int __excepts)
@@ -77,7 +89,7 @@ feclearexcept(int __excepts)
 	fexcept_t __fpsr;
 
 	__excepts &= FE_ALL_EXCEPT;
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	__fpsr &= ~(__excepts | (__excepts << _ENABLE_SHIFT));
 	__wfs(__fpsr);
 	return 0;
@@ -88,7 +100,7 @@ fegetexceptflag(fexcept_t *__flagp, int 
 {
 	fexcept_t __fpsr;
 
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	*__flagp = __fpsr & __excepts;
 	return (0);
 }
@@ -98,7 +110,7 @@ fesetexceptflag(const fexcept_t *__flagp
 {
 	fexcept_t __fpsr;
 
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	__fpsr &= ~__excepts;
 	__fpsr |= *__flagp & __excepts;
 	__wfs(__fpsr);
@@ -119,7 +131,7 @@ fetestexcept(int __excepts)
 {
 	fexcept_t __fpsr;
 
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	return (__fpsr & __excepts);
 }
 
@@ -128,7 +140,7 @@ fegetround(void)
 {
 	fexcept_t __fpsr;
 
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	return __fpsr & _ROUND_MASK;
 }
 
@@ -139,10 +151,10 @@ fesetround(int __round)
 
 	if (__round & ~_ROUND_MASK)
 		return 1;
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	__fpsr &= ~_ROUND_MASK;
 	__fpsr |= __round;
-	__wfs(&__fpsr);
+	__wfs(__fpsr);
 
 	return 0;
 }
@@ -151,7 +163,7 @@ __fenv_static inline int
 fegetenv(fenv_t *__envp)
 {
 
-	__rfs(__envp);
+	*__envp = __rfs();
 	return (0);
 }
 
@@ -160,7 +172,7 @@ feholdexcept(fenv_t *__envp)
 {
 	fenv_t __env;
 
-	__rfs(&__env);
+	__env = __rfs();
 	*__envp = __env;
 	__env &= ~(FE_ALL_EXCEPT | _ENABLE_MASK);
 	__wfs(__env);
@@ -180,7 +192,7 @@ feupdateenv(const fenv_t *__envp)
 {
 	fexcept_t __fpsr;
 
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	__wfs(*__envp);
 	feraiseexcept(__fpsr & FE_ALL_EXCEPT);
 	return (0);
@@ -195,7 +207,7 @@ feenableexcept(int __excepts)
 {
 	fenv_t __old_fpsr, __new_fpsr;
 
-	__rfs(&__new_fpsr);
+	__new_fpsr = __rfs();
 	__old_fpsr = (__new_fpsr & _ENABLE_MASK) >> _ENABLE_SHIFT;
 	__excepts &= FE_ALL_EXCEPT;
 	__new_fpsr |= __excepts << _ENABLE_SHIFT;
@@ -208,7 +220,7 @@ fedisableexcept(int __excepts)
 {
 	fenv_t __old_fpsr, __new_fpsr;
 
-	__rfs(&__new_fpsr);
+	__new_fpsr = __rfs();
 	__old_fpsr = (__new_fpsr & _ENABLE_MASK) >> _ENABLE_SHIFT;
 	__excepts &= FE_ALL_EXCEPT;
 	__new_fpsr &= ~(__excepts << _ENABLE_SHIFT);
@@ -221,7 +233,7 @@ fegetexcept(void)
 {
 	fenv_t __fpsr;
 
-	__rfs(&__fpsr);
+	__fpsr = __rfs();
 	return ((__fpsr & _ENABLE_MASK) >> _ENABLE_SHIFT);
 }
 

Reply via email to