github.com/aloncn/graphics-go@v0.0.1/src/runtime/internal/atomic/asm_amd64.s (about) 1 // Copyright 2015 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 #include "textflag.h" 6 7 // bool Cas(int32 *val, int32 old, int32 new) 8 // Atomically: 9 // if(*val == old){ 10 // *val = new; 11 // return 1; 12 // } else 13 // return 0; 14 TEXT runtime∕internal∕atomic·Cas(SB),NOSPLIT,$0-17 15 MOVQ ptr+0(FP), BX 16 MOVL old+8(FP), AX 17 MOVL new+12(FP), CX 18 LOCK 19 CMPXCHGL CX, 0(BX) 20 SETEQ ret+16(FP) 21 RET 22 23 // bool runtime∕internal∕atomic·Cas64(uint64 *val, uint64 old, uint64 new) 24 // Atomically: 25 // if(*val == *old){ 26 // *val = new; 27 // return 1; 28 // } else { 29 // return 0; 30 // } 31 TEXT runtime∕internal∕atomic·Cas64(SB), NOSPLIT, $0-25 32 MOVQ ptr+0(FP), BX 33 MOVQ old+8(FP), AX 34 MOVQ new+16(FP), CX 35 LOCK 36 CMPXCHGQ CX, 0(BX) 37 SETEQ ret+24(FP) 38 RET 39 40 TEXT runtime∕internal∕atomic·Casuintptr(SB), NOSPLIT, $0-25 41 JMP runtime∕internal∕atomic·Cas64(SB) 42 43 TEXT runtime∕internal∕atomic·Loaduintptr(SB), NOSPLIT, $0-16 44 JMP runtime∕internal∕atomic·Load64(SB) 45 46 TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT, $0-16 47 JMP runtime∕internal∕atomic·Load64(SB) 48 49 TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-16 50 JMP runtime∕internal∕atomic·Store64(SB) 51 52 TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 53 JMP runtime∕internal∕atomic·Load64(SB) 54 55 TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-16 56 JMP runtime∕internal∕atomic·Xadd64(SB) 57 58 // bool Casp(void **val, void *old, void *new) 59 // Atomically: 60 // if(*val == old){ 61 // *val = new; 62 // return 1; 63 // } else 64 // return 0; 65 TEXT runtime∕internal∕atomic·Casp1(SB), NOSPLIT, $0-25 66 MOVQ ptr+0(FP), BX 67 MOVQ old+8(FP), AX 68 MOVQ new+16(FP), CX 69 LOCK 70 CMPXCHGQ CX, 0(BX) 71 SETEQ ret+24(FP) 72 RET 73 74 // uint32 Xadd(uint32 volatile *val, int32 delta) 75 // Atomically: 76 // *val += delta; 77 // return *val; 78 TEXT runtime∕internal∕atomic·Xadd(SB), NOSPLIT, $0-20 79 MOVQ ptr+0(FP), BX 80 MOVL delta+8(FP), AX 81 MOVL AX, CX 82 LOCK 83 XADDL AX, 0(BX) 84 ADDL CX, AX 85 MOVL AX, ret+16(FP) 86 RET 87 88 TEXT runtime∕internal∕atomic·Xadd64(SB), NOSPLIT, $0-24 89 MOVQ ptr+0(FP), BX 90 MOVQ delta+8(FP), AX 91 MOVQ AX, CX 92 LOCK 93 XADDQ AX, 0(BX) 94 ADDQ CX, AX 95 MOVQ AX, ret+16(FP) 96 RET 97 98 TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-24 99 JMP runtime∕internal∕atomic·Xadd64(SB) 100 101 TEXT runtime∕internal∕atomic·Xchg(SB), NOSPLIT, $0-20 102 MOVQ ptr+0(FP), BX 103 MOVL new+8(FP), AX 104 XCHGL AX, 0(BX) 105 MOVL AX, ret+16(FP) 106 RET 107 108 TEXT runtime∕internal∕atomic·Xchg64(SB), NOSPLIT, $0-24 109 MOVQ ptr+0(FP), BX 110 MOVQ new+8(FP), AX 111 XCHGQ AX, 0(BX) 112 MOVQ AX, ret+16(FP) 113 RET 114 115 TEXT runtime∕internal∕atomic·Xchguintptr(SB), NOSPLIT, $0-24 116 JMP runtime∕internal∕atomic·Xchg64(SB) 117 118 TEXT runtime∕internal∕atomic·Storep1(SB), NOSPLIT, $0-16 119 MOVQ ptr+0(FP), BX 120 MOVQ val+8(FP), AX 121 XCHGQ AX, 0(BX) 122 RET 123 124 TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12 125 MOVQ ptr+0(FP), BX 126 MOVL val+8(FP), AX 127 XCHGL AX, 0(BX) 128 RET 129 130 TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16 131 MOVQ ptr+0(FP), BX 132 MOVQ val+8(FP), AX 133 XCHGQ AX, 0(BX) 134 RET 135 136 // void runtime∕internal∕atomic·Or8(byte volatile*, byte); 137 TEXT runtime∕internal∕atomic·Or8(SB), NOSPLIT, $0-9 138 MOVQ ptr+0(FP), AX 139 MOVB val+8(FP), BX 140 LOCK 141 ORB BX, (AX) 142 RET 143 144 // void runtime∕internal∕atomic·And8(byte volatile*, byte); 145 TEXT runtime∕internal∕atomic·And8(SB), NOSPLIT, $0-9 146 MOVQ ptr+0(FP), AX 147 MOVB val+8(FP), BX 148 LOCK 149 ANDB BX, (AX) 150 RET