shithub: gefs

Download patch

ref: 81c844499bad5a0ca67be38fd6a90d254f208dd8
parent: 90c65adbd50f21bc2802438d03451c7845b8e43f
author: Ori Bernstein <ori@eigenstate.org>
date: Mon May 13 23:01:33 EDT 2024

atomic: add power64 implementation (untested)

let's crib what go has, and use it for the upcoming
power64 9front port.

--- /dev/null
+++ b/atomic-power64.s
@@ -1,0 +1,106 @@
+/*  get variants */
+TEXT agetl+0(SB),1,$0
+	SYNC
+	// See ISA 3.0B section B.2.3, "Safe Fetch"
+	MOVWZ	0(R3), R3
+	CMPW	R3, R3, CR7
+	BC	4, 30, 1(PC) // bne- cr7,0x4
+	ISYNC
+	MOVW	R3, ret+8(FP)
+	RETURN
+
+TEXT agetv+0(SB),1,$0
+TEXT agetp+0(SB),1,$0
+	SYNC
+	// See ISA 3.0B section B.2.3, "Safe Fetch"
+	MOVD	0(R3), R3
+	CMP	R3, R3, CR7
+	BC	4, 30, 1(PC) // bne- cr7,0x4
+	ISYNC
+	MOVD	R3, ret+8(FP)
+	RETURN
+
+/*  set variants */
+TEXT asetl+0(SB),1,$0
+	MOVW	val+8(FP), R4
+	SYNC
+	MOVW	R4, 0(R3)
+	RETURN
+
+TEXT asetv+0(SB),1,$0
+TEXT asetp+0(SB),1,$0
+	MOVD	val+8(FP), R4
+	SYNC
+	MOVD	R4, 0(R3)
+	RETURN
+
+/*  inc variants */
+TEXT aincl+0(SB),1,$0
+	MOVD	R3, R4
+	MOVW	delta+8(FP), R5
+	LWSYNC
+	LWAR	(R4), R3
+	ADD	R5, R3
+	STWCCC	R3, (R4)
+	BNE	-3(PC)
+	MOVW	R3, ret+16(FP)
+	RETURN
+
+TEXT aincv+0(SB),1,$0
+TEXT aincp+0(SB),1,$0
+	MOVD	delta+8(FP), R5
+	LWSYNC
+	LDAR	(R3), R4
+	ADD	R5, R4
+	STDCCC	R4, (R3)
+	BNE	-3(PC)
+	MOVD	R4, ret+16(FP)
+	RETURN
+
+/*  cas variants */
+TEXT acasl+0(SB),1,$0
+	MOVWZ	old+8(FP), R4
+	MOVWZ	new+12(FP), R5
+	LWSYNC
+casagain:
+	LWAR	(R3), R6
+	CMPW	R6, R4
+	BNE	casfail
+	STWCCC	R5, (R3)
+	BNE	casagain
+	MOVD	$1, R3
+	LWSYNC
+	MOVB	R3, ret+16(FP)
+	RETURN
+casfail:
+	LWSYNC
+	MOVB	R0, ret+16(FP)
+	RETURN
+
+TEXT acasv+0(SB),1,$0
+TEXT acasp+0(SB),1,$0
+	MOVD	old+8(FP), R4
+	MOVD	new+16(FP), R5
+	LWSYNC
+cas64again:
+	LDAR	(R3), R6
+	CMP	R6, R4
+	BNE	cas64fail
+	STDCCC	R5, (R3)
+	BNE	cas64again
+	MOVD	$1, R3
+	LWSYNC
+	MOVB	R3, ret+24(FP)
+	RETURN
+cas64fail:
+	LWSYNC
+	MOVB	R0, ret+24(FP)
+	RETURN
+
+/* barriers */
+TEXT coherence+0(SB),1,$0
+	// LWSYNC is the "export" barrier recommended by Power ISA
+	// v2.07 book II, appendix B.2.2.2.
+	// LWSYNC is a load/load, load/store, and store/store barrier.
+	LWSYNC
+	RETURN