aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-07-10 19:27:43 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-07-10 19:27:43 +0000
commitd075c31a89b86975cc2d50d6612252ff3abca566 (patch)
tree46b70354e6150c57c4cc4547761a629e2a438df4 /lib
parent4ef03f33e63f11d3aa3bd9ee8bcb9029c39f3bf3 (diff)
downloadenigma2-d075c31a89b86975cc2d50d6612252ff3abca566.tar.gz
enigma2-d075c31a89b86975cc2d50d6612252ff3abca566.zip
add branch delay (nop) to mips asm implementation of Addref and Release used
by object refcounting
Diffstat (limited to 'lib')
-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"); \