10077 – gcc -msse2 generates movd to move dwords between xmm regs (original) (raw)

The bug appears when I compile a function with many variables. GCC then uses xmm registers as 32-bit scalar integer registers.

When it has to move data with an xmm register involved, it generates a movd instruction, which doesn't work (movss might work better). Although there is sse2 assembly in my code, I don't think it comes from there.

The assembler used is GNU assembler version 2.11.92.0.10 (i486-suse-linux) using BFD version 2.11.92.0.10 20011021 (SuSE)

Notes added by Andreas Jaeger: This bug can also be reproduced with GCC 3.3 from 20030313 (just verified). The produced code contains then: movd %xmm7, %xmm3 which is invalid.

This bug seems to be fixed in GCC 3.4.

Release: gcc 3.2.2 on x86

Environment: Linux 2.4.18

How-To-Repeat: Compile the code with

gcc -c gcc_bug.i -msse2 -O3

Comment 1 douze 2003-03-14 08:16:00 UTC

Fix: replace movd with movss in the .s file

Comment 2 Andreas Jaeger 2003-03-14 10:31:02 UTC

From: Andreas Jaeger <aj@suse.de> To: douze@enseeiht.fr Cc: gcc-gnats@gcc.gnu.org Subject: Re: target/10077: gcc -msse2 generates movd to move dwords between xmm regs Date: Fri, 14 Mar 2003 10:31:02 +0100

douze@enseeiht.fr writes: >>Number: 10077 >>Category: target >>Synopsis: gcc -msse2 generates movd to move dwords between xmm regs >>Confidential: no >>Severity: critical >>Priority: medium >>Responsible: unassigned >>State: open >>Class: sw-bug >>Submitter-Id: net >>Arrival-Date: Fri Mar 14 08:16:00 UTC 2003 >>Closed-Date: >>Last-Modified: >>Originator: douze@enseeiht.fr >>Release: gcc 3.2.2 on x86 >>Organization: >>Environment: > Linux 2.4.18 >>Description: > The bug appears when I compile a function with many variables. GCC then uses xmm registers as 32-bit scalar integer registers. > > When it has to move data with an xmm register involved, it generates a movd instruction, which doesn't work (movss might work better). Although there is sse2 assembly in my code, I don't think it comes from there. > > The assembler used is GNU assembler version 2.11.92.0.10 (i486-suse-linux) using BFD version 2.11.92.0.10 20011021 (SuSE) >>How-To-Repeat: > Compile the code with > > gcc -c gcc_bug.i -msse2 -O3 >>Fix: > replace movd with movss in the .s file Which instruction is generated in this case? I only see one movd generated (with not exactly the same compiler) and that one looks fine to me (and might even come from your inline assembler). Please tell us a bit more why the generated code is wrong, Andreas

Andreas Jaeger SuSE Labs aj@suse.de private aj@arthur.inka.de http://www.suse.de/~aj

Comment 3 Andreas Jaeger 2003-03-14 12:05:46 UTC

Responsible-Changed-From-To: unassigned->hubicka Responsible-Changed-Why: SSE2 expert ;-)

Comment 4 Wolfgang Bangerth 2003-03-14 15:12:08 UTC

State-Changed-From-To: open->analyzed State-Changed-Why: I can confirm this: it leads to an assembler error with 3.2.2 and 3.3, but not with 3.4:

g/x> /home/bangerth/bin/gcc-3.3-pre/bin/gcc -c gcc_bug.i -msse2 -O3
/tmp/ccn5g6XV.s: Assembler messages:
/tmp/ccn5g6XV.s:127: Error: suffix or operands invalid for `movd'

I leave it to others to find out where this problem comes
from. Since mainline compiles and assembles this file
just fine, this seems indeed like a problem in the compiler.

The instruction in question is this one:
    movd	%xmm7, %xmm3

W.

Comment 7 Jan Hubicka 2003-04-14 14:13:38 UTC

State-Changed-From-To: analyzed->closed State-Changed-Why: Fixed.