1/* 2 * risc-v test-and-set 3 * assumes A extension 4 */ 5 6#define LINK R1 7#define SP R2 8#define ARG 8 9 10#define SYNC WORD $0xf /* FENCE */ 11#define LRW(rs2, rs1, rd) \ 12 WORD $((2<<27)|( 0<<20)|((rs1)<<15)|(2<<12)|((rd)<<7)|057) 13#define SCW(rs2, rs1, rd) \ 14 WORD $((3<<27)|((rs2)<<20)|((rs1)<<15)|(2<<12)|((rd)<<7)|057) 15 16/* atomically set (RARG) non-zero and return previous contents */ 17 TEXT _tas(SB), $-4 18 MOVW R(ARG), R12 /* address of key */ 19 MOVW $1, R10 20 SYNC 21tas1: 22 LRW(0, 12, ARG) // LR_W R0, R12, RARG /* (R12) -> R(ARG) */ 23 SCW(10, 12, 14) // SC_W R10, R12, R14 /* R10 -> (R12) maybe, R14=0 if ok */ 24 BNE R14, tas1 25 RET 26