Patchwork [2/4] math-emu: Adopt new version of _FP_CHOOSENAN

login
register
mail settings
Submitter Liu Yu-B13201
Date Oct. 28, 2008, 3:50 a.m.
Message ID <1225165821-15998-3-git-send-email-yu.liu@freescale.com>
Download mbox | patch
Permalink /patch/6018/
State Accepted
Commit 463a8c01e153c06480b862d83d6a71bf5666a577
Delegated to: Kumar Gala
Headers show

Comments

Liu Yu-B13201 - Oct. 28, 2008, 3:50 a.m.
Move to using the same macro definition for _FP_CHOOSENAN as s390,  
sh, sparc32/64.  The original author didn't understand this and  
matched what sparc64 was doing and they have updated to this definition.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
---
 arch/powerpc/include/asm/sfp-machine.h |   26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)
Kumar Gala - Nov. 6, 2008, 4:05 a.m.
On Oct 27, 2008, at 10:50 PM, Liu Yu wrote:

> Move to using the same macro definition for _FP_CHOOSENAN as s390,
> sh, sparc32/64.  The original author didn't understand this and
> matched what sparc64 was doing and they have updated to this  
> definition.
>
> Signed-off-by: Liu Yu <yu.liu@freescale.com>
> ---
> arch/powerpc/include/asm/sfp-machine.h |   26 ++++++++++++++++ 
> +---------
> 1 files changed, 17 insertions(+), 9 deletions(-)


applied to next.

- k

Patch

diff --git a/arch/powerpc/include/asm/sfp-machine.h b/arch/powerpc/include/asm/sfp-machine.h
index da12ea7..88af036 100644
--- a/arch/powerpc/include/asm/sfp-machine.h
+++ b/arch/powerpc/include/asm/sfp-machine.h
@@ -111,16 +111,24 @@ 
 #define FP_EX_DIVZERO         (1 << (31 - 5))
 #define FP_EX_INEXACT         (1 << (31 - 6))
 
-/* This macro appears to be called when both X and Y are NaNs, and
- * has to choose one and copy it to R. i386 goes for the larger of the
- * two, sparc64 just picks Y. I don't understand this at all so I'll
- * go with sparc64 because it's shorter :->   -- PMM
+/*
+ * If one NaN is signaling and the other is not,
+ * we choose that one, otherwise we choose X.
  */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)		\
-  do {							\
-    R##_s = Y##_s;					\
-    _FP_FRAC_COPY_##wc(R,Y);				\
-    R##_c = FP_CLS_NAN;					\
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)			\
+  do {								\
+    if ((_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)		\
+	&& !(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))	\
+      {								\
+	R##_s = X##_s;						\
+	_FP_FRAC_COPY_##wc(R,X);				\
+      }								\
+    else							\
+      {								\
+	R##_s = Y##_s;						\
+	_FP_FRAC_COPY_##wc(R,Y);				\
+      }								\
+    R##_c = FP_CLS_NAN;						\
   } while (0)