<html>
    <head>
      <base href="https://bugs.freedesktop.org/" />
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [llvmpipe] SEGV in sse2_has_daz on ancient Pentium4-M"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=87658#c11">Comment # 11</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [llvmpipe] SEGV in sse2_has_daz on ancient Pentium4-M"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=87658">bug 87658</a>
              from <span class="vcard"><a class="email" href="mailto:ubizjak@gmail.com" title="ubizjak@gmail.com">ubizjak@gmail.com</a>
</span></b>
        <pre>(In reply to David Heidelberg (okias) from <a href="show_bug.cgi?id=87658#c9">comment #9</a>)
<span class="quote">> I'd say it's kernel (more probably) or gcc bug.</span >

Nope. You have to check FXSAVE bit in cpuid.

<span class="quote">> 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] <a href="http://lkml.iu.edu/hypermail/linux/kernel/0807.3/0474.html">http://lkml.iu.edu/hypermail/linux/kernel/0807.3/0474.html</a>

> Otherwise, I think I'm out of ideas, maybe someone more experienced could
> help :)</span >

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--</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>