<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>