--- /n/sources/plan9/sys/src/libc/mips/atom.s Thu Sep 19 10:50:10 2013 +++ /sys/src/libc/mips/atom.s Sun Jun 21 00:00:00 2026 @@ -34,8 +34,10 @@ /* * int cas(uint* p, int ov, int nv); + * int casp(void** p, void* ov, void* nv); */ TEXT cas(SB), 1, $-4 +TEXT casp(SB), 1, $-4 MOVW ov+4(FP), R2 MOVW nv+8(FP), R3 spincas: --- /n/sources/plan9/sys/src/libc/mips64/atom.s Mon Sep 18 21:24:37 2017 +++ /sys/src/libc/mips64/atom.s Sun Jun 21 00:00:00 2026 @@ -4,6 +4,8 @@ #define LL(base, rt) WORD $((060<<26)|((base)<<21)|((rt)<<16)) #define SC(base, rt) WORD $((070<<26)|((base)<<21)|((rt)<<16)) +#define LLD(base, rt) WORD $((064<<26)|((base)<<21)|((rt)<<16)) +#define SCD(base, rt) WORD $((074<<26)|((base)<<21)|((rt)<<16)) #define NOOP WORD $0x27 TEXT ainc(SB), 1, $-8 /* long ainc(long *); */ @@ -50,3 +52,23 @@ fail: MOVV $0, R1 RET + +/* + * int casp(void** p, void* ov, void* nv); + * pointers are 64-bit, so compare and swap the whole doubleword + */ +TEXT casp(SB), 1, $-8 + MOVV ov+8(FP), R2 + MOVV nv+16(FP), R3 +spincasp: + LLD(1, 4) /* R4 = *R1 */ + NOOP + BNE R2, R4, faspl + SCD(1, 3) /* *R1 = R3 */ + NOOP + BEQ R3, spincasp /* R3 == 0 means store failed */ + MOVV $1, R1 + RET +faspl: + MOVV $0, R1 + RET