aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/base/object.h34
1 files changed, 18 insertions, 16 deletions
diff --git a/lib/base/object.h b/lib/base/object.h
index 38a6dd35..ed7dda8d 100644
--- a/lib/base/object.h
+++ b/lib/base/object.h
@@ -49,14 +49,15 @@ public:
{ \
unsigned long temp; \
__asm__ __volatile__( \
- " .set mips3 \n" \
- "1: ll %0, %1 \n" \
- " .set mips0 \n" \
- " addu %0, 1 \n" \
- " .set mips3 \n" \
- " sc %0, %1 \n" \
- " .set mips0 \n" \
- " beqz %0, 1b \n" \
+ " .set mips3 \n" \
+ "1: ll %0, %1 # load counter \n" \
+ " .set mips0 \n" \
+ " addu %0, 1 # increment \n" \
+ " .set mips3 \n" \
+ " sc %0, %1 # try to store, checking for atomicity \n" \
+ " .set mips0 \n" \
+ " beqz %0, 1b # if not atomic (0), try again \n" \
+ " nop # branch-delay slot \n" \
: "=&r" (temp), "=m" ((int)ref) \
: "m" ((int)ref) \
: "memory"); \
@@ -65,14 +66,15 @@ public:
{ \
unsigned long temp; \
__asm__ __volatile__( \
- " .set mips3 \n" \
- "1: ll %0, %1 \n" \
- " .set mips0 \n" \
- " subu %0, 1 \n" \
- " .set mips3 \n" \
- " sc %0, %1 \n" \
- " .set mips0 \n" \
- " beqz %0, 1b \n" \
+ " .set mips3 \n" \
+ "1: ll %0, %1 \n" \
+ " .set mips0 \n" \
+ " subu %0, 1 # decrement \n" \
+ " .set mips3 \n" \
+ " sc %0, %1 \n" \
+ " .set mips0 \n" \
+ " beqz %0, 1b \n" \
+ " nop \n" \
: "=&r" (temp), "=m" ((int)ref) \
: "m" ((int)ref) \
: "memory"); \