From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28599 invoked by alias); 23 Aug 2006 21:23:03 -0000 Received: (qmail 28546 invoked by uid 48); 23 Aug 2006 21:22:55 -0000 Date: Wed, 23 Aug 2006 21:23:00 -0000 Subject: [Bug target/28825] New: return (vector float) { a, a, b, b } generates unwanted MMX insns Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "stuart at apple dot com" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2006-08/txt/msg01969.txt.bz2 List-Id: X-Bugzilla-Reason: CC +++ This bug was initially created as a clone of Bug #24073 +++ Take the following example: #define vector __attribute__((vector_size(16))) float a; float b; vector float f(void) { return (vector float){ a, b, 0.0, 0.0}; } --- Currently we get: subl $12, %esp movss _b, %xmm0 movss _a, %xmm1 unpcklps %xmm0, %xmm1 movaps %xmm1, %xmm0 xorl %eax, %eax xorl %edx, %edx movl %eax, (%esp) movl %edx, 4(%esp) xorps %xmm1, %xmm1 movlhps %xmm1, %xmm0 addl $12, %esp ------ We should be able to produce: movss _b, %xmm0 movss _a, %xmm1 shufps 60, /*[0, 3, 3, 0]*/, %xmm1, %xmm0 // _a, 0, 0, _b shufps 201, /*[3, 0, 2, 1]*/, %xmm0, %xmm0 // _a, _b, 0, 0 This is from Nathan Begeman. ================================================================ ------- Comment #4 From Uros Bizjak 2005-09-27 11:41 ------- I think that following example wins the contest: vector float f(void) { return (vector float){ a, a, b, b}; } gcc -O2 -msse -fomit-frame-pointer subl $28, %esp movss a, %xmm0 movss %xmm0, 4(%esp) movss b, %xmm0 movd 4(%esp), %mm0 punpckldq %mm0, %mm0 movss %xmm0, 4(%esp) movq %mm0, 16(%esp) movd 4(%esp), %mm0 punpckldq %mm0, %mm0 movq %mm0, 8(%esp) movlps 16(%esp), %xmm1 movhps 8(%esp), %xmm1 addl $28, %esp movaps %xmm1, %xmm0 ret Note the usage of MMX registers. ------- Comment #5 From Andrew Pinski 2005-09-27 14:33 ------- (In reply to comment #4) > I think that following example wins the contest: > > vector float f(void) { return (vector float){ a, a, b, b}; } For this, it is a different bug. The issue with the above is that ix86_expand_vector_init_duplicate check for mmx_okay is bad. Currently, we have if (!mmx_ok && !TARGET_SSE) but I if I change it to: if (!mmx_ok) we get: movss _a, %xmm0 movss _b, %xmm1 unpcklps %xmm0, %xmm0 unpcklps %xmm1, %xmm1 movlhps %xmm1, %xmm0 Which looks ok to me. That testcase should be opened into another bug as it is obviously wrong. ===================================================================== Cloned from 24073 to track the MMX insn issue; the original 24073 problem is a performance issue. -- Summary: return (vector float) { a, a, b, b } generates unwanted MMX insns Product: gcc Version: 4.2.0 Status: UNCONFIRMED Severity: minor Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: stuart at apple dot com GCC target triplet: i786-*-* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28825