[flac-dev] PATCH for cpu.c

lvqcl lvqcl.mail at gmail.com
Fri Mar 21 12:00:38 PDT 2014

Explanation of changes in this patch:

'CALLBACK' was changed to 'WINAPI' because the signature of
an unhandled exception filter is
LONG (WINAPI *unhandled_func)(struct _EXCEPTION_POINTERS);

The code

     if(info->ia32.fxsr || info->ia32.sse || info->ia32.sse2) {

was replaced by

     if(info->ia32.sse) {
         info->ia32.fxsr = info->ia32.sse = [...] = false;

Reason: there's no point to test OS SSE support if SSE (SSE1) is not supported
by CPU. Also the detection code tries to execute SSE1 instruction xorps;
it doesn't make sense if SSE1 isn't supported (i.e. info->ia32.sse==false).
If info->ia32.sse is true then both old and new conditions are true.
The 'else' branch isn't necessary but I wanted to play safe.

"=r"(sse):"r"(sse) asm constraint was changed to "=r"(sse):"0"(sse).

 From http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html :
"Only a number in the constraint can guarantee that one operand is in
the same place as another. The mere fact that foo is the value of both
operands is not enough to guarantee that they are in the same place in
the generated assembler code."

This fix makes "xorl %0,%0" unnecessary.

A comment about SetUnhandledExceptionFilter was added.

URL fixes: http://www.hick.org/~mmiller/msvc_inline_asm.html doesn't exist
any more, http://www.codeproject.com/cpp/gccasm.asp now has different address.

"if (info->ia32.fxsr && info->ia32.sse)" was changed to "if (info->ia32.fxsr)"
because now info->ia32.sse is always true in this block.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cpu_c.patch
Type: application/octet-stream
Size: 3857 bytes
Desc: not available
Url : http://lists.xiph.org/pipermail/flac-dev/attachments/20140321/c8ae4722/attachment.obj 

More information about the flac-dev mailing list