diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-07-10 19:27:43 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-07-10 19:27:43 +0000 |
| commit | d075c31a89b86975cc2d50d6612252ff3abca566 (patch) | |
| tree | 46b70354e6150c57c4cc4547761a629e2a438df4 /lib | |
| parent | 4ef03f33e63f11d3aa3bd9ee8bcb9029c39f3bf3 (diff) | |
| download | enigma2-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.h | 34 |
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"); \ |
