/* Contract for all versions is same as cas.l r2,r3,@r0
 * pr and r1 are also clobbered (by jsr & r1 as temp).
 * r0,r2,r4-r15 must be preserved.
 * r3 contains result (==r2 iff cas succeeded). */

	.align 2
.global __sh_cas_gusa
.hidden __sh_cas_gusa
__sh_cas_gusa:
	mov.l r5,@-r15
	mov.l r4,@-r15
	mov r0,r4
	mova 1f,r0
	mov r15,r1
	mov #(0f-1f),r15
0:	mov.l @r4,r5
	cmp/eq r5,r2
	bf 1f
	mov.l r3,@r4
1:	mov r1,r15
	mov r5,r3
	mov r4,r0
	mov.l @r15+,r4
	rts
	 mov.l @r15+,r5

.global __sh_cas_llsc
.hidden __sh_cas_llsc
__sh_cas_llsc:
	mov r0,r1
	synco
0:	movli.l @r1,r0
	cmp/eq r0,r2
	bf 1f
	mov r3,r0
	movco.l r0,@r1
	bf 0b
	mov r2,r0
1:	synco
	mov r0,r3
	rts
	 mov r1,r0

.global __sh_cas_imask
.hidden __sh_cas_imask
__sh_cas_imask:
	mov r0,r1
	stc sr,r0
	mov.l r0,@-r15
	or #0xf0,r0
	ldc r0,sr
	mov.l @r1,r0
	cmp/eq r0,r2
	bf 1f
	mov.l r3,@r1
1:	ldc.l @r15+,sr
	mov r0,r3
	rts
	 mov r1,r0

.global __sh_cas_cas_l
.hidden __sh_cas_cas_l
__sh_cas_cas_l:
	rts
	 .word 0x2323 /* cas.l r2,r3,@r0 */
