http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49101
Summary: [x32] Extra instruction in compare Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: hjl.to...@gmail.com [hjl@gnu-6 ilp32-41]$ cat foo.c extern void abort (void); typedef __SIZE_TYPE__ size_t; extern size_t strcspn (const char *, const char *); extern char *strcpy (char *, const char *); int main (void) { char *s1 = "hello world"; char dst[64], *d2; strcpy (dst, s1); d2 = dst; if (strcspn (++d2+5, "") != 5) abort(); return 0; } [hjl@gnu-6 ilp32-41]$ make foo.s /export/build/gnu/gcc-x32/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc-x32/build-x86_64-linux/gcc/ -mx32 -S -o foo.s -mx32 -O foo.c [hjl@gnu-6 ilp32-41]$ cat foo.s .file "foo.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc subq $72, %rsp .cfi_def_cfa_offset 80 movl $1819043176, (%rsp) movl $1870078063, 4(%rsp) movl $6581362, 8(%rsp) leaq 6(%rsp), %rdi movl $0, %eax movq $-1, %rcx repnz scasb notq %rcx cmpl $6, %ecx je .L2 call abort .L2: movl $0, %eax addq $72, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.7.0 20110521 (experimental)" .section .note.GNU-stack,"",@progbits [hjl@gnu-6 ilp32-41]$ /export/build/gnu/gcc-x32/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc-x32/build-x86_64-linux/gcc/ -S -o 64.s -O foo.c [hjl@gnu-6 ilp32-41]$ diff -up 64.s foo.s --- 64.s 2011-05-21 06:16:11.260010306 -0700 +++ foo.s 2011-05-21 06:15:38.076996129 -0700 @@ -14,7 +14,8 @@ main: movl $0, %eax movq $-1, %rcx repnz scasb - cmpq $-7, %rcx + notq %rcx + cmpl $6, %ecx je .L2 call abort .L2: [hjl@gnu-6 ilp32-41]$ X32 generates notq %rcx cmpl $6, %ecx instead of cmpq $-7, %rcx