remove unneeded nop the gcc-as add this self
[enigma2.git] / lib / base / object.h
index f93f425739a19108fa8fa3c5985cabbeca1f24d9..68507a2b74f485986342366e3912052fbfb49c9f 100644 (file)
@@ -49,14 +49,14 @@ 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" \
                                : "=&r" (temp), "=m" ((int)ref) \
                                : "m" ((int)ref) \
                                : "memory"); \
@@ -65,20 +65,54 @@ 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" \
                                : "=&r" (temp), "=m" ((int)ref) \
                                : "m" ((int)ref) \
                                : "memory"); \
                                if (!ref) \
                                        delete this; \
                        }
+       #elif defined(__ppc__)
+               #define DECLARE_REF(x)                  \
+                       private: oRefCount ref;         \
+                       public: void AddRef();          \
+                                       void Release();
+               #define DEFINE_REF(c) \
+                       void c::AddRef() \
+                       { \
+                               int temp; \
+                               __asm__ __volatile__( \
+                               "1:             lwarx   %0, 0, %3       \n" \
+                               "               add             %0, %2, %0      \n" \
+                               "               dcbt    0, %3           \n" \
+                               "               stwcx.  %0, 0, %3       \n" \
+                               "               bne-    1b                      \n" \
+                               : "=&r" (temp), "=m" ((int)ref) \
+                               : "r" (1), "r" (&((int)ref)), "m" ((int)ref) \
+                               : "cc"); \
+                       } \
+                       void c::Release() \
+                       { \
+                               int temp; \
+                               __asm__ __volatile__( \
+                               "1:             lwarx   %0, 0, %3       \n" \
+                               "               subf    %0, %2, %0      \n" \
+                               "               dcbt    0, %3           \n" \
+                               "               stwcx.  %0, 0, %3       \n" \
+                               "               bne-    1b                      \n" \
+                               : "=&r" (temp), "=m" ((int)ref) \
+                               : "r" (1), "r" (&((int)ref)), "m" ((int)ref) \
+                               : "cc"); \
+                               if (!ref) \
+                                       delete this; \
+                       }
        #else
                #define DECLARE_REF(x)                  \
                        private:oRefCount ref;  \