1570af302Sopenharmony_ci/* Contract for all versions is same as cas.l r2,r3,@r0
2570af302Sopenharmony_ci * pr and r1 are also clobbered (by jsr & r1 as temp).
3570af302Sopenharmony_ci * r0,r2,r4-r15 must be preserved.
4570af302Sopenharmony_ci * r3 contains result (==r2 iff cas succeeded). */
5570af302Sopenharmony_ci
6570af302Sopenharmony_ci	.align 2
7570af302Sopenharmony_ci.global __sh_cas_gusa
8570af302Sopenharmony_ci.hidden __sh_cas_gusa
9570af302Sopenharmony_ci__sh_cas_gusa:
10570af302Sopenharmony_ci	mov.l r5,@-r15
11570af302Sopenharmony_ci	mov.l r4,@-r15
12570af302Sopenharmony_ci	mov r0,r4
13570af302Sopenharmony_ci	mova 1f,r0
14570af302Sopenharmony_ci	mov r15,r1
15570af302Sopenharmony_ci	mov #(0f-1f),r15
16570af302Sopenharmony_ci0:	mov.l @r4,r5
17570af302Sopenharmony_ci	cmp/eq r5,r2
18570af302Sopenharmony_ci	bf 1f
19570af302Sopenharmony_ci	mov.l r3,@r4
20570af302Sopenharmony_ci1:	mov r1,r15
21570af302Sopenharmony_ci	mov r5,r3
22570af302Sopenharmony_ci	mov r4,r0
23570af302Sopenharmony_ci	mov.l @r15+,r4
24570af302Sopenharmony_ci	rts
25570af302Sopenharmony_ci	 mov.l @r15+,r5
26570af302Sopenharmony_ci
27570af302Sopenharmony_ci.global __sh_cas_llsc
28570af302Sopenharmony_ci.hidden __sh_cas_llsc
29570af302Sopenharmony_ci__sh_cas_llsc:
30570af302Sopenharmony_ci	mov r0,r1
31570af302Sopenharmony_ci	.word 0x00ab /* synco */
32570af302Sopenharmony_ci0:	.word 0x0163 /* movli.l @r1,r0 */
33570af302Sopenharmony_ci	cmp/eq r0,r2
34570af302Sopenharmony_ci	bf 1f
35570af302Sopenharmony_ci	mov r3,r0
36570af302Sopenharmony_ci	.word 0x0173 /* movco.l r0,@r1 */
37570af302Sopenharmony_ci	bf 0b
38570af302Sopenharmony_ci	mov r2,r0
39570af302Sopenharmony_ci1:	.word 0x00ab /* synco */
40570af302Sopenharmony_ci	mov r0,r3
41570af302Sopenharmony_ci	rts
42570af302Sopenharmony_ci	 mov r1,r0
43570af302Sopenharmony_ci
44570af302Sopenharmony_ci.global __sh_cas_imask
45570af302Sopenharmony_ci.hidden __sh_cas_imask
46570af302Sopenharmony_ci__sh_cas_imask:
47570af302Sopenharmony_ci	mov r0,r1
48570af302Sopenharmony_ci	stc sr,r0
49570af302Sopenharmony_ci	mov.l r0,@-r15
50570af302Sopenharmony_ci	or #0xf0,r0
51570af302Sopenharmony_ci	ldc r0,sr
52570af302Sopenharmony_ci	mov.l @r1,r0
53570af302Sopenharmony_ci	cmp/eq r0,r2
54570af302Sopenharmony_ci	bf 1f
55570af302Sopenharmony_ci	mov.l r3,@r1
56570af302Sopenharmony_ci1:	ldc.l @r15+,sr
57570af302Sopenharmony_ci	mov r0,r3
58570af302Sopenharmony_ci	rts
59570af302Sopenharmony_ci	 mov r1,r0
60570af302Sopenharmony_ci
61570af302Sopenharmony_ci.global __sh_cas_cas_l
62570af302Sopenharmony_ci.hidden __sh_cas_cas_l
63570af302Sopenharmony_ci__sh_cas_cas_l:
64570af302Sopenharmony_ci	rts
65570af302Sopenharmony_ci	 .word 0x2323 /* cas.l r2,r3,@r0 */
66