github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/sync/atomic/asm_amd64p32.s (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Note: some of these functions are semantically inlined 6 // by the compiler (in src/cmd/compile/internal/gc/ssa.go). 7 8 #include "textflag.h" 9 10 TEXT ·SwapInt32(SB),NOSPLIT,$0-12 11 JMP ·SwapUint32(SB) 12 13 TEXT ·SwapUint32(SB),NOSPLIT,$0-12 14 MOVL addr+0(FP), BX 15 MOVL new+4(FP), AX 16 XCHGL AX, 0(BX) 17 MOVL AX, old+8(FP) 18 RET 19 20 TEXT ·SwapInt64(SB),NOSPLIT,$0-24 21 JMP ·SwapUint64(SB) 22 23 TEXT ·SwapUint64(SB),NOSPLIT,$0-24 24 MOVL addr+0(FP), BX 25 TESTL $7, BX 26 JZ 2(PC) 27 MOVL 0, BX // crash with nil ptr deref 28 MOVQ new+8(FP), AX 29 XCHGQ AX, 0(BX) 30 MOVQ AX, old+16(FP) 31 RET 32 33 TEXT ·SwapUintptr(SB),NOSPLIT,$0-12 34 JMP ·SwapUint32(SB) 35 36 TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-17 37 JMP ·CompareAndSwapUint32(SB) 38 39 TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-17 40 MOVL addr+0(FP), BX 41 MOVL old+4(FP), AX 42 MOVL new+8(FP), CX 43 LOCK 44 CMPXCHGL CX, 0(BX) 45 SETEQ swapped+16(FP) 46 RET 47 48 TEXT ·CompareAndSwapUintptr(SB),NOSPLIT,$0-17 49 JMP ·CompareAndSwapUint32(SB) 50 51 TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-25 52 JMP ·CompareAndSwapUint64(SB) 53 54 TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25 55 MOVL addr+0(FP), BX 56 MOVQ old+8(FP), AX 57 MOVQ new+16(FP), CX 58 LOCK 59 CMPXCHGQ CX, 0(BX) 60 SETEQ swapped+24(FP) 61 RET 62 63 TEXT ·AddInt32(SB),NOSPLIT,$0-12 64 JMP ·AddUint32(SB) 65 66 TEXT ·AddUint32(SB),NOSPLIT,$0-12 67 MOVL addr+0(FP), BX 68 MOVL delta+4(FP), AX 69 MOVL AX, CX 70 LOCK 71 XADDL AX, 0(BX) 72 ADDL AX, CX 73 MOVL CX, new+8(FP) 74 RET 75 76 TEXT ·AddUintptr(SB),NOSPLIT,$0-12 77 JMP ·AddUint32(SB) 78 79 TEXT ·AddInt64(SB),NOSPLIT,$0-24 80 JMP ·AddUint64(SB) 81 82 TEXT ·AddUint64(SB),NOSPLIT,$0-24 83 MOVL addr+0(FP), BX 84 MOVQ delta+8(FP), AX 85 MOVQ AX, CX 86 LOCK 87 XADDQ AX, 0(BX) 88 ADDQ AX, CX 89 MOVQ CX, new+16(FP) 90 RET 91 92 TEXT ·LoadInt32(SB),NOSPLIT,$0-12 93 JMP ·LoadUint32(SB) 94 95 TEXT ·LoadUint32(SB),NOSPLIT,$0-12 96 MOVL addr+0(FP), AX 97 MOVL 0(AX), AX 98 MOVL AX, val+8(FP) 99 RET 100 101 TEXT ·LoadInt64(SB),NOSPLIT,$0-16 102 JMP ·LoadUint64(SB) 103 104 TEXT ·LoadUint64(SB),NOSPLIT,$0-16 105 MOVL addr+0(FP), AX 106 MOVQ 0(AX), AX 107 MOVQ AX, val+8(FP) 108 RET 109 110 TEXT ·LoadUintptr(SB),NOSPLIT,$0-12 111 JMP ·LoadPointer(SB) 112 113 TEXT ·LoadPointer(SB),NOSPLIT,$0-12 114 MOVL addr+0(FP), AX 115 MOVL 0(AX), AX 116 MOVL AX, val+8(FP) 117 RET 118 119 TEXT ·StoreInt32(SB),NOSPLIT,$0-8 120 JMP ·StoreUint32(SB) 121 122 TEXT ·StoreUint32(SB),NOSPLIT,$0-8 123 MOVL addr+0(FP), BX 124 MOVL val+4(FP), AX 125 XCHGL AX, 0(BX) 126 RET 127 128 TEXT ·StoreInt64(SB),NOSPLIT,$0-16 129 JMP ·StoreUint64(SB) 130 131 TEXT ·StoreUint64(SB),NOSPLIT,$0-16 132 MOVL addr+0(FP), BX 133 MOVQ val+8(FP), AX 134 XCHGQ AX, 0(BX) 135 RET 136 137 TEXT ·StoreUintptr(SB),NOSPLIT,$0-8 138 JMP ·StoreUint32(SB)