github.com/4ad/go@v0.0.0-20161219182952-69a12818b605/src/runtime/internal/atomic/asm_sparc64.s (about) 1 // Copyright 2016 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 #include "asm_sparc64.h" 7 8 // bool cas(uint32 *ptr, uint32 old, uint32 new) 9 // Atomically: 10 // if(*val == old){ 11 // *val = new; 12 // return 1; 13 // } else 14 // return 0; 15 TEXT runtime∕internal∕atomic·Cas(SB), NOSPLIT, $0-17 16 MOVD ptr+0(FP), I1 17 MOVUW old+8(FP), I3 18 MOVUW new+12(FP), I5 19 MEM_SYNC 20 CASW (I1), I3, I5 21 CMP I5, I3 22 MOVD $0, I3 23 MOVE ICC, $1, I3 24 MEM_SYNC 25 MOVB I3, ret+16(FP) 26 RET 27 28 // bool runtime∕internal∕atomic·Cas64(uint64 *ptr, uint64 old, uint64 new) 29 // Atomically: 30 // if(*val == *old){ 31 // *val = new; 32 // return 1; 33 // } else { 34 // return 0; 35 // } 36 TEXT runtime∕internal∕atomic·Cas64(SB), NOSPLIT, $0-25 37 MOVD ptr+0(FP), I1 38 MOVD old+8(FP), I3 39 MOVD new+16(FP), I5 40 MEM_SYNC 41 CASD (I1), I3, I5 42 CMP I5, I3 43 MOVD $0, I3 44 MOVE XCC, $1, I3 45 MEM_SYNC 46 MOVB I3, ret+24(FP) 47 RET 48 49 TEXT runtime∕internal∕atomic·Casuintptr(SB), NOSPLIT|NOFRAME, $0-25 50 JMP runtime∕internal∕atomic·Cas64(SB) 51 52 TEXT runtime∕internal∕atomic·Loaduintptr(SB), NOSPLIT|NOFRAME, $0-16 53 JMP runtime∕internal∕atomic·Load64(SB) 54 55 TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT|NOFRAME, $0-16 56 JMP runtime∕internal∕atomic·Load64(SB) 57 58 TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT|NOFRAME, $0-16 59 JMP runtime∕internal∕atomic·Store64(SB) 60 61 TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT|NOFRAME, $0-24 62 JMP runtime∕internal∕atomic·Xadd64(SB) 63 64 TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT|NOFRAME, $0-16 65 JMP runtime∕internal∕atomic·Load64(SB) 66 67 TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT|NOFRAME, $0-24 68 JMP runtime∕internal∕atomic·Xadd64(SB) 69 70 // bool casp(void **val, void *old, void *new) 71 // Atomically: 72 // if(*val == old){ 73 // *val = new; 74 // return 1; 75 // } else 76 // return 0; 77 TEXT runtime∕internal∕atomic·Casp1(SB), NOSPLIT|NOFRAME, $0-25 78 JMP runtime∕internal∕atomic·Cas64(SB) 79 80 // uint32 xadd(uint32 volatile *ptr, int32 delta) 81 // Atomically: 82 // *val += delta; 83 // return *val; 84 TEXT runtime∕internal∕atomic·Xadd(SB), NOSPLIT, $0-20 85 MOVD ptr+0(FP), I4 86 MOVUW delta+8(FP), I3 87 MOVUW (I4), I1 88 MEM_SYNC 89 retry: 90 ADD I1, I3, I5 91 CASW (I4), I1, I5 92 CMP I1, I5 93 MOVNE ICC, I5, I1 94 BNEW retry 95 ADD I1, I3, I5 96 MEM_SYNC 97 MOVUW I5, ret+16(FP) 98 RET 99 100 TEXT runtime∕internal∕atomic·Xadd64(SB), NOSPLIT, $0-24 101 MOVD ptr+0(FP), I4 102 MOVD delta+8(FP), I3 103 MEM_SYNC 104 MOVD (I4), I1 105 retry: 106 ADD I1, I3, I5 107 CASD (I4), I1, I5 108 CMP I1, I5 109 MOVNE XCC, I5, I1 110 BNED retry 111 ADD I1, I3, I5 112 MEM_SYNC 113 MOVD I5, ret+16(FP) 114 RET 115 116 TEXT runtime∕internal∕atomic·Xchg(SB), NOSPLIT, $0-20 117 MOVD ptr+0(FP), I3 118 MOVUW new+8(FP), I1 119 again: 120 MEM_SYNC 121 MOVUW (I3), I5 122 CASW (I3), I5, I1 123 CMP I1, I5 124 BNEW again 125 MEM_SYNC 126 MOVUW I5, ret+16(FP) 127 RET 128 129 TEXT runtime∕internal∕atomic·Xchg64(SB), NOSPLIT, $0-24 130 MOVD ptr+0(FP), I3 131 MOVD new+8(FP), I1 132 again: 133 MEM_SYNC 134 MOVD (I3), I5 135 CASD (I3), I5, I1 136 CMP I1, I5 137 BNED again 138 MEM_SYNC 139 MOVD I5, ret+16(FP) 140 RET 141 142 TEXT runtime∕internal∕atomic·Xchguintptr(SB), NOSPLIT|NOFRAME, $0-24 143 JMP runtime∕internal∕atomic·Xchg64(SB) 144 145 146 // TODO(shawn): verify this is performed without a write barrier; 147 // see #15270. 148 TEXT runtime∕internal∕atomic·StorepNoWB(SB), NOSPLIT|NOFRAME, $0-16 149 JMP runtime∕internal∕atomic·Store64(SB) 150 151 TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12 152 MOVD ptr+0(FP), I3 153 MOVUW val+8(FP), I5 154 MEM_SYNC 155 STW I5, (I3) 156 MEM_SYNC 157 RET 158 159 TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16 160 MOVD ptr+0(FP), I3 161 MOVD val+8(FP), I5 162 MEM_SYNC 163 STD I5, (I3) 164 MEM_SYNC 165 RET