------- Additional Comments From uros at kss-loka dot si 2004-11-17 09:17 ------- The problem was that "sse_movss" pattern has wrong vec_merge constant, so it was wrongly combined to "vmsubv4sf3" pattern. Instead of 0x1, "sse_movss" pattern should have 0x14:
(define_insn "sse_movss" [(set (match_operand:V4SF 0 "register_operand" "=x") (vec_merge:V4SF (match_operand:V4SF 1 "register_operand" "0") (match_operand:V4SF 2 "register_operand" "x") (const_int 14)))] <- here! "TARGET_SSE" "movss\t{%2, %0|%0, %2}" [(set_attr "type" "ssemov") (set_attr "mode" "SF")]) With this change, the result from your testcase is OK. ASM code looks like: bug: movaps %xmm0, %xmm2 subps %xmm1, %xmm2 pushl %ebp movl %esp, %ebp movaps %xmm2, %xmm1 movss %xmm0, %xmm1 popl %ebp movaps %xmm1, %xmm0 ret BTW: "sse2_movsd" pattern has the same problem... And "sse_loadss_1", "sse_storess" and their sse2 equivalents. Bug is confirmed, a patch will follow soon... Thanks, Uros. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18503