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