fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / sparc64 / lib / bitops.S
index fd20171..892431a 100644 (file)
@@ -4,43 +4,49 @@
  * Copyright (C) 2000 David S. Miller (davem@redhat.com)
  */
 
-#include <linux/config.h>
 #include <asm/asi.h>
 
+       .text
+
        /* On SMP we need to use memory barriers to ensure
         * correct memory operation ordering, nop these out
         * for uniprocessor.
         */
+
 #ifdef CONFIG_SMP
 #define BITOP_PRE_BARRIER      membar #StoreLoad | #LoadLoad
-#define BITOP_POST_BARRIER     membar #StoreLoad | #StoreStore
+#define BITOP_POST_BARRIER     \
+       ba,pt   %xcc, 80b;      \
+       membar #StoreLoad | #StoreStore
+
+80:    retl
+        nop
 #else
-#define BITOP_PRE_BARRIER      nop
-#define BITOP_POST_BARRIER     nop
+#define BITOP_PRE_BARRIER
+#define BITOP_POST_BARRIER
 #endif
 
-       .text
-
        .globl  test_and_set_bit
        .type   test_and_set_bit,#function
 test_and_set_bit:      /* %o0=nr, %o1=addr */
        BITOP_PRE_BARRIER
        srlx    %o0, 6, %g1
-       mov     1, %g5
+       mov     1, %o2
        sllx    %g1, 3, %g3
        and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
+       sllx    %o2, %g2, %o2
        add     %o1, %g3, %o1
 1:     ldx     [%o1], %g7
-       or      %g7, %g5, %g1
+       or      %g7, %o2, %g1
        casx    [%o1], %g7, %g1
        cmp     %g7, %g1
        bne,pn  %xcc, 1b
-        and    %g7, %g5, %g2
-       BITOP_POST_BARRIER
+        and    %g7, %o2, %g2
        clr     %o0
+       movrne  %g2, 1, %o0
+       BITOP_POST_BARRIER
        retl
-        movrne %g2, 1, %o0
+        nop
        .size   test_and_set_bit, .-test_and_set_bit
 
        .globl  test_and_clear_bit
@@ -48,21 +54,22 @@ test_and_set_bit:   /* %o0=nr, %o1=addr */
 test_and_clear_bit:    /* %o0=nr, %o1=addr */
        BITOP_PRE_BARRIER
        srlx    %o0, 6, %g1
-       mov     1, %g5
+       mov     1, %o2
        sllx    %g1, 3, %g3
        and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
+       sllx    %o2, %g2, %o2
        add     %o1, %g3, %o1
 1:     ldx     [%o1], %g7
-       andn    %g7, %g5, %g1
+       andn    %g7, %o2, %g1
        casx    [%o1], %g7, %g1
        cmp     %g7, %g1
        bne,pn  %xcc, 1b
-        and    %g7, %g5, %g2
-       BITOP_POST_BARRIER
+        and    %g7, %o2, %g2
        clr     %o0
+       movrne  %g2, 1, %o0
+       BITOP_POST_BARRIER
        retl
-        movrne %g2, 1, %o0
+        nop
        .size   test_and_clear_bit, .-test_and_clear_bit
 
        .globl  test_and_change_bit
@@ -70,34 +77,35 @@ test_and_clear_bit: /* %o0=nr, %o1=addr */
 test_and_change_bit:   /* %o0=nr, %o1=addr */
        BITOP_PRE_BARRIER
        srlx    %o0, 6, %g1
-       mov     1, %g5
+       mov     1, %o2
        sllx    %g1, 3, %g3
        and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
+       sllx    %o2, %g2, %o2
        add     %o1, %g3, %o1
 1:     ldx     [%o1], %g7
-       xor     %g7, %g5, %g1
+       xor     %g7, %o2, %g1
        casx    [%o1], %g7, %g1
        cmp     %g7, %g1
        bne,pn  %xcc, 1b
-        and    %g7, %g5, %g2
-       BITOP_POST_BARRIER
+        and    %g7, %o2, %g2
        clr     %o0
+       movrne  %g2, 1, %o0
+       BITOP_POST_BARRIER
        retl
-        movrne %g2, 1, %o0
+        nop
        .size   test_and_change_bit, .-test_and_change_bit
 
        .globl  set_bit
        .type   set_bit,#function
 set_bit:               /* %o0=nr, %o1=addr */
        srlx    %o0, 6, %g1
-       mov     1, %g5
+       mov     1, %o2
        sllx    %g1, 3, %g3
        and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
+       sllx    %o2, %g2, %o2
        add     %o1, %g3, %o1
 1:     ldx     [%o1], %g7
-       or      %g7, %g5, %g1
+       or      %g7, %o2, %g1
        casx    [%o1], %g7, %g1
        cmp     %g7, %g1
        bne,pn  %xcc, 1b
@@ -110,13 +118,13 @@ set_bit:          /* %o0=nr, %o1=addr */
        .type   clear_bit,#function
 clear_bit:             /* %o0=nr, %o1=addr */
        srlx    %o0, 6, %g1
-       mov     1, %g5
+       mov     1, %o2
        sllx    %g1, 3, %g3
        and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
+       sllx    %o2, %g2, %o2
        add     %o1, %g3, %o1
 1:     ldx     [%o1], %g7
-       andn    %g7, %g5, %g1
+       andn    %g7, %o2, %g1
        casx    [%o1], %g7, %g1
        cmp     %g7, %g1
        bne,pn  %xcc, 1b
@@ -129,13 +137,13 @@ clear_bit:                /* %o0=nr, %o1=addr */
        .type   change_bit,#function
 change_bit:            /* %o0=nr, %o1=addr */
        srlx    %o0, 6, %g1
-       mov     1, %g5
+       mov     1, %o2
        sllx    %g1, 3, %g3
        and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
+       sllx    %o2, %g2, %o2
        add     %o1, %g3, %o1
 1:     ldx     [%o1], %g7
-       xor     %g7, %g5, %g1
+       xor     %g7, %o2, %g1
        casx    [%o1], %g7, %g1
        cmp     %g7, %g1
        bne,pn  %xcc, 1b