[Mesa-dev] [Bug 87658] [llvmpipe] SEGV in sse2_has_daz on ancient Pentium4-M

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Sun Dec 28 07:25:54 PST 2014


https://bugs.freedesktop.org/show_bug.cgi?id=87658

--- Comment #11 from ubizjak at gmail.com ---
(In reply to David Heidelberg (okias) from comment #9)
> I'd say it's kernel (more probably) or gcc bug.

Nope. You have to check FXSAVE bit in cpuid.

> For gcc, try 4.7.x and/or 4.9.x if you can.
> 
> For kernel, I think it may be(?) related to [1]- > Paranoid restore. send a
> SIGSEGV if we fail to restore the state.
> 
> [1] http://lkml.iu.edu/hypermail/linux/kernel/0807.3/0474.html
> 
> Otherwise, I think I'm out of ideas, maybe someone more experienced could
> help :)

This is how gcc sets FTZ and DAZ for -ffast-math. Please see how to check for
DAZ, and don't forget ((force_align_arg_pointer)) attribute.

--cut here--
#define MXCSR_DAZ (1 << 6)    /* Enable denormals are zero mode */
#define MXCSR_FTZ (1 << 15)    /* Enable flush to zero mode */

#ifndef __x86_64__
/* All 64-bit targets have SSE and DAZ;
   only check them explicitly for 32-bit ones. */
#include "cpuid.h"
#endif

static void __attribute__((constructor))
#ifndef __x86_64__
/* The i386 ABI only requires 4-byte stack alignment, so this is necessary
   to make sure the fxsave struct gets correct alignment.
   See PR27537 and PR28621.  */
__attribute__ ((force_align_arg_pointer))
#endif
set_fast_math (void)
{
#ifndef __x86_64__
  unsigned int eax, ebx, ecx, edx;

  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
    return;

  if (edx & bit_SSE)
    {
      unsigned int mxcsr;

      if (edx & bit_FXSAVE)
    {
      /* Check if DAZ is available.  */
      struct
        {
          unsigned short cwd;
          unsigned short swd;
          unsigned short twd;
          unsigned short fop;
          unsigned int fip;
          unsigned int fcs;
          unsigned int foo;
          unsigned int fos;
          unsigned int mxcsr;
          unsigned int mxcsr_mask;
          unsigned int st_space[32];
          unsigned int xmm_space[32];
          unsigned int padding[56];
        } __attribute__ ((aligned (16))) fxsave;

      /* This is necessary since some implementations of FXSAVE
         do not modify reserved areas within the image.  */
      fxsave.mxcsr_mask = 0;

      __builtin_ia32_fxsave (&fxsave);

      mxcsr = fxsave.mxcsr;

      if (fxsave.mxcsr_mask & MXCSR_DAZ)
        mxcsr |= MXCSR_DAZ;
    }
      else
    mxcsr = __builtin_ia32_stmxcsr ();

      mxcsr |= MXCSR_FTZ;
      __builtin_ia32_ldmxcsr (mxcsr);
    }
#else
  unsigned int mxcsr = __builtin_ia32_stmxcsr ();
  mxcsr |= MXCSR_DAZ | MXCSR_FTZ;
  __builtin_ia32_ldmxcsr (mxcsr);
#endif
}
--cut here--

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141228/9a254242/attachment.html>


More information about the mesa-dev mailing list