http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46716
Uros Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|[4.4/4.5/4.6/4.7/4.8 |[4.4/4.5/4.6/4.7 |Regression] wrong code |Regression] wrong code |generated with -mno-sse2 |generated with -mno-sse2 |-m64 |-m64 --- Comment #8 from Uros Bizjak <ubizjak at gmail dot com> 2012-03-02 14:35:24 UTC --- This is just a matter of always forcing the "natural" mode for the register, even when type system does not agree with this. See the comment for gen_reg_or_parallel on this issue. I am testing following patch: Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 184774) +++ config/i386/i386.c (working copy) @@ -6338,15 +6338,16 @@ construct_container (enum machine_mode mode, enum } if (n == 2 && regclass[0] == X86_64_SSE_CLASS && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode) - return gen_rtx_REG (mode, SSE_REGNO (sse_regno)); + return gen_reg_or_parallel (mode, orig_mode, + SSE_REGNO (sse_regno)); if (n == 4 && regclass[0] == X86_64_SSE_CLASS && regclass[1] == X86_64_SSEUP_CLASS && regclass[2] == X86_64_SSEUP_CLASS && regclass[3] == X86_64_SSEUP_CLASS && mode != BLKmode) - return gen_rtx_REG (mode, SSE_REGNO (sse_regno)); - + return gen_reg_or_parallel (mode, orig_mode, + SSE_REGNO (sse_regno)); if (n == 2 && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS) return gen_rtx_REG (XFmode, FIRST_STACK_REG);