Messages in this thread | | | From | "Michael S. Zick" <> | Subject | Re: [BUG FIX] Make x86_32 uni-processor Atomic ops, Atomic | Date | Mon, 25 May 2009 14:03:09 -0500 |
| |
On Sun May 24 2009, H. Peter Anvin wrote: > Michael S. Zick wrote: > > > > Note: I have seem to recall that newer gcc's optimizer presume > > that the flags register is preserved across asm - > > It didn't use to do that - but there is now a "cc" to deal with > > that - Have not yet audited for that, but it is high on my list. > > > > I am pretty sure that's false... if it was true we'd have failures all > over the kernel. >
No information on the above (yet) - but you gotta love this one: ;)
Programmer authors code specifying that the subtraction be done prior to the addition to avoid over-flow conditions;
GCC's optimizer, in its great wisdom, codes in the overflow case: ( the case of finding the characters used/free in a ring buffer )
extern int diff_umask(int mask, int *cnt1, int *cnt2) { return (((mask - *cnt1) + *cnt2) & mask); }
/** * gcc -O2 -S -fomit-frame-pointer difftest.c * .file "difftest.c" .text .p2align 4,,15 .globl diff_umask .type diff_umask, @function diff_umask: movl 12(%esp), %eax movl 4(%esp), %ecx movl (%eax), %edx leal (%ecx,%edx), %eax movl 8(%esp), %edx subl (%edx), %eax andl %ecx, %eax ret .size diff_umask, .-diff_umask .ident "GCC: (Debian 4.3.2-1.1) 4.3.2" .section .note.GNU-stack,"",@progbits */
Note: That is not the compiler version I am building my kernels with.
Don't blame me, I didn't write the compiler. ;)
Mike > -hpa >
| |