Mesa (master): gallivm: clear Altivec NJ bit

Jose Fonseca jrfonseca at kemper.freedesktop.org
Thu Nov 29 11:54:46 UTC 2012


Module: Mesa
Branch: master
Commit: 29ba79b2c929ea23b45fa065fe7c9f8fd400210c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=29ba79b2c929ea23b45fa065fe7c9f8fd400210c

Author: Adhemerval Zanella <azanella at linux.vnet.ibm.com>
Date:   Thu Nov 22 11:55:35 2012 -0600

gallivm: clear Altivec NJ bit

This patch enforces the clear of NJ bit in VSCR Altivec register so
denormal numbers are handles as expected by IEEE standards.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>

---

 src/gallium/auxiliary/gallivm/lp_bld_init.c |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c
index 0065bb4..050eba7 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_init.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c
@@ -468,6 +468,25 @@ lp_build_init(void)
       util_cpu_caps.has_avx = 0;
    }
 
+#ifdef PIPE_ARCH_PPC_64
+   /* Set the NJ bit in VSCR to 0 so denormalized values are handled as
+    * specified by IEEE standard (PowerISA 2.06 - Section 6.3). This garantees
+    * that some rounding and half-float to float handling does not round
+    * incorrectly to 0.
+    */
+   if (util_cpu_caps.has_altivec) {
+      unsigned short mask[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+                                0xFFFF, 0xFFFF, 0xFFFE, 0xFFFF };
+      __asm (
+        "mfvscr %%v1\n"
+        "vand   %0,%%v1,%0\n"
+        "mtvscr %0"
+        :
+        : "r" (*mask)
+      );
+   }
+#endif
+
    gallivm_initialized = TRUE;
 
 #if 0




More information about the mesa-commit mailing list