shithub: front

Download patch

ref: 5a87aff711a9f6196f983b4c25e2dd98b562289f
parent: 740b766e5a9b0101225c23a5f9920d7d8b8fc67d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Aug 17 15:52:18 EDT 2025

libc: fix aswap*() for arm

remove useless MOVL $0, 5 in agetl().
use LDREX/STREX for *ATOMIC* aswap*().
no refunds.

--- a/sys/src/libc/arm/atomic.s
+++ b/sys/src/libc/arm/atomic.s
@@ -3,7 +3,6 @@
 /* get variants */
 TEXT agetl+0(SB),1,$0
 TEXT agetp+0(SB),1,$0
-	MOVW	$0, R5
 	MOVW	(R0), R0
 	DMB	$ISH
 	RET
@@ -12,23 +11,25 @@
 TEXT aswapl+0(SB),1,$0
 TEXT aswapp+0(SB),1,$0
 	MOVW	new+4(FP), R1
-	MOVW	(R0), R2
+	MOVW	R0, R2
+_aswapl:
+	LDREX	(R2), R0
+	STREX	R1, (R2), R3
+	CMP	$0, R3
+	BNE	_aswapl
 	DMB	$ISH
-	MOVW	R1, (R0)
-	MOVW	R2, R0
-	DMB	$ISH
 	RET
 
 /* inc variants */
 TEXT aincl+0(SB),1,$0
 	MOVW	delta+4(FP), R1
+	MOVW	R0, R2
 _aincl:
-	LDREX	(R0), R3
-	ADD	R1, R3
-	STREX	R3, (R0), R4
-	CMP	$0, R4
+	LDREX	(R2), R0
+	ADD	R1, R0
+	STREX	R0, (R2), R3
+	CMP	$0, R3
 	BNE	_aincl
-	MOVW	R3, R0
 	DMB	$ISH
 	RET
 
@@ -42,8 +43,8 @@
 	LDREX	(R0), R3
 	CMP	R1, R3
 	BNE	_acaslf
-	STREX	R2, (R0), R4
-	CMP	$0, R4
+	STREX	R2, (R0), R3
+	CMP	$0, R3
 	BNE	_acasl
 	MOVW	$1, R0
 	DMB	$ISH
--