mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-25 03:40:32 +08:00
linux-atomic.asm (ATOMIC_BOOL_COMPARE_AND_SWAP, [...]): Define.
* config/sh/linux-atomic.asm (ATOMIC_BOOL_COMPARE_AND_SWAP, ATOMIC_OP_AND_FETCH, ATOMIC_COMBOP_AND_FETCH): Define. From-SVN: r150469
This commit is contained in:
parent
3693f26675
commit
09a7d0af40
gcc
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user