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
--
⑨