66 lines
1.1 KiB
ArmAsm
66 lines
1.1 KiB
ArmAsm
/* 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
|
|
.word 0x00ab /* synco */
|
|
0: .word 0x0163 /* movli.l @r1,r0 */
|
|
cmp/eq r0,r2
|
|
bf 1f
|
|
mov r3,r0
|
|
.word 0x0173 /* movco.l r0,@r1 */
|
|
bf 0b
|
|
mov r2,r0
|
|
1: .word 0x00ab /* 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 */
|