From d075c31a89b86975cc2d50d6612252ff3abca566 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Mon, 10 Jul 2006 19:27:43 +0000 Subject: [PATCH] add branch delay (nop) to mips asm implementation of Addref and Release used by object refcounting --- lib/base/object.h | 34 ++++++++++++++++++---------------- 1 file 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"); \ -- 2.30.2