This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch committed SH] Add more __sync_* functions to linux-atomic.asm


Hi,

I've applied the attached patch which adds __sync_*_and_fetch_*
and __sync_bool_compare_and_swap_* functions to linux-atomic.asm.
Tested on sh4-unknown-lunux-gnu.

Regards,
	kaz
--
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.

diff -up ORIG/trunk/gcc/config/sh/linux-atomic.asm trunk/gcc/config/sh/linux-atomic.asm
--- ORIG/trunk/gcc/config/sh/linux-atomic.asm	2009-08-04 08:16:50.000000000 +0900
+++ trunk/gcc/config/sh/linux-atomic.asm	2009-08-04 22:57:16.000000000 +0900
@@ -75,6 +75,28 @@ ATOMIC_COMPARE_AND_SWAP (1,b,exts.b,extu
 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
 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
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]