...

Text file src/runtime/internal/atomic/asm_mips64x.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	// +build mips64 mips64le
     6	
     7	#include "textflag.h"
     8	
     9	// bool cas(uint32 *ptr, uint32 old, uint32 new)
    10	// Atomically:
    11	//	if(*val == old){
    12	//		*val = new;
    13	//		return 1;
    14	//	} else
    15	//		return 0;
    16	TEXT ·Cas(SB), NOSPLIT, $0-17
    17		MOVV	ptr+0(FP), R1
    18		MOVW	old+8(FP), R2
    19		MOVW	new+12(FP), R5
    20		SYNC
    21	cas_again:
    22		MOVV	R5, R3
    23		LL	(R1), R4
    24		BNE	R2, R4, cas_fail
    25		SC	R3, (R1)
    26		BEQ	R3, cas_again
    27		MOVV	$1, R1
    28		MOVB	R1, ret+16(FP)
    29		SYNC
    30		RET
    31	cas_fail:
    32		MOVV	$0, R1
    33		JMP	-4(PC)
    34	
    35	// bool	cas64(uint64 *ptr, uint64 old, uint64 new)
    36	// Atomically:
    37	//	if(*val == *old){
    38	//		*val = new;
    39	//		return 1;
    40	//	} else {
    41	//		return 0;
    42	//	}
    43	TEXT ·Cas64(SB), NOSPLIT, $0-25
    44		MOVV	ptr+0(FP), R1
    45		MOVV	old+8(FP), R2
    46		MOVV	new+16(FP), R5
    47		SYNC
    48	cas64_again:
    49		MOVV	R5, R3
    50		LLV	(R1), R4
    51		BNE	R2, R4, cas64_fail
    52		SCV	R3, (R1)
    53		BEQ	R3, cas64_again
    54		MOVV	$1, R1
    55		MOVB	R1, ret+24(FP)
    56		SYNC
    57		RET
    58	cas64_fail:
    59		MOVV	$0, R1
    60		JMP	-4(PC)
    61	
    62	TEXT ·Casuintptr(SB), NOSPLIT, $0-25
    63		JMP	·Cas64(SB)
    64	
    65	TEXT ·CasRel(SB), NOSPLIT, $0-17
    66		JMP	·Cas(SB)
    67	
    68	TEXT ·Loaduintptr(SB),  NOSPLIT|NOFRAME, $0-16
    69		JMP	·Load64(SB)
    70	
    71	TEXT ·Loaduint(SB), NOSPLIT|NOFRAME, $0-16
    72		JMP	·Load64(SB)
    73	
    74	TEXT ·Storeuintptr(SB), NOSPLIT, $0-16
    75		JMP	·Store64(SB)
    76	
    77	TEXT ·Xadduintptr(SB), NOSPLIT, $0-24
    78		JMP	·Xadd64(SB)
    79	
    80	TEXT ·Loadint64(SB), NOSPLIT, $0-16
    81		JMP	·Load64(SB)
    82	
    83	TEXT ·Xaddint64(SB), NOSPLIT, $0-24
    84		JMP	·Xadd64(SB)
    85	
    86	// bool casp(void **val, void *old, void *new)
    87	// Atomically:
    88	//	if(*val == old){
    89	//		*val = new;
    90	//		return 1;
    91	//	} else
    92	//		return 0;
    93	TEXT ·Casp1(SB), NOSPLIT, $0-25
    94		JMP runtime∕internal∕atomic·Cas64(SB)
    95	
    96	// uint32 xadd(uint32 volatile *ptr, int32 delta)
    97	// Atomically:
    98	//	*val += delta;
    99	//	return *val;
   100	TEXT ·Xadd(SB), NOSPLIT, $0-20
   101		MOVV	ptr+0(FP), R2
   102		MOVW	delta+8(FP), R3
   103		SYNC
   104		LL	(R2), R1
   105		ADDU	R1, R3, R4
   106		MOVV	R4, R1
   107		SC	R4, (R2)
   108		BEQ	R4, -4(PC)
   109		MOVW	R1, ret+16(FP)
   110		SYNC
   111		RET
   112	
   113	TEXT ·Xadd64(SB), NOSPLIT, $0-24
   114		MOVV	ptr+0(FP), R2
   115		MOVV	delta+8(FP), R3
   116		SYNC
   117		LLV	(R2), R1
   118		ADDVU	R1, R3, R4
   119		MOVV	R4, R1
   120		SCV	R4, (R2)
   121		BEQ	R4, -4(PC)
   122		MOVV	R1, ret+16(FP)
   123		SYNC
   124		RET
   125	
   126	TEXT ·Xchg(SB), NOSPLIT, $0-20
   127		MOVV	ptr+0(FP), R2
   128		MOVW	new+8(FP), R5
   129	
   130		SYNC
   131		MOVV	R5, R3
   132		LL	(R2), R1
   133		SC	R3, (R2)
   134		BEQ	R3, -3(PC)
   135		MOVW	R1, ret+16(FP)
   136		SYNC
   137		RET
   138	
   139	TEXT ·Xchg64(SB), NOSPLIT, $0-24
   140		MOVV	ptr+0(FP), R2
   141		MOVV	new+8(FP), R5
   142	
   143		SYNC
   144		MOVV	R5, R3
   145		LLV	(R2), R1
   146		SCV	R3, (R2)
   147		BEQ	R3, -3(PC)
   148		MOVV	R1, ret+16(FP)
   149		SYNC
   150		RET
   151	
   152	TEXT ·Xchguintptr(SB), NOSPLIT, $0-24
   153		JMP	·Xchg64(SB)
   154	
   155	TEXT ·StorepNoWB(SB), NOSPLIT, $0-16
   156		JMP	·Store64(SB)
   157	
   158	TEXT ·StoreRel(SB), NOSPLIT, $0-12
   159		JMP	·Store(SB)
   160	
   161	TEXT ·Store(SB), NOSPLIT, $0-12
   162		MOVV	ptr+0(FP), R1
   163		MOVW	val+8(FP), R2
   164		SYNC
   165		MOVW	R2, 0(R1)
   166		SYNC
   167		RET
   168	
   169	TEXT ·Store64(SB), NOSPLIT, $0-16
   170		MOVV	ptr+0(FP), R1
   171		MOVV	val+8(FP), R2
   172		SYNC
   173		MOVV	R2, 0(R1)
   174		SYNC
   175		RET
   176	
   177	// void	Or8(byte volatile*, byte);
   178	TEXT ·Or8(SB), NOSPLIT, $0-9
   179		MOVV	ptr+0(FP), R1
   180		MOVBU	val+8(FP), R2
   181		// Align ptr down to 4 bytes so we can use 32-bit load/store.
   182		MOVV	$~3, R3
   183		AND	R1, R3
   184		// Compute val shift.
   185	#ifdef GOARCH_mips64
   186		// Big endian.  ptr = ptr ^ 3
   187		XOR	$3, R1
   188	#endif
   189		// R4 = ((ptr & 3) * 8)
   190		AND	$3, R1, R4
   191		SLLV	$3, R4
   192		// Shift val for aligned ptr. R2 = val << R4
   193		SLLV	R4, R2
   194	
   195		SYNC
   196		LL	(R3), R4
   197		OR	R2, R4
   198		SC	R4, (R3)
   199		BEQ	R4, -4(PC)
   200		SYNC
   201		RET
   202	
   203	// void	And8(byte volatile*, byte);
   204	TEXT ·And8(SB), NOSPLIT, $0-9
   205		MOVV	ptr+0(FP), R1
   206		MOVBU	val+8(FP), R2
   207		// Align ptr down to 4 bytes so we can use 32-bit load/store.
   208		MOVV	$~3, R3
   209		AND	R1, R3
   210		// Compute val shift.
   211	#ifdef GOARCH_mips64
   212		// Big endian.  ptr = ptr ^ 3
   213		XOR	$3, R1
   214	#endif
   215		// R4 = ((ptr & 3) * 8)
   216		AND	$3, R1, R4
   217		SLLV	$3, R4
   218		// Shift val for aligned ptr. R2 = val << R4 | ^(0xFF << R4)
   219		MOVV	$0xFF, R5
   220		SLLV	R4, R2
   221		SLLV	R4, R5
   222		NOR	R0, R5
   223		OR	R5, R2
   224	
   225		SYNC
   226		LL	(R3), R4
   227		AND	R2, R4
   228		SC	R4, (R3)
   229		BEQ	R4, -4(PC)
   230		SYNC
   231		RET

View as plain text