|
@@ -28,25 +28,23 @@ void atomic_write(atomic_t *atom, long value)
|
|
|
long atomic_add_return(atomic_t *atom, long value)
|
|
|
{
|
|
|
long ret;
|
|
|
-
|
|
|
+#if __SIZEOF_LONG__ == 4
|
|
|
__asm__ __volatile__(" amoadd.w.aqrl %1, %2, %0"
|
|
|
: "+A"(atom->counter), "=r"(ret)
|
|
|
: "r"(value)
|
|
|
: "memory");
|
|
|
-
|
|
|
+#elif __SIZEOF_LONG__ == 8
|
|
|
+ __asm__ __volatile__(" amoadd.d.aqrl %1, %2, %0"
|
|
|
+ : "+A"(atom->counter), "=r"(ret)
|
|
|
+ : "r"(value)
|
|
|
+ : "memory");
|
|
|
+#endif
|
|
|
return ret + value;
|
|
|
}
|
|
|
|
|
|
long atomic_sub_return(atomic_t *atom, long value)
|
|
|
{
|
|
|
- long ret;
|
|
|
-
|
|
|
- __asm__ __volatile__(" amoadd.w.aqrl %1, %2, %0"
|
|
|
- : "+A"(atom->counter), "=r"(ret)
|
|
|
- : "r"(-value)
|
|
|
- : "memory");
|
|
|
-
|
|
|
- return ret - value;
|
|
|
+ return atomic_add_return(atom, -value);
|
|
|
}
|
|
|
|
|
|
#define __axchg(ptr, new, size) \
|