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;
}

[EMAIL PROTECTED] ~]$ gcc -march=i386 -O2 -o test test.c 
/tmp/ccmWc5X6.s: Assembler messages:
/tmp/ccmWc5X6.s:24: Error: bad register name `%sil'
[EMAIL PROTECTED] ~]$ gcc -march=i486 -O2 -o test test.c 
/tmp/cccvo0qG.s: Assembler messages:
/tmp/cccvo0qG.s:26: Error: bad register name `%sil'
[EMAIL PROTECTED] ~]$ gcc -march=i586 -O2 -o test test.c 
/tmp/ccnZhGXe.s: Assembler messages:
/tmp/ccnZhGXe.s:24: Error: bad register name `%sil'
[EMAIL PROTECTED] ~]$ gcc -march=i686 -O2 -o test test.c 
[EMAIL PROTECTED] ~]$ 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

Reply via email to