X7ROOT File Manager
Current Path:
/opt/golang/1.22.0/src/runtime/internal/atomic
opt
/
golang
/
1.22.0
/
src
/
runtime
/
internal
/
atomic
/
馃搧
..
馃搫
atomic_386.go
(2.22 KB)
馃搫
atomic_386.s
(6.53 KB)
馃搫
atomic_amd64.go
(2.46 KB)
馃搫
atomic_amd64.s
(5.18 KB)
馃搫
atomic_andor_generic.go
(1.06 KB)
馃搫
atomic_andor_test.go
(5.14 KB)
馃搫
atomic_arm.go
(4.74 KB)
馃搫
atomic_arm.s
(5.69 KB)
馃搫
atomic_arm64.go
(2.15 KB)
馃搫
atomic_arm64.s
(8.26 KB)
馃搫
atomic_loong64.go
(1.76 KB)
馃搫
atomic_loong64.s
(5.25 KB)
馃搫
atomic_mips64x.go
(1.77 KB)
馃搫
atomic_mips64x.s
(6.08 KB)
馃搫
atomic_mipsx.go
(2.66 KB)
馃搫
atomic_mipsx.s
(4.3 KB)
馃搫
atomic_ppc64x.go
(2.12 KB)
馃搫
atomic_ppc64x.s
(7.49 KB)
馃搫
atomic_riscv64.go
(2.03 KB)
馃搫
atomic_riscv64.s
(6.99 KB)
馃搫
atomic_s390x.go
(2.12 KB)
馃搫
atomic_s390x.s
(5.89 KB)
馃搫
atomic_test.go
(8.52 KB)
馃搫
atomic_wasm.go
(5.32 KB)
馃搫
atomic_wasm.s
(269 B)
馃搫
bench_test.go
(3.24 KB)
馃搫
doc.go
(771 B)
馃搫
stubs.go
(1.23 KB)
馃搫
sys_linux_arm.s
(2.84 KB)
馃搫
sys_nonlinux_arm.s
(1.33 KB)
馃搫
types.go
(14.23 KB)
馃搫
types_64bit.go
(1.1 KB)
馃搫
unaligned.go
(246 B)
Editing: atomic_riscv64.s
// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // RISC-V's atomic operations have two bits, aq ("acquire") and rl ("release"), // which may be toggled on and off. Their precise semantics are defined in // section 6.3 of the specification, but the basic idea is as follows: // // - If neither aq nor rl is set, the CPU may reorder the atomic arbitrarily. // It guarantees only that it will execute atomically. // // - If aq is set, the CPU may move the instruction backward, but not forward. // // - If rl is set, the CPU may move the instruction forward, but not backward. // // - If both are set, the CPU may not reorder the instruction at all. // // These four modes correspond to other well-known memory models on other CPUs. // On ARM, aq corresponds to a dmb ishst, aq+rl corresponds to a dmb ish. On // Intel, aq corresponds to an lfence, rl to an sfence, and aq+rl to an mfence // (or a lock prefix). // // Go's memory model requires that // - if a read happens after a write, the read must observe the write, and // that // - if a read happens concurrently with a write, the read may observe the // write. // aq is sufficient to guarantee this, so that's what we use here. (This jibes // with ARM, which uses dmb ishst.) #include "textflag.h" // func Cas(ptr *uint64, old, new uint64) bool // Atomically: // if(*val == old){ // *val = new; // return 1; // } else { // return 0; // } TEXT 路Cas(SB), NOSPLIT, $0-17 MOV ptr+0(FP), A0 MOVW old+8(FP), A1 MOVW new+12(FP), A2 cas_again: LRW (A0), A3 BNE A3, A1, cas_fail SCW A2, (A0), A4 BNE A4, ZERO, cas_again MOV $1, A0 MOVB A0, ret+16(FP) RET cas_fail: MOV $0, A0 MOV A0, ret+16(FP) RET // func Cas64(ptr *uint64, old, new uint64) bool TEXT 路Cas64(SB), NOSPLIT, $0-25 MOV ptr+0(FP), A0 MOV old+8(FP), A1 MOV new+16(FP), A2 cas_again: LRD (A0), A3 BNE A3, A1, cas_fail SCD A2, (A0), A4 BNE A4, ZERO, cas_again MOV $1, A0 MOVB A0, ret+24(FP) RET cas_fail: MOVB ZERO, ret+24(FP) RET // func Load(ptr *uint32) uint32 TEXT 路Load(SB),NOSPLIT|NOFRAME,$0-12 MOV ptr+0(FP), A0 LRW (A0), A0 MOVW A0, ret+8(FP) RET // func Load8(ptr *uint8) uint8 TEXT 路Load8(SB),NOSPLIT|NOFRAME,$0-9 MOV ptr+0(FP), A0 FENCE MOVBU (A0), A1 FENCE MOVB A1, ret+8(FP) RET // func Load64(ptr *uint64) uint64 TEXT 路Load64(SB),NOSPLIT|NOFRAME,$0-16 MOV ptr+0(FP), A0 LRD (A0), A0 MOV A0, ret+8(FP) RET // func Store(ptr *uint32, val uint32) TEXT 路Store(SB), NOSPLIT, $0-12 MOV ptr+0(FP), A0 MOVW val+8(FP), A1 AMOSWAPW A1, (A0), ZERO RET // func Store8(ptr *uint8, val uint8) TEXT 路Store8(SB), NOSPLIT, $0-9 MOV ptr+0(FP), A0 MOVBU val+8(FP), A1 FENCE MOVB A1, (A0) FENCE RET // func Store64(ptr *uint64, val uint64) TEXT 路Store64(SB), NOSPLIT, $0-16 MOV ptr+0(FP), A0 MOV val+8(FP), A1 AMOSWAPD A1, (A0), ZERO RET TEXT 路Casp1(SB), NOSPLIT, $0-25 JMP 路Cas64(SB) TEXT 路Casint32(SB),NOSPLIT,$0-17 JMP 路Cas(SB) TEXT 路Casint64(SB),NOSPLIT,$0-25 JMP 路Cas64(SB) TEXT 路Casuintptr(SB),NOSPLIT,$0-25 JMP 路Cas64(SB) TEXT 路CasRel(SB), NOSPLIT, $0-17 JMP 路Cas(SB) TEXT 路Loaduintptr(SB),NOSPLIT,$0-16 JMP 路Load64(SB) TEXT 路Storeint32(SB),NOSPLIT,$0-12 JMP 路Store(SB) TEXT 路Storeint64(SB),NOSPLIT,$0-16 JMP 路Store64(SB) TEXT 路Storeuintptr(SB),NOSPLIT,$0-16 JMP 路Store64(SB) TEXT 路Loaduint(SB),NOSPLIT,$0-16 JMP 路Loaduintptr(SB) TEXT 路Loadint32(SB),NOSPLIT,$0-12 JMP 路Load(SB) TEXT 路Loadint64(SB),NOSPLIT,$0-16 JMP 路Load64(SB) TEXT 路Xaddint32(SB),NOSPLIT,$0-20 JMP 路Xadd(SB) TEXT 路Xaddint64(SB),NOSPLIT,$0-24 MOV ptr+0(FP), A0 MOV delta+8(FP), A1 AMOADDD A1, (A0), A0 ADD A0, A1, A0 MOVW A0, ret+16(FP) RET TEXT 路LoadAcq(SB),NOSPLIT|NOFRAME,$0-12 JMP 路Load(SB) TEXT 路LoadAcq64(SB),NOSPLIT|NOFRAME,$0-16 JMP 路Load64(SB) TEXT 路LoadAcquintptr(SB),NOSPLIT|NOFRAME,$0-16 JMP 路Load64(SB) // func Loadp(ptr unsafe.Pointer) unsafe.Pointer TEXT 路Loadp(SB),NOSPLIT,$0-16 JMP 路Load64(SB) // func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) TEXT 路StorepNoWB(SB), NOSPLIT, $0-16 JMP 路Store64(SB) TEXT 路StoreRel(SB), NOSPLIT, $0-12 JMP 路Store(SB) TEXT 路StoreRel64(SB), NOSPLIT, $0-16 JMP 路Store64(SB) TEXT 路StoreReluintptr(SB), NOSPLIT, $0-16 JMP 路Store64(SB) // func Xchg(ptr *uint32, new uint32) uint32 TEXT 路Xchg(SB), NOSPLIT, $0-20 MOV ptr+0(FP), A0 MOVW new+8(FP), A1 AMOSWAPW A1, (A0), A1 MOVW A1, ret+16(FP) RET // func Xchg64(ptr *uint64, new uint64) uint64 TEXT 路Xchg64(SB), NOSPLIT, $0-24 MOV ptr+0(FP), A0 MOV new+8(FP), A1 AMOSWAPD A1, (A0), A1 MOV A1, ret+16(FP) RET // Atomically: // *val += delta; // return *val; // func Xadd(ptr *uint32, delta int32) uint32 TEXT 路Xadd(SB), NOSPLIT, $0-20 MOV ptr+0(FP), A0 MOVW delta+8(FP), A1 AMOADDW A1, (A0), A2 ADD A2,A1,A0 MOVW A0, ret+16(FP) RET // func Xadd64(ptr *uint64, delta int64) uint64 TEXT 路Xadd64(SB), NOSPLIT, $0-24 MOV ptr+0(FP), A0 MOV delta+8(FP), A1 AMOADDD A1, (A0), A2 ADD A2, A1, A0 MOV A0, ret+16(FP) RET // func Xadduintptr(ptr *uintptr, delta uintptr) uintptr TEXT 路Xadduintptr(SB), NOSPLIT, $0-24 JMP 路Xadd64(SB) // func Xchgint32(ptr *int32, new int32) int32 TEXT 路Xchgint32(SB), NOSPLIT, $0-20 JMP 路Xchg(SB) // func Xchgint64(ptr *int64, new int64) int64 TEXT 路Xchgint64(SB), NOSPLIT, $0-24 JMP 路Xchg64(SB) // func Xchguintptr(ptr *uintptr, new uintptr) uintptr TEXT 路Xchguintptr(SB), NOSPLIT, $0-24 JMP 路Xchg64(SB) // func And8(ptr *uint8, val uint8) TEXT 路And8(SB), NOSPLIT, $0-9 MOV ptr+0(FP), A0 MOVBU val+8(FP), A1 AND $3, A0, A2 AND $-4, A0 SLL $3, A2 XOR $255, A1 SLL A2, A1 XOR $-1, A1 AMOANDW A1, (A0), ZERO RET // func Or8(ptr *uint8, val uint8) TEXT 路Or8(SB), NOSPLIT, $0-9 MOV ptr+0(FP), A0 MOVBU val+8(FP), A1 AND $3, A0, A2 AND $-4, A0 SLL $3, A2 SLL A2, A1 AMOORW A1, (A0), ZERO RET // func And(ptr *uint32, val uint32) TEXT 路And(SB), NOSPLIT, $0-12 MOV ptr+0(FP), A0 MOVW val+8(FP), A1 AMOANDW A1, (A0), ZERO RET // func Or(ptr *uint32, val uint32) TEXT 路Or(SB), NOSPLIT, $0-12 MOV ptr+0(FP), A0 MOVW val+8(FP), A1 AMOORW A1, (A0), ZERO RET // func Or32(ptr *uint32, val uint32) uint32 TEXT 路Or32(SB), NOSPLIT, $0-20 MOV ptr+0(FP), A0 MOVW val+8(FP), A1 AMOORW A1, (A0), A2 MOVW A2, ret+16(FP) RET // func And32(ptr *uint32, val uint32) uint32 TEXT 路And32(SB), NOSPLIT, $0-20 MOV ptr+0(FP), A0 MOVW val+8(FP), A1 AMOANDW A1, (A0), A2 MOVW A2, ret+16(FP) RET // func Or64(ptr *uint64, val uint64) uint64 TEXT 路Or64(SB), NOSPLIT, $0-24 MOV ptr+0(FP), A0 MOV val+8(FP), A1 AMOORD A1, (A0), A2 MOV A2, ret+16(FP) RET // func And64(ptr *uint64, val uint64) uint64 TEXT 路And64(SB), NOSPLIT, $0-24 MOV ptr+0(FP), A0 MOV val+8(FP), A1 AMOANDD A1, (A0), A2 MOV A2, ret+16(FP) RET // func Anduintptr(ptr *uintptr, val uintptr) uintptr TEXT 路Anduintptr(SB), NOSPLIT, $0-24 JMP 路And64(SB) // func Oruintptr(ptr *uintptr, val uintptr) uintptr TEXT 路Oruintptr(SB), NOSPLIT, $0-24 JMP 路Or64(SB)
Upload File
Create Folder