This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/22076] New: Strange code for MMX register moves
- From: "uros at kss-loka dot si" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 Jun 2005 12:39:56 -0000
- Subject: [Bug target/22076] New: Strange code for MMX register moves
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
This testcase:
#include <mmintrin.h>
__m64 test() {
__m64 a;
return a;
}
results in quite strange code when compiled with '-O2 -mmmx':
test:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl %eax, -8(%ebp) <<<<
movl %edx, -4(%ebp) <<<<
movq -8(%ebp), %mm0
leave
ret
If xmm registers are used (change __m64 into __m128), asm code is OK.
It looks there are some problems with register costs, from _.22.lreg:
Pass 0
Register 58 costs: AD_REGS:13000 Q_REGS:13000 NON_Q_REGS:13000
INDEX_REGS:13000 LEGACY_REGS:13000 GENERAL_REGS:13000 MMX_REGS:24000
FLOAT_INT_REGS:30000 INT_SSE_REGS:30000 FLOAT_INT_SSE_REGS:30000 ALL_REGS:30000
MEM:20000
Register 58 pref GENERAL_REGS or none
Pass 1
Register 58 costs: AD_REGS:13000 Q_REGS:13000 NON_Q_REGS:13000
INDEX_REGS:13000 LEGACY_REGS:13000 GENERAL_REGS:13000 MMX_REGS:24000
FLOAT_INT_REGS:30000 INT_SSE_REGS:30000 FLOAT_INT_SSE_REGS:30000 ALL_REGS:30000
MEM:20000
...
(insn:HI 16 28 22 1 (set (reg/i:V2SI 29 mm0 [ <result> ])
(reg/v:V2SI 58 [ a ])) 768 {*movv2si_internal} (nil)
(expr_list:REG_DEAD (reg/v:V2SI 58 [ a ])
(nil)))
...
The instructions, marked with '<<<<' are then produced by reload.
--
Summary: Strange code for MMX register moves
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Keywords: ssemmx
Severity: normal
Priority: P2
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: uros at kss-loka dot si
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22076