------- Comment #9 from jakub at gcc dot gnu dot org 2010-08-24 10:18 -------
Created an attachment (id=21554)
--> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=21554&action=view)
pageattr.i
Compiling this on x86_64-linux (and likely i?86-linux) with 4.4 branch
(r163492) using
./cc1 -fno-strict-aliasing -fno-common -fno-delete-null-pointer-checks -O2 -m32
-msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2
-march=i686 -mtune=core2 -ffreestanding -fno-asynchronous-unwind-tables
-mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fno-stack-protector
-fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-strict-overflow
-fconserve-stack
results in broken second cmpxchg8b arguments:
.L74:
movl -108(%ebp), %eax
xorl %edx, %edx
subl mem_map, %eax
movl __supported_pte_mask, %ecx
sarl $5, %eax
andl $99, %ecx
shldl $12, %eax, %edx
movl -100(%ebp), %edi
sall $12, %eax
movl %edx, %ebx
orl %eax, %ecx
movl %edx, -28(%ebp)
movl %ecx, -32(%ebp)
movl %edx, %ecx
#APP
# 72 "/mnt/b1/src/linux/set64/arch/x86/include/asm/cmpxchg_32.h" 1
1: movl (%edi), %eax
movl 4(%edi), %edx
.section .smp_locks,"a"
.balign 4
.long 671f - .
.previous
671:
lock; cmpxchg8b (%edi)
jnz 1b
# 0 "" 2
#NO_APP
*.optimized has:
<bb 77>:
D.29689 = (long long unsigned int) (long unsigned int) (((int) base - (int)
mem_map) /[ex] 32) << 12 | __supported_pte_mask & 99;
D.29693 = {};
D.29693.pte = D.29689;
D.29686 = D.29693;
D.29718 = D.29686;
pte = D.29718;
pte = pte;
pte = pte;
ptep.249 = (long long unsigned int *) kpte;
value = pte.pte;
value.59 = (unsigned int *) &value;
__asm__ __volatile__("
1: movl (%1), %%eax
movl 4(%1), %%edx
.section .smp_locks,"a"
.balign 4
.long 671f - .
.previous
671:
lock; cmpxchg8b (%1)
jnz 1b" : "=m" *ptep.249 : "D" ptep.249 : "b" *value.59 : "c"
*(value.59 + 4) : "memory", "dx", "ax", "dx", "ax", "ax");
so ebx should contain lower 32 bits of D.29689 (i.e. the same as -32(%ebp)) and
ecx should contain upper 32 bits of D.29689 (i.e. the same as -28(%ebp)).
But as can be seen in the assembly, that's not the case, %ebx instead contains
the same value as %ecx, i.e. the upper 32 bits of D.29689.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45312