comparison gcc/config/sh/linux-atomic.asm @ 55:77e2b8dfacca gcc-4.4.5

update it from 4.4.3 to 4.5.0
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 23:39:51 +0900
parents a06113de4d67
children
comparison
equal deleted inserted replaced
52:c156f1bd5cd9 55:77e2b8dfacca
52 ATOMIC_TEST_AND_SET (1,b,extu.b) 52 ATOMIC_TEST_AND_SET (1,b,extu.b)
53 ATOMIC_TEST_AND_SET (2,w,extu.w) 53 ATOMIC_TEST_AND_SET (2,w,extu.w)
54 ATOMIC_TEST_AND_SET (4,l,mov) 54 ATOMIC_TEST_AND_SET (4,l,mov)
55 55
56 #define ATOMIC_COMPARE_AND_SWAP(N,T,EXTS,EXT) \ 56 #define ATOMIC_COMPARE_AND_SWAP(N,T,EXTS,EXT) \
57 .global __sync_compare_and_swap_##N; \ 57 .global __sync_val_compare_and_swap_##N; \
58 HIDDEN_FUNC(__sync_compare_and_swap_##N); \ 58 HIDDEN_FUNC(__sync_val_compare_and_swap_##N); \
59 .align 2; \ 59 .align 2; \
60 __sync_compare_and_swap_##N:; \ 60 __sync_val_compare_and_swap_##N:; \
61 mova 1f, r0; \ 61 mova 1f, r0; \
62 EXTS r5, r5; \ 62 EXTS r5, r5; \
63 mov r15, r1; \ 63 mov r15, r1; \
64 mov #(0f-1f), r15; \ 64 mov #(0f-1f), r15; \
65 0: mov.##T @r4, r2; \ 65 0: mov.##T @r4, r2; \
67 bf 1f; \ 67 bf 1f; \
68 mov.##T r6, @r4; \ 68 mov.##T r6, @r4; \
69 1: mov r1, r15; \ 69 1: mov r1, r15; \
70 rts; \ 70 rts; \
71 EXT r2, r0; \ 71 EXT r2, r0; \
72 ENDFUNC(__sync_compare_and_swap_##N) 72 ENDFUNC(__sync_val_compare_and_swap_##N)
73 73
74 ATOMIC_COMPARE_AND_SWAP (1,b,exts.b,extu.b) 74 ATOMIC_COMPARE_AND_SWAP (1,b,exts.b,extu.b)
75 ATOMIC_COMPARE_AND_SWAP (2,w,exts.w,extu.w) 75 ATOMIC_COMPARE_AND_SWAP (2,w,exts.w,extu.w)
76 ATOMIC_COMPARE_AND_SWAP (4,l,mov,mov) 76 ATOMIC_COMPARE_AND_SWAP (4,l,mov,mov)
77 77
78 #define ATOMIC_BOOL_COMPARE_AND_SWAP(N,T,EXTS) \
79 .global __sync_bool_compare_and_swap_##N; \
80 HIDDEN_FUNC(__sync_bool_compare_and_swap_##N); \
81 .align 2; \
82 __sync_bool_compare_and_swap_##N:; \
83 mova 1f, r0; \
84 EXTS r5, r5; \
85 mov r15, r1; \
86 mov #(0f-1f), r15; \
87 0: mov.##T @r4, r2; \
88 cmp/eq r2, r5; \
89 bf 1f; \
90 mov.##T r6, @r4; \
91 1: mov r1, r15; \
92 rts; \
93 movt r0; \
94 ENDFUNC(__sync_bool_compare_and_swap_##N)
95
96 ATOMIC_BOOL_COMPARE_AND_SWAP (1,b,exts.b)
97 ATOMIC_BOOL_COMPARE_AND_SWAP (2,w,exts.w)
98 ATOMIC_BOOL_COMPARE_AND_SWAP (4,l,mov)
99
78 #define ATOMIC_FETCH_AND_OP(OP,N,T,EXT) \ 100 #define ATOMIC_FETCH_AND_OP(OP,N,T,EXT) \
79 .global __sync_fetch_and_##OP##_##N; \ 101 .global __sync_fetch_and_##OP##_##N; \
80 HIDDEN_FUNC(__sync_fetch_and_##OP##_##N); \ 102 HIDDEN_FUNC(__sync_fetch_and_##OP##_##N); \
81 .align 2; \ 103 .align 2; \
82 __sync_fetch_and_##OP##_##N:; \ 104 __sync_fetch_and_##OP##_##N:; \
133 155
134 ATOMIC_FETCH_AND_COMBOP(nand,and,not,1,b,extu.b) 156 ATOMIC_FETCH_AND_COMBOP(nand,and,not,1,b,extu.b)
135 ATOMIC_FETCH_AND_COMBOP(nand,and,not,2,w,extu.w) 157 ATOMIC_FETCH_AND_COMBOP(nand,and,not,2,w,extu.w)
136 ATOMIC_FETCH_AND_COMBOP(nand,and,not,4,l,mov) 158 ATOMIC_FETCH_AND_COMBOP(nand,and,not,4,l,mov)
137 159
160 #define ATOMIC_OP_AND_FETCH(OP,N,T,EXT) \
161 .global __sync_##OP##_and_fetch_##N; \
162 HIDDEN_FUNC(__sync_##OP##_and_fetch_##N); \
163 .align 2; \
164 __sync_##OP##_and_fetch_##N:; \
165 mova 1f, r0; \
166 nop; \
167 mov r15, r1; \
168 mov #(0f-1f), r15; \
169 0: mov.##T @r4, r2; \
170 mov r5, r3; \
171 OP r2, r3; \
172 mov.##T r3, @r4; \
173 1: mov r1, r15; \
174 rts; \
175 EXT r3, r0; \
176 ENDFUNC(__sync_##OP##_and_fetch_##N)
177
178 ATOMIC_OP_AND_FETCH(add,1,b,extu.b)
179 ATOMIC_OP_AND_FETCH(add,2,w,extu.w)
180 ATOMIC_OP_AND_FETCH(add,4,l,mov)
181
182 ATOMIC_OP_AND_FETCH(or,1,b,extu.b)
183 ATOMIC_OP_AND_FETCH(or,2,w,extu.w)
184 ATOMIC_OP_AND_FETCH(or,4,l,mov)
185
186 ATOMIC_OP_AND_FETCH(and,1,b,extu.b)
187 ATOMIC_OP_AND_FETCH(and,2,w,extu.w)
188 ATOMIC_OP_AND_FETCH(and,4,l,mov)
189
190 ATOMIC_OP_AND_FETCH(xor,1,b,extu.b)
191 ATOMIC_OP_AND_FETCH(xor,2,w,extu.w)
192 ATOMIC_OP_AND_FETCH(xor,4,l,mov)
193
194 #define ATOMIC_COMBOP_AND_FETCH(OP,OP0,OP1,N,T,EXT) \
195 .global __sync_##OP##_and_fetch_##N; \
196 HIDDEN_FUNC(__sync_##OP##_and_fetch_##N); \
197 .align 2; \
198 __sync_##OP##_and_fetch_##N:; \
199 mova 1f, r0; \
200 mov r15, r1; \
201 mov #(0f-1f), r15; \
202 0: mov.##T @r4, r2; \
203 mov r5, r3; \
204 OP0 r2, r3; \
205 OP1 r3, r3; \
206 mov.##T r3, @r4; \
207 1: mov r1, r15; \
208 rts; \
209 EXT r3, r0; \
210 ENDFUNC(__sync_##OP##_and_fetch_##N)
211
212 ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,1,b,extu.b)
213 ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,2,w,extu.w)
214 ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,4,l,mov)
215
216 ATOMIC_COMBOP_AND_FETCH(nand,and,not,1,b,extu.b)
217 ATOMIC_COMBOP_AND_FETCH(nand,and,not,2,w,extu.w)
218 ATOMIC_COMBOP_AND_FETCH(nand,and,not,4,l,mov)
219
220 .section .note.GNU-stack,"",%progbits
221 .previous
222
138 #endif /* ! __SH5__ */ 223 #endif /* ! __SH5__ */