[Bug target/19026] New: a^=b; b^=a; a^=b; produce bad i386 assembly code with O1 and O2 (%sil being used)

k_guillaume at libertysurf dot fr gcc-bugzilla@gcc.gnu.org
Thu Dec 16 00:03:00 GMT 2004


gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3) and other versions
( gcc (GCC) 3.4.3 (Mandrakelinux 10.2 3.4.3-1mdk)
  gcc (GCC) 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)
  gcc-3.4 debian sid )

generate invalid i386 assembly code involving some amd64 8 bits registers when
compiling the following code :

#include <stdio.h>

int main( int nb, char *argv[] )
{
unsigned char a = nb, b = nb + 1;

printf("%d %d\n", a, b);
a ^= b; b ^= a; a ^= b;
printf("%d %d\n", a, b);

return 0;
}

[xilun@box ~]$ gcc -march=i386 -O2 -o test test.c 
/tmp/ccmWc5X6.s: Assembler messages:
/tmp/ccmWc5X6.s:24: Error: bad register name `%sil'
[xilun@box ~]$ gcc -march=i486 -O2 -o test test.c 
/tmp/cccvo0qG.s: Assembler messages:
/tmp/cccvo0qG.s:26: Error: bad register name `%sil'
[xilun@box ~]$ gcc -march=i586 -O2 -o test test.c 
/tmp/ccnZhGXe.s: Assembler messages:
/tmp/ccnZhGXe.s:24: Error: bad register name `%sil'
[xilun@box ~]$ gcc -march=i686 -O2 -o test test.c 
[xilun@box ~]$ gcc -march=pentium4 -O2 -o test test.c 
/tmp/ccCEvFNV.s: Assembler messages:
/tmp/ccCEvFNV.s:21: Error: bad register name `%sil'

Example of assembly code produced :
	.file	"test.c"
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC0:
	.string	"%d %d\n"
	.text
	.p2align 2,,3
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%esi
	pushl	%ebx
	movl	8(%ebp), %ebx
	movl	%ebx, %esi
	andl	$-16, %esp
	incl	%ebx
	subl	$20, %esp
	movl	%esi, %edx
	movzbl	%bl, %eax
	pushl	%eax
	movzbl	%dl, %eax
	pushl	%eax



	xchgb	%bl, %sil



	pushl	$.LC0
	call	printf
	movzbl	%bl, %ebx
	addl	$12, %esp
	movl	%esi, %edx
	pushl	%ebx
	movzbl	%dl, %eax
	pushl	%eax
	pushl	$.LC0
	call	printf
	leal	-8(%ebp), %esp
	popl	%ebx
	xorl	%eax, %eax
	popl	%esi
	leave
	ret
	.size	main, .-main
	.section	.note.GNU-stack,"",@progbits
	.ident	"GCC: (GNU) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)"



This has been reported on this address (french page) :
https://linuxfr.org/forums/31/5533.html

This might be related to old bugs :
http://gcc.gnu.org/ml/gcc-bugs/2002-04/msg00263.html
http://www.best-websource.com/gcc/source-20020120-1.htm

-- 
           Summary: a^=b; b^=a; a^=b; produce bad i386 assembly code with O1
                    and O2 (%sil being used)
           Product: gcc
           Version: 3.4.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: k_guillaume at libertysurf dot fr
                CC: gcc-bugs at gcc dot gnu dot org
GCC target triplet: i386-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19026



More information about the Gcc-bugs mailing list