Black Lives Matter. Support the Equal Justice Initiative.

Text file src/runtime/memclr_mips64x.s

Documentation: runtime

     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  //go:build mips64 || mips64le
     6  // +build mips64 mips64le
     7  
     8  #include "go_asm.h"
     9  #include "textflag.h"
    10  
    11  // See memclrNoHeapPointers Go doc for important implementation constraints.
    12  
    13  // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
    14  TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16
    15  	MOVV	ptr+0(FP), R1
    16  	MOVV	n+8(FP), R2
    17  	ADDV	R1, R2, R4
    18  
    19  	// if less than 16 bytes or no MSA, do words check
    20  	SGTU	$16, R2, R3
    21  	BNE	R3, no_msa
    22  	MOVBU	internal∕cpu·MIPS64X+const_offsetMIPS64XHasMSA(SB), R3
    23  	BEQ	R3, R0, no_msa
    24  
    25  	VMOVB	$0, W0
    26  
    27  	SGTU	$128, R2, R3
    28  	BEQ	R3, msa_large
    29  
    30  	AND	$15, R2, R5
    31  	XOR	R2, R5, R6
    32  	ADDVU	R1, R6
    33  
    34  msa_small:
    35  	VMOVB	W0, (R1)
    36  	ADDVU	$16, R1
    37  	SGTU	R6, R1, R3
    38  	BNE	R3, R0, msa_small
    39  	BEQ	R5, R0, done
    40  	VMOVB	W0, -16(R4)
    41  	JMP	done
    42  
    43  msa_large:
    44  	AND	$127, R2, R5
    45  	XOR	R2, R5, R6
    46  	ADDVU	R1, R6
    47  
    48  msa_large_loop:
    49  	VMOVB	W0, (R1)
    50  	VMOVB	W0, 16(R1)
    51  	VMOVB	W0, 32(R1)
    52  	VMOVB	W0, 48(R1)
    53  	VMOVB	W0, 64(R1)
    54  	VMOVB	W0, 80(R1)
    55  	VMOVB	W0, 96(R1)
    56  	VMOVB	W0, 112(R1)
    57  
    58  	ADDVU	$128, R1
    59  	SGTU	R6, R1, R3
    60  	BNE	R3, R0, msa_large_loop
    61  	BEQ	R5, R0, done
    62  	VMOVB	W0, -128(R4)
    63  	VMOVB	W0, -112(R4)
    64  	VMOVB	W0, -96(R4)
    65  	VMOVB	W0, -80(R4)
    66  	VMOVB	W0, -64(R4)
    67  	VMOVB	W0, -48(R4)
    68  	VMOVB	W0, -32(R4)
    69  	VMOVB	W0, -16(R4)
    70  	JMP	done
    71  
    72  no_msa:
    73  	// if less than 8 bytes, do one byte at a time
    74  	SGTU	$8, R2, R3
    75  	BNE	R3, out
    76  
    77  	// do one byte at a time until 8-aligned
    78  	AND	$7, R1, R3
    79  	BEQ	R3, words
    80  	MOVB	R0, (R1)
    81  	ADDV	$1, R1
    82  	JMP	-4(PC)
    83  
    84  words:
    85  	// do 8 bytes at a time if there is room
    86  	ADDV	$-7, R4, R2
    87  
    88  	SGTU	R2, R1, R3
    89  	BEQ	R3, out
    90  	MOVV	R0, (R1)
    91  	ADDV	$8, R1
    92  	JMP	-4(PC)
    93  
    94  out:
    95  	BEQ	R1, R4, done
    96  	MOVB	R0, (R1)
    97  	ADDV	$1, R1
    98  	JMP	-3(PC)
    99  done:
   100  	RET
   101  

View as plain text