Here is my test case: unsigned char Keep4_3Ratio; unsigned long SMode=0, DSMode=0;
bool CheckTVRatioReq() { return(Keep4_3Ratio && (DSMode == 1 || SMode == 1)); } Compiling on an x86-32 compiler with the following: g++ -march=athlon64 -masm=intel -O3 -fomit-frame-pointer -o test.o -c test.cpp Causes the compile to fail with: Assembler messages: Error: expecting string instruction after `rep' The assembly being: _Z15CheckTVRatioReqv: .LFB2: xor %eax, %eax cmp BYTE PTR Keep4_3Ratio, 0 je .L4 cmp DWORD PTR DSMode, 1 mov %al, 1 je .L4 xor %eax, %eax cmp DWORD PTR SMode, 1 sete %al .L4: rep ret "rep ret" is an invalid instruction. I've tested with the following 32 bit compilers: Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --with-tune=i686 --enable-checking=release i486-linux-gnu Thread model: posix gcc version 4.1.2 20060928 (prerelease) (Debian 4.1.1-15) Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,java,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.2 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default,qt-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.2-1.4.2.0/jre --enable-objc-gc --enable-mpfr --with-tune=generic --enable-checking=release i486-linux-gnu Thread model: posix gcc version 4.2.0 20060709 (experimental) (Debian 4.2-20060709-1) Using built-in specs. Target: i586-msdosdjgpp Configured with: ./configure --target=i586-msdosdjgpp --prefix=/usr --disable-nls --enable-languages=c,c++ --with-headers=/usr/i586-msdosdjgpp/sys-include Thread model: single gcc version 4.1.0 Reading specs from /usr/i586-mingw32/lib/gcc/i586-mingw32/3.4.5/specs Configured with: ../configure --prefix=/usr/i586-mingw32 --with-gcc --with-gnu-ld --with-gnu-as --target=i586-mingw32 --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --disable-libstdcxx-debug Thread model: win32 gcc version 3.4.5 (mingw special) Reading specs from ../lib/gcc/mingw32/3.4.5/specs Configured with: ../gcc-3.4.5/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.5 (mingw special) Using built-in specs. Target: djgpp Configured with: /gnu/gcc-4.10/configure djgpp --prefix=/dev/env/DJDIR --disable-nls --disable-werror --enable-languages=c,c++,fortran,objc,obj-c++,ada Thread model: single gcc version 4.1.0 Interestingly enough, it did not fail when using this version of GCC: Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,java --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --with-tune=i686 --enable-checking=release i486-linux-gnu Thread model: posix gcc version 4.0.4 20060904 (prerelease) (Debian 4.0.3-7) Although I suspect if I played with the options more I can get it to fail with that GCC too. Now when using the same case with an x86-64 compile and the following options: g++ -march=athlon64 -masm=intel -o test.o -c test.cpp I get the following errors: Assembler messages: Error: invalid operand for 'movzx' ('(' unexpected) Error: invalid operand for 'mov' ('(' unexpected) Error: invalid operand for 'mov' ('(' unexpected) Assembly being: _Z15CheckTVRatioReqv: .LFB2: push %rbp .LCFI0: mov %rbp, %rsp .LCFI1: movzx %eax, BYTE PTR Keep4_3Ratio(%rip) test %al, %al je .L2 mov %rax, QWORD PTR DSMode(%rip) cmp %rax, 1 je .L4 mov %rax, QWORD PTR SMode(%rip) cmp %rax, 1 jne .L2 .L4: mov BYTE PTR [%rbp-1], 1 jmp .L6 .L2: mov BYTE PTR [%rbp-1], 0 .L6: movzx %eax, BYTE PTR [%rbp-1] leave ret I don't know AMD64 assembly well but "Keep4_3Ratio(%rip)" and the like doesn't look right to me. If I add -O3 so the line becomes: g++ -O3 -march=athlon64 -masm=intel -o test.o -c test.cpp I get "cmp" bugs instead of "mov" and I also get the "rep ret" bug from above when using GCC 4.1 (but not 4.0). My 64 bit compilers: Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,java --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-checking=release x86_64-linux-gnu Thread model: posix gcc version 4.0.4 20060904 (prerelease) (Debian 4.0.3-7) Target: x86_64-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release x86_64-linux-gnu Thread model: posix gcc version 4.1.2 20060928 (prerelease) (Debian 4.1.1-15) I've conducted this test on two different PCs, one running WinXP SP2, and the other Debian Unstable. -- Summary: -masm=intel combined with -march=athlon64 has some issues. Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: major Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: nachms+gcc at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29473