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 16:10:40 -0500 |
| |
On Mon May 25 2009, Michael S. Zick wrote:
In actual application, this *should not* make a difference.
Mike > On Mon May 25 2009, Michael S. Zick wrote: > > On Mon May 25 2009, Michael S. Zick wrote: > > > 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. > > > > > > > The compiler I am using (Gentoo 4.1.2) gets it correct: > > > > .file "difftest.c" > > .text > > .p2align 4,,15 > > .globl diff_umask > > .type diff_umask, @function > > diff_umask: > > movl 4(%esp), %eax > > movl 8(%esp), %edx > > movl %eax, %ecx > > subl (%edx), %ecx > > movl %ecx, %edx > > movl 12(%esp), %ecx > > addl (%ecx), %edx > > andl %edx, %eax > > ret > > .size diff_umask, .-diff_umask > > .ident "GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.1)" > > .section .note.GNU-stack,"",@progbits > > > > Gentoo's current 4.3 gets it wrong also: > > .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: (Gentoo 4.3.2-r3 p1.6, pie-10.1.5) 4.3.2" > .section .note.GNU-stack,"",@progbits > > = = = = > > Might be time to put compiler version checking back into the > build system and/or re-test the sources that do have version > checking in them (hint: the boss's code). > > Mike > > Mike > > > Don't blame me, I didn't write the compiler. ;) > > > > > > Mike > > > > -hpa > > > > > > > > > > > > > -- > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > >
| |