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