shithub: front

ref: 83cebf888d01e010024fbc273e76e47238fb30c6
dir: /sys/src/libc/arm/atomic.s/

View raw version
#define ISH	(2<<2|3)

/* get variants */
TEXT agetl+0(SB),1,$0
TEXT agetp+0(SB),1,$0
	MOVW	$0, R5
	MOVW	(R0), R0
	DMB	$ISH
	RET

/* set variants */
TEXT aswapl+0(SB),1,$0
TEXT aswapp+0(SB),1,$0
	MOVW	new+4(FP), R1
	MOVW	(R0), R2
	DMB	$ISH
	MOVW	R1, (R0)
	MOVW	R2, R0
	DMB	$ISH
	RET

/* inc variants */
TEXT aincl+0(SB),1,$0
	MOVW	delta+4(FP), R1
_aincl:
	LDREX	(R0), R3
	ADD	R1, R3
	STREX	R3, (R0), R4
	CMP	$0, R4
	BNE	_aincl
	MOVW	R3, R0
	DMB	$ISH
	RET

/* cas variants */
TEXT acasl+0(SB),1,$0
TEXT acasp+0(SB),1,$0
	MOVW	old+4(FP), R1
	MOVW	new+8(FP), R2
	DMB	$ISH
_acasl:
	LDREX	(R0), R3
	CMP	R1, R3
	BNE	_acaslf
	STREX	R2, (R0), R4
	CMP	$0, R4
	BNE	_acasl
	MOVW	$1, R0
	DMB	$ISH
	RET
_acaslf:
	CLREX
	MOVW	$0, R0
	DMB	$ISH
	RET

/* barriers */
TEXT coherence+0(SB),1,$0
	DMB	$ISH
	RET