[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[no subject]



Submitter-Id:	net
Originator:	Pierre Lombard
Synopsis:	wrongcode when optimizing mmx asm inline
Severity:	serious
Priority:	medium
Confidential:	no
Category:	optimization
Class:		wrong-code
Release:	3.0.3 (Debian testing/unstable)
Environment:
System: Linux s41 2.4.17 #2 SMP Sat Dec 29 12:34:41 CET 2001 i686 unknown
Architecture: i686

	<machine, os, target, libraries (multiple lines)>
host: i386-pc-linux-gnu
build: i386-pc-linux-gnu
target: i386-pc-linux-gnu
configured with: ../src/configure -v --enable-languages=c,c++,java,f77,proto,objc --prefix=/usr --infodir=/share/info --mandir=/share/man --enable-shared --with-gnu-as --with-gnu-ld --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --enable-threads=posix --enable-java-gc=boehm --with-cpp-install-dir=bin --enable-objc-gc i386-linux

Description:

I had already filed a bug report in July 2001 but there was neither follow-up
nor reply.  It's archived here:
  http://gcc.gnu.org/ml/gcc-bugs/2001-07/msg00910.html.

	With -O0 (correct code - ok with -O1 too):
...
        .section        .rodata
        .align 8
        .type   mm_wabs,@object
        .size   mm_wabs,8
mm_wabs:
        .value  65535
        .value  65535
        .value  65535
        .value  65535
        .align 8
        .type   mm_wone,@object
        .size   mm_wone,8
mm_wone:
        .value  1
        .value  1
        .value  1
        .value  1
        .text
        .align 4
        .type   dct_unquantize,@function
...
#APP
        movd    20(%ebp), %mm6
        punpckldq %mm6, %mm6
        movq    mm_wabs, %mm4			//XXX
        movq    %mm6, %mm7
        movq    mm_wone, %mm5			//XXX
        packssdw %mm6, %mm7
        pxor    %mm6, %mm6

        .p2align 2
#NO_APP
...


	With -O2 (and above => the same problem appears):

.Lfe6:
        .size   draw_edges,.Lfe6-draw_edges
        .section        .rodata
        .align 8
        .type   mm_wabs,@object
        .size   mm_wabs,8
mm_wabs:
        .value  65535
        .value  65535
        .value  65535
        .value  65535
        .align 8
        .type   mm_wone,@object
        .size   mm_wone,8
mm_wone:
        .value  1
        .value  1
        .value  1
        .value  1
        .align 2
.LC113:
        .value  1
        .align 2
.LC114:
        .value  65535
        .text
        .align 4
        .type   dct_unquantize,@function
...
#APP
        movd    %edi, %mm6
        punpckldq %mm6, %mm6
        movq    .LC114, %mm4			// XXX
        movq    %mm6, %mm7
        movq    .LC113, %mm5			// XXX
        packssdw %mm6, %mm7
        pxor    %mm6, %mm6

#NO_APP
...

I still think mm4 and mm5 are not initialized to the same values -O0 and -O2
with 3.0.3.  Can somebody confirm it's a bug (or explain me why it is not) ?

How-To-Repeat:
Just compile it with: gcc-3.0 -O[02] -S mpegvideo.i

The preprocesses file has already been uploaded:
	http://gcc.gnu.org/ml/gcc-bugs/2001-07/msg00910/mpegvideo.i.gz

Fix:
A workaround is to use a 64bits unsigned long long.
Another one is to compile with -O0.



Reply to: