http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47617
--- Comment #8 from cck0011 at yahoo dot com 2011-02-09 02:08:23 UTC --- Hi folks, First, thanks for working on this. Second, I read the link and I _think_ I understand it. Let me paraphrase it back to you and you can tell me if I've got the point: There is an optimizer that extracts common expressions and evaluates them once instead of every time they occur. (What's the name of that so I can call it by the right name?) In my code it finds the expression: dest = _mm_cvtps_pi16(source); Several times. Since it doesn't see source changing, this expression only gets evaluated once. Now, the change to rounding mode that happens with _MM_SET_ROUNDING_MODE(...) isn't detected as something that would change the value of the _mm_cvtps_pi16(...) expression, so the optimization is not removed. Recognizing that change to rounding mode and reacting to it is what's at the heart of bug 34678, and that's why this is a duplicate. The work-arounds are: 1)insert 'asm("":"+X"(source));' before changing rounding mode to make the compiler re-evaluate expressions that use source. 2) do _MM_SET_ROUNDING_MODE(...) before any divisions or integer conversions that might get optimized out. The scope of the optimization is a function body and any inlined code. So do _MM_SET_ROUNDING_MODE early within that scope. Is my understanding correct? A few more questions: Will this bug exist on non-X86 processors? What does the 'asm("":"+X"(source));' expression do ? Will this syntax work for non-X86 processors? To be correct, should I compile with -frounding-math ? Thanks!