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