Loading arguments of Xchg(64) and Xadd(64) functions to registers
could be done only once.
Change-Id: Iaf0a695ec9c6a221dfa755855edb68c476978a5b
Reviewed-on: https://go-review.googlesource.com/c/go/+/227001
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
RET
TEXT runtime∕internal∕atomic·Xchg(SB), NOSPLIT, $0-20
-again:
MOVD ptr+0(FP), R0
MOVW new+8(FP), R1
+again:
LDAXRW (R0), R2
STLXRW R1, (R0), R3
CBNZ R3, again
RET
TEXT runtime∕internal∕atomic·Xchg64(SB), NOSPLIT, $0-24
-again:
MOVD ptr+0(FP), R0
MOVD new+8(FP), R1
+again:
LDAXR (R0), R2
STLXR R1, (R0), R3
CBNZ R3, again
// *val += delta;
// return *val;
TEXT runtime∕internal∕atomic·Xadd(SB), NOSPLIT, $0-20
-again:
MOVD ptr+0(FP), R0
MOVW delta+8(FP), R1
+again:
LDAXRW (R0), R2
ADDW R2, R1, R2
STLXRW R2, (R0), R3
RET
TEXT runtime∕internal∕atomic·Xadd64(SB), NOSPLIT, $0-24
-again:
MOVD ptr+0(FP), R0
MOVD delta+8(FP), R1
+again:
LDAXR (R0), R2
ADD R2, R1, R2
STLXR R2, (R0), R3