diff options
author | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-04 21:33:50 +0000 |
---|---|---|
committer | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-04 21:33:50 +0000 |
commit | 89c9a7aadbb508eeee75e409972a671ad7bc3eb8 (patch) | |
tree | 95e608501f025987f3e3eda9471d9f10269a0158 /gcc | |
parent | 3a84f10bfd4eda5d05037d8975c38455ca980fc3 (diff) | |
download | gcc-89c9a7aadbb508eeee75e409972a671ad7bc3eb8.tar.gz |
* config/sh/linux-atomic.asm (ATOMIC_BOOL_COMPARE_AND_SWAP,
ATOMIC_OP_AND_FETCH, ATOMIC_COMBOP_AND_FETCH): Define.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150469 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/sh/linux-atomic.asm | 82 |
2 files changed, 87 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a888baf4235..e94be4e3e20 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/sh/linux-atomic.asm b/gcc/config/sh/linux-atomic.asm index 04b7d507c15..743c61bb76c 100644 --- a/gcc/config/sh/linux-atomic.asm +++ b/gcc/config/sh/linux-atomic.asm @@ -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 |