Date: Sat, 25 Jan 1997 07:03:02 -0500 (EST) From: Peter Dufault <dufault@hda.com> To: hackers@freebsd.org Subject: Proofread compare-and-swap gcc-asm Message-ID: <199701251203.HAA01609@hda.hda.com>
next in thread | raw e-mail | index | archive | help
Can someone who groks gcc-asm proofread this? It appears to work standalone, but I think I'm trashing the stack in the program. It should compile with "-DCAS_TEST". -- Peter Dufault (dufault@hda.com) Realtime Machine Control and Simulation HD Associates, Inc. Voice: 508 433 6936 /* cas: Compare-and-swap using the 486 and Pentium "cmpxchg" * instruction. * * Atomically change what "ptr" points to to "n" if it is "o" * and return success. */ #if defined(CAS_TEST) typedef int bool; typedef unsigned long castype; extern bool cas(volatile castype *, const castype, const castype); #else #include "mwcas.h" #endif bool cas(volatile castype *ptr, const castype o, const castype n) { volatile bool result = 0; __asm __volatile ( "cmpxchg %3,%1; jne 0f; movl $1,%0;0:" : "=m" (result) : "m" (*ptr), "a" (o), "r" (n) : "ax", "cc" ); return result; } #if defined(CAS_TEST) #include <stdio.h> int main(int argc, char *av[]) { while (1) { volatile castype c; castype o, n; bool result; printf("c old new > "); if (scanf("%ld %ld %ld", &c, &o, &n) != 3) break; result = cas(&c, o, n); printf("%d; %ld %ld %ld\n", result, c, o, n); } return 0; } #endif /* CAS_TEST */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199701251203.HAA01609>