*/
 static inline int atomic_add_return(int i, atomic_t *v)
 {
-       int __i;
 #ifdef CONFIG_M386
+       int __i;
        unsigned long flags;
        if (unlikely(boot_cpu_data.x86 <= 3))
                goto no_xadd;
 #endif
        /* Modern 486+ processor */
-       __i = i;
-       asm volatile(LOCK_PREFIX "xaddl %0, %1"
-                    : "+r" (i), "+m" (v->counter)
-                    : : "memory");
-       return i + __i;
+       return i + xadd(&v->counter, i);
 
 #ifdef CONFIG_M386
 no_xadd: /* Legacy 386 processor */
 
  */
 static inline long atomic64_add_return(long i, atomic64_t *v)
 {
-       long __i = i;
-       asm volatile(LOCK_PREFIX "xaddq %0, %1;"
-                    : "+r" (i), "+m" (v->counter)
-                    : : "memory");
-       return i + __i;
+       return i + xadd(&v->counter, i);
 }
 
 static inline long atomic64_sub_return(long i, atomic64_t *v)
 
  */
 static inline long rwsem_atomic_update(long delta, struct rw_semaphore *sem)
 {
-       long tmp = delta;
-
-       asm volatile(LOCK_PREFIX "xadd %0,%1"
-                    : "+r" (tmp), "+m" (sem->count)
-                    : : "memory");
-
-       return tmp + delta;
+       return delta + xadd(&sem->count, delta);
 }
 
 #endif /* __KERNEL__ */
 
  */
 static inline int atom_asr(short i, struct atomic_short *v)
 {
-       short __i = i;
-       asm volatile(LOCK_PREFIX "xaddw %0, %1"
-                       : "+r" (i), "+m" (v->counter)
-                       : : "memory");
-       return i + __i;
+       return i + xadd(&v->counter, i);
 }
 
 /*