diff options
author | Joel Sing <joel@sing.id.au> | 2020-02-21 02:50:57 +1100 |
---|---|---|
committer | Joel Sing <joel@sing.id.au> | 2020-03-15 08:13:28 +0000 |
commit | 10635921e511ef82b5eabe98928e42901fd3f822 (patch) | |
tree | 5bc17d9acd5552e58d2659a060f2f8473b5236a4 /src/runtime/internal | |
parent | 85a8526a7e8d12a31f2f1d9ebcec2841a27dc493 (diff) | |
download | go-10635921e511ef82b5eabe98928e42901fd3f822.tar.gz go-10635921e511ef82b5eabe98928e42901fd3f822.zip |
cmd/asm,cmd/internal/obj/riscv: add atomic memory operation instructions
Use instructions in place of currently used defines.
Updates #36765
Change-Id: I00bb59e77b1aace549d7857cc9721ba2cb4ac6ca
Reviewed-on: https://go-review.googlesource.com/c/go/+/220541
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/runtime/internal')
-rw-r--r-- | src/runtime/internal/atomic/atomic_riscv64.s | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/src/runtime/internal/atomic/atomic_riscv64.s b/src/runtime/internal/atomic/atomic_riscv64.s index e4b7902d52..d005325ca3 100644 --- a/src/runtime/internal/atomic/atomic_riscv64.s +++ b/src/runtime/internal/atomic/atomic_riscv64.s @@ -30,15 +30,6 @@ #include "textflag.h" -#define AMOWSC(op,rd,rs1,rs2) WORD $0x0600202f+rd<<7+rs1<<15+rs2<<20+op<<27 -#define AMODSC(op,rd,rs1,rs2) WORD $0x0600302f+rd<<7+rs1<<15+rs2<<20+op<<27 -#define ADD_ 0 -#define SWAP_ 1 -#define LR_ 2 -#define SC_ 3 -#define OR_ 8 -#define AND_ 12 - // Atomically: // if(*val == *old){ // *val = new; @@ -108,7 +99,7 @@ TEXT ·Load64(SB),NOSPLIT|NOFRAME,$0-16 TEXT ·Store(SB), NOSPLIT, $0-12 MOV ptr+0(FP), A0 MOVW val+8(FP), A1 - AMOWSC(SWAP_,0,10,11) + AMOSWAPW A1, (A0), ZERO RET // func Store8(ptr *uint8, val uint8) @@ -124,7 +115,7 @@ TEXT ·Store8(SB), NOSPLIT, $0-9 TEXT ·Store64(SB), NOSPLIT, $0-16 MOV ptr+0(FP), A0 MOV val+8(FP), A1 - AMODSC(SWAP_,0,10,11) + AMOSWAPD A1, (A0), ZERO RET TEXT ·Casp1(SB), NOSPLIT, $0-25 @@ -151,7 +142,7 @@ TEXT ·Loadint64(SB),NOSPLIT,$0-16 TEXT ·Xaddint64(SB),NOSPLIT,$0-24 MOV ptr+0(FP), A0 MOV delta+8(FP), A1 - WORD $0x04b5352f // amoadd.d.aq a0,a1,(a0) + AMOADDD A1, (A0), A0 ADD A0, A1, A0 MOVW A0, ret+16(FP) RET @@ -174,7 +165,7 @@ TEXT ·StoreRel(SB), NOSPLIT, $0-12 TEXT ·Xchg(SB), NOSPLIT, $0-20 MOV ptr+0(FP), A0 MOVW new+8(FP), A1 - AMOWSC(SWAP_,11,10,11) + AMOSWAPW A1, (A0), A1 MOVW A1, ret+16(FP) RET @@ -182,7 +173,7 @@ TEXT ·Xchg(SB), NOSPLIT, $0-20 TEXT ·Xchg64(SB), NOSPLIT, $0-24 MOV ptr+0(FP), A0 MOV new+8(FP), A1 - AMODSC(SWAP_,11,10,11) + AMOSWAPD A1, (A0), A1 MOV A1, ret+16(FP) RET @@ -194,7 +185,7 @@ TEXT ·Xchg64(SB), NOSPLIT, $0-24 TEXT ·Xadd(SB), NOSPLIT, $0-20 MOV ptr+0(FP), A0 MOVW delta+8(FP), A1 - AMOWSC(ADD_,12,10,11) + AMOADDW A1, (A0), A2 ADD A2,A1,A0 MOVW A0, ret+16(FP) RET @@ -203,8 +194,8 @@ TEXT ·Xadd(SB), NOSPLIT, $0-20 TEXT ·Xadd64(SB), NOSPLIT, $0-24 MOV ptr+0(FP), A0 MOV delta+8(FP), A1 - AMODSC(ADD_,12,10,11) - ADD A2,A1,A0 + AMOADDD A1, (A0), A2 + ADD A2, A1, A0 MOV A0, ret+16(FP) RET @@ -226,7 +217,7 @@ TEXT ·And8(SB), NOSPLIT, $0-9 XOR $255, A1 SLL A2, A1 XOR $-1, A1 - AMOWSC(AND_,0,10,11) + AMOANDW A1, (A0), ZERO RET // func Or8(ptr *uint8, val uint8) @@ -237,5 +228,5 @@ TEXT ·Or8(SB), NOSPLIT, $0-9 AND $-4, A0 SLL $3, A2 SLL A2, A1 - AMOWSC(OR_,0,10,11) + AMOORW A1, (A0), ZERO RET |