Text file src/internal/runtime/atomic/atomic_amd64.s

     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  // 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 ·Loaduintptr(SB), NOSPLIT, $0-16
    11  	JMP	·Load64(SB)
    12  
    13  TEXT ·Loaduint(SB), NOSPLIT, $0-16
    14  	JMP	·Load64(SB)
    15  
    16  TEXT ·Loadint32(SB), NOSPLIT, $0-12
    17  	JMP	·Load(SB)
    18  
    19  TEXT ·Loadint64(SB), NOSPLIT, $0-16
    20  	JMP	·Load64(SB)
    21  
    22  // func Cas(ptr *int32, old, new int32) bool
    23  // Atomically:
    24  //	if *ptr == old {
    25  //		*ptr = new
    26  //		return true
    27  //	} else {
    28  //		return false
    29  //	}
    30  TEXT ·Cas(SB),NOSPLIT,$0-17
    31  	MOVQ	ptr+0(FP), BX
    32  	MOVL	old+8(FP), AX
    33  	MOVL	new+12(FP), CX
    34  	LOCK
    35  	CMPXCHGL	CX, 0(BX)
    36  	SETEQ	ret+16(FP)
    37  	RET
    38  
    39  // func Cas64(ptr *uint64, old, new uint64) bool
    40  // Atomically:
    41  //	if *ptr == old {
    42  //		*ptr = new
    43  //		return true
    44  //	} else {
    45  //		return false
    46  //	}
    47  TEXT ·Cas64(SB), NOSPLIT, $0-25
    48  	MOVQ	ptr+0(FP), BX
    49  	MOVQ	old+8(FP), AX
    50  	MOVQ	new+16(FP), CX
    51  	LOCK
    52  	CMPXCHGQ	CX, 0(BX)
    53  	SETEQ	ret+24(FP)
    54  	RET
    55  
    56  // func Casp1(ptr *unsafe.Pointer, old, new unsafe.Pointer) bool
    57  // Atomically:
    58  //	if *ptr == old {
    59  //		*ptr = new
    60  //		return true
    61  //	} else {
    62  //		return false
    63  // 	}
    64  TEXT ·Casp1(SB), NOSPLIT, $0-25
    65  	MOVQ	ptr+0(FP), BX
    66  	MOVQ	old+8(FP), AX
    67  	MOVQ	new+16(FP), CX
    68  	LOCK
    69  	CMPXCHGQ	CX, 0(BX)
    70  	SETEQ	ret+24(FP)
    71  	RET
    72  
    73  TEXT ·Casint32(SB), NOSPLIT, $0-17
    74  	JMP	·Cas(SB)
    75  
    76  TEXT ·Casint64(SB), NOSPLIT, $0-25
    77  	JMP	·Cas64(SB)
    78  
    79  TEXT ·Casuintptr(SB), NOSPLIT, $0-25
    80  	JMP	·Cas64(SB)
    81  
    82  TEXT ·CasRel(SB), NOSPLIT, $0-17
    83  	JMP	·Cas(SB)
    84  
    85  // uint32 Xadd(uint32 volatile *val, int32 delta)
    86  // Atomically:
    87  //	*val += delta;
    88  //	return *val;
    89  TEXT ·Xadd(SB), NOSPLIT, $0-20
    90  	MOVQ	ptr+0(FP), BX
    91  	MOVL	delta+8(FP), AX
    92  	MOVL	AX, CX
    93  	LOCK
    94  	XADDL	AX, 0(BX)
    95  	ADDL	CX, AX
    96  	MOVL	AX, ret+16(FP)
    97  	RET
    98  
    99  // uint64 Xadd64(uint64 volatile *val, int64 delta)
   100  // Atomically:
   101  //	*val += delta;
   102  //	return *val;
   103  TEXT ·Xadd64(SB), NOSPLIT, $0-24
   104  	MOVQ	ptr+0(FP), BX
   105  	MOVQ	delta+8(FP), AX
   106  	MOVQ	AX, CX
   107  	LOCK
   108  	XADDQ	AX, 0(BX)
   109  	ADDQ	CX, AX
   110  	MOVQ	AX, ret+16(FP)
   111  	RET
   112  
   113  TEXT ·Xaddint32(SB), NOSPLIT, $0-20
   114  	JMP	·Xadd(SB)
   115  
   116  TEXT ·Xaddint64(SB), NOSPLIT, $0-24
   117  	JMP	·Xadd64(SB)
   118  
   119  TEXT ·Xadduintptr(SB), NOSPLIT, $0-24
   120  	JMP	·Xadd64(SB)
   121  
   122  // uint8 Xchg(ptr *uint8, new uint8)
   123  // Atomically:
   124  //	old := *ptr;
   125  //	*ptr = new;
   126  //	return old;
   127  TEXT ·Xchg8(SB), NOSPLIT, $0-17
   128  	MOVQ	ptr+0(FP), BX
   129  	MOVB	new+8(FP), AX
   130  	XCHGB	AX, 0(BX)
   131  	MOVB	AX, ret+16(FP)
   132  	RET
   133  
   134  // uint32 Xchg(ptr *uint32, new uint32)
   135  // Atomically:
   136  //	old := *ptr;
   137  //	*ptr = new;
   138  //	return old;
   139  TEXT ·Xchg(SB), NOSPLIT, $0-20
   140  	MOVQ	ptr+0(FP), BX
   141  	MOVL	new+8(FP), AX
   142  	XCHGL	AX, 0(BX)
   143  	MOVL	AX, ret+16(FP)
   144  	RET
   145  
   146  // uint64 Xchg64(ptr *uint64, new uint64)
   147  // Atomically:
   148  //	old := *ptr;
   149  //	*ptr = new;
   150  //	return old;
   151  TEXT ·Xchg64(SB), NOSPLIT, $0-24
   152  	MOVQ	ptr+0(FP), BX
   153  	MOVQ	new+8(FP), AX
   154  	XCHGQ	AX, 0(BX)
   155  	MOVQ	AX, ret+16(FP)
   156  	RET
   157  
   158  TEXT ·Xchgint32(SB), NOSPLIT, $0-20
   159  	JMP	·Xchg(SB)
   160  
   161  TEXT ·Xchgint64(SB), NOSPLIT, $0-24
   162  	JMP	·Xchg64(SB)
   163  
   164  TEXT ·Xchguintptr(SB), NOSPLIT, $0-24
   165  	JMP	·Xchg64(SB)
   166  
   167  TEXT ·StorepNoWB(SB), NOSPLIT, $0-16
   168  	MOVQ	ptr+0(FP), BX
   169  	MOVQ	val+8(FP), AX
   170  	XCHGQ	AX, 0(BX)
   171  	RET
   172  
   173  TEXT ·Store(SB), NOSPLIT, $0-12
   174  	MOVQ	ptr+0(FP), BX
   175  	MOVL	val+8(FP), AX
   176  	XCHGL	AX, 0(BX)
   177  	RET
   178  
   179  TEXT ·Store8(SB), NOSPLIT, $0-9
   180  	MOVQ	ptr+0(FP), BX
   181  	MOVB	val+8(FP), AX
   182  	XCHGB	AX, 0(BX)
   183  	RET
   184  
   185  TEXT ·Store64(SB), NOSPLIT, $0-16
   186  	MOVQ	ptr+0(FP), BX
   187  	MOVQ	val+8(FP), AX
   188  	XCHGQ	AX, 0(BX)
   189  	RET
   190  
   191  TEXT ·Storeint32(SB), NOSPLIT, $0-12
   192  	JMP	·Store(SB)
   193  
   194  TEXT ·Storeint64(SB), NOSPLIT, $0-16
   195  	JMP	·Store64(SB)
   196  
   197  TEXT ·Storeuintptr(SB), NOSPLIT, $0-16
   198  	JMP	·Store64(SB)
   199  
   200  TEXT ·StoreRel(SB), NOSPLIT, $0-12
   201  	JMP	·Store(SB)
   202  
   203  TEXT ·StoreRel64(SB), NOSPLIT, $0-16
   204  	JMP	·Store64(SB)
   205  
   206  TEXT ·StoreReluintptr(SB), NOSPLIT, $0-16
   207  	JMP	·Store64(SB)
   208  
   209  // void	·Or8(byte volatile*, byte);
   210  TEXT ·Or8(SB), NOSPLIT, $0-9
   211  	MOVQ	ptr+0(FP), AX
   212  	MOVB	val+8(FP), BX
   213  	LOCK
   214  	ORB	BX, (AX)
   215  	RET
   216  
   217  // void	·And8(byte volatile*, byte);
   218  TEXT ·And8(SB), NOSPLIT, $0-9
   219  	MOVQ	ptr+0(FP), AX
   220  	MOVB	val+8(FP), BX
   221  	LOCK
   222  	ANDB	BX, (AX)
   223  	RET
   224  
   225  // func Or(addr *uint32, v uint32)
   226  TEXT ·Or(SB), NOSPLIT, $0-12
   227  	MOVQ	ptr+0(FP), AX
   228  	MOVL	val+8(FP), BX
   229  	LOCK
   230  	ORL	BX, (AX)
   231  	RET
   232  
   233  // func And(addr *uint32, v uint32)
   234  TEXT ·And(SB), NOSPLIT, $0-12
   235  	MOVQ	ptr+0(FP), AX
   236  	MOVL	val+8(FP), BX
   237  	LOCK
   238  	ANDL	BX, (AX)
   239  	RET
   240  
   241  // func Or32(addr *uint32, v uint32) old uint32
   242  TEXT ·Or32(SB), NOSPLIT, $0-20
   243  	MOVQ	ptr+0(FP), BX
   244  	MOVL	val+8(FP), CX
   245  casloop:
   246  	MOVL 	CX, DX
   247  	MOVL	(BX), AX
   248  	ORL	AX, DX
   249  	LOCK
   250  	CMPXCHGL	DX, (BX)
   251  	JNZ casloop
   252  	MOVL 	AX, ret+16(FP)
   253  	RET
   254  
   255  // func And32(addr *uint32, v uint32) old uint32
   256  TEXT ·And32(SB), NOSPLIT, $0-20
   257  	MOVQ	ptr+0(FP), BX
   258  	MOVL	val+8(FP), CX
   259  casloop:
   260  	MOVL 	CX, DX
   261  	MOVL	(BX), AX
   262  	ANDL	AX, DX
   263  	LOCK
   264  	CMPXCHGL	DX, (BX)
   265  	JNZ casloop
   266  	MOVL 	AX, ret+16(FP)
   267  	RET
   268  
   269  // func Or64(addr *uint64, v uint64) old uint64
   270  TEXT ·Or64(SB), NOSPLIT, $0-24
   271  	MOVQ	ptr+0(FP), BX
   272  	MOVQ	val+8(FP), CX
   273  casloop:
   274  	MOVQ 	CX, DX
   275  	MOVQ	(BX), AX
   276  	ORQ	AX, DX
   277  	LOCK
   278  	CMPXCHGQ	DX, (BX)
   279  	JNZ casloop
   280  	MOVQ 	AX, ret+16(FP)
   281  	RET
   282  
   283  // func And64(addr *uint64, v uint64) old uint64
   284  TEXT ·And64(SB), NOSPLIT, $0-24
   285  	MOVQ	ptr+0(FP), BX
   286  	MOVQ	val+8(FP), CX
   287  casloop:
   288  	MOVQ 	CX, DX
   289  	MOVQ	(BX), AX
   290  	ANDQ	AX, DX
   291  	LOCK
   292  	CMPXCHGQ	DX, (BX)
   293  	JNZ casloop
   294  	MOVQ 	AX, ret+16(FP)
   295  	RET
   296  
   297  // func Anduintptr(addr *uintptr, v uintptr) old uintptr
   298  TEXT ·Anduintptr(SB), NOSPLIT, $0-24
   299  	JMP	·And64(SB)
   300  
   301  // func Oruintptr(addr *uintptr, v uintptr) old uintptr
   302  TEXT ·Oruintptr(SB), NOSPLIT, $0-24
   303  	JMP	·Or64(SB)
   304  

View as plain text