atomic.h: Fix several issues.

 * of_atomic_cmpswap_*: Clobber eax by adding it as an (unused) output,
   so the compiler resets eax (e.g. when used in a loop). (Adding it
   to the input and clobber list is lot legal!)
 * Don't dereference the pointer passed using "m"(*p) twice.
 * Fix some code for ILP64 systems (it seems there is no architecture
   using it, though, as it even contained syntax errors).
 * Use __asm__ __volatile__ just to be sure.

Thanks to Florian Zeitz for pointing out most of these issues!