linux-atomic.asm (ATOMIC_BOOL_COMPARE_AND_SWAP, [...]): Define.
authorKaz Kojima <kkojima@gcc.gnu.org>
Tue, 4 Aug 2009 21:33:50 +0000 (21:33 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Tue, 4 Aug 2009 21:33:50 +0000 (21:33 +0000)
* config/sh/linux-atomic.asm (ATOMIC_BOOL_COMPARE_AND_SWAP,
ATOMIC_OP_AND_FETCH, ATOMIC_COMBOP_AND_FETCH): Define.

From-SVN: r150469

gcc/ChangeLog
gcc/config/sh/linux-atomic.asm

index a888baf4235a73efeafd5d62a25cf35dce6b6c86..e94be4e3e20d74a7c9488aab3af9bb9efcf7848f 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-04  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * config/sh/linux-atomic.asm (ATOMIC_BOOL_COMPARE_AND_SWAP,
+       ATOMIC_OP_AND_FETCH, ATOMIC_COMBOP_AND_FETCH): Define.
+
 2009-08-03  Janis Johnson  <janis187@us.ibm.com>
 
        PR c/39902
index 04b7d507c15167ef08f1b03298c3061742cfea6d..743c61bb76c66904ffd738687bfd108d1e94da99 100644 (file)
@@ -75,6 +75,28 @@ ATOMIC_COMPARE_AND_SWAP (1,b,exts.b,extu.b)
 ATOMIC_COMPARE_AND_SWAP (2,w,exts.w,extu.w)
 ATOMIC_COMPARE_AND_SWAP (4,l,mov,mov)
 
+#define ATOMIC_BOOL_COMPARE_AND_SWAP(N,T,EXTS) \
+       .global __sync_bool_compare_and_swap_##N; \
+       HIDDEN_FUNC(__sync_bool_compare_and_swap_##N); \
+       .align  2; \
+__sync_bool_compare_and_swap_##N:; \
+       mova    1f, r0; \
+       EXTS    r5, r5; \
+       mov     r15, r1; \
+       mov     #(0f-1f), r15; \
+0:     mov.##T @r4, r2; \
+       cmp/eq  r2, r5; \
+       bf      1f; \
+       mov.##T r6, @r4; \
+1:     mov     r1, r15; \
+       rts; \
+        movt   r0; \
+       ENDFUNC(__sync_bool_compare_and_swap_##N)
+
+ATOMIC_BOOL_COMPARE_AND_SWAP (1,b,exts.b)
+ATOMIC_BOOL_COMPARE_AND_SWAP (2,w,exts.w)
+ATOMIC_BOOL_COMPARE_AND_SWAP (4,l,mov)
+
 #define ATOMIC_FETCH_AND_OP(OP,N,T,EXT) \
        .global __sync_fetch_and_##OP##_##N; \
        HIDDEN_FUNC(__sync_fetch_and_##OP##_##N); \
@@ -135,6 +157,66 @@ ATOMIC_FETCH_AND_COMBOP(nand,and,not,1,b,extu.b)
 ATOMIC_FETCH_AND_COMBOP(nand,and,not,2,w,extu.w)
 ATOMIC_FETCH_AND_COMBOP(nand,and,not,4,l,mov)
 
+#define ATOMIC_OP_AND_FETCH(OP,N,T,EXT) \
+       .global __sync_##OP##_and_fetch_##N; \
+       HIDDEN_FUNC(__sync_##OP##_and_fetch_##N); \
+       .align  2; \
+__sync_##OP##_and_fetch_##N:; \
+       mova    1f, r0; \
+       nop; \
+       mov     r15, r1; \
+       mov     #(0f-1f), r15; \
+0:     mov.##T @r4, r2; \
+       mov     r5, r3; \
+       OP      r2, r3; \
+       mov.##T r3, @r4; \
+1:     mov     r1, r15; \
+       rts; \
+        EXT    r3, r0; \
+       ENDFUNC(__sync_##OP##_and_fetch_##N)
+
+ATOMIC_OP_AND_FETCH(add,1,b,extu.b)
+ATOMIC_OP_AND_FETCH(add,2,w,extu.w)
+ATOMIC_OP_AND_FETCH(add,4,l,mov)
+
+ATOMIC_OP_AND_FETCH(or,1,b,extu.b)
+ATOMIC_OP_AND_FETCH(or,2,w,extu.w)
+ATOMIC_OP_AND_FETCH(or,4,l,mov)
+
+ATOMIC_OP_AND_FETCH(and,1,b,extu.b)
+ATOMIC_OP_AND_FETCH(and,2,w,extu.w)
+ATOMIC_OP_AND_FETCH(and,4,l,mov)
+
+ATOMIC_OP_AND_FETCH(xor,1,b,extu.b)
+ATOMIC_OP_AND_FETCH(xor,2,w,extu.w)
+ATOMIC_OP_AND_FETCH(xor,4,l,mov)
+
+#define ATOMIC_COMBOP_AND_FETCH(OP,OP0,OP1,N,T,EXT) \
+       .global __sync_##OP##_and_fetch_##N; \
+       HIDDEN_FUNC(__sync_##OP##_and_fetch_##N); \
+       .align  2; \
+__sync_##OP##_and_fetch_##N:; \
+       mova    1f, r0; \
+       mov     r15, r1; \
+       mov     #(0f-1f), r15; \
+0:     mov.##T @r4, r2; \
+       mov     r5, r3; \
+       OP0     r2, r3; \
+       OP1     r3, r3; \
+       mov.##T r3, @r4; \
+1:     mov     r1, r15; \
+       rts; \
+        EXT    r3, r0; \
+       ENDFUNC(__sync_##OP##_and_fetch_##N)
+
+ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,1,b,extu.b)
+ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,2,w,extu.w)
+ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,4,l,mov)
+
+ATOMIC_COMBOP_AND_FETCH(nand,and,not,1,b,extu.b)
+ATOMIC_COMBOP_AND_FETCH(nand,and,not,2,w,extu.w)
+ATOMIC_COMBOP_AND_FETCH(nand,and,not,4,l,mov)
+
 .section .note.GNU-stack,"",%progbits
 .previous