...

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

View as plain text