Text file src/runtime/memclr_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  //go:build mips64 || mips64le
     6  
     7  #include "go_asm.h"
     8  #include "textflag.h"
     9  
    10  // See memclrNoHeapPointers Go doc for important implementation constraints.
    11  
    12  // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
    13  TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16
    14  	MOVV	ptr+0(FP), R1
    15  	MOVV	n+8(FP), R2
    16  	ADDV	R1, R2, R4
    17  
    18  	// if less than 16 bytes or no MSA, do words check
    19  	SGTU	$16, R2, R3
    20  	BNE	R3, no_msa
    21  	MOVBU	internal∕cpu·MIPS64X+const_offsetMIPS64XHasMSA(SB), R3
    22  	BEQ	R3, R0, no_msa
    23  
    24  	VMOVB	$0, W0
    25  
    26  	SGTU	$128, R2, R3
    27  	BEQ	R3, msa_large
    28  
    29  	AND	$15, R2, R5
    30  	XOR	R2, R5, R6
    31  	ADDVU	R1, R6
    32  
    33  msa_small:
    34  	VMOVB	W0, (R1)
    35  	ADDVU	$16, R1
    36  	SGTU	R6, R1, R3
    37  	BNE	R3, R0, msa_small
    38  	BEQ	R5, R0, done
    39  	VMOVB	W0, -16(R4)
    40  	JMP	done
    41  
    42  msa_large:
    43  	AND	$127, R2, R5
    44  	XOR	R2, R5, R6
    45  	ADDVU	R1, R6
    46  
    47  msa_large_loop:
    48  	VMOVB	W0, (R1)
    49  	VMOVB	W0, 16(R1)
    50  	VMOVB	W0, 32(R1)
    51  	VMOVB	W0, 48(R1)
    52  	VMOVB	W0, 64(R1)
    53  	VMOVB	W0, 80(R1)
    54  	VMOVB	W0, 96(R1)
    55  	VMOVB	W0, 112(R1)
    56  
    57  	ADDVU	$128, R1
    58  	SGTU	R6, R1, R3
    59  	BNE	R3, R0, msa_large_loop
    60  	BEQ	R5, R0, done
    61  	VMOVB	W0, -128(R4)
    62  	VMOVB	W0, -112(R4)
    63  	VMOVB	W0, -96(R4)
    64  	VMOVB	W0, -80(R4)
    65  	VMOVB	W0, -64(R4)
    66  	VMOVB	W0, -48(R4)
    67  	VMOVB	W0, -32(R4)
    68  	VMOVB	W0, -16(R4)
    69  	JMP	done
    70  
    71  no_msa:
    72  	// if less than 8 bytes, do one byte at a time
    73  	SGTU	$8, R2, R3
    74  	BNE	R3, check4
    75  
    76  	// Check alignment
    77  	AND	$7, R1, R3
    78  	BEQ	R3, aligned
    79  
    80  	// Zero one byte at a time until we reach 8 byte alignment.
    81  	MOVV	$8, R5
    82  	SUBV	R3, R5, R3
    83  	SUBV	R3, R2, R2
    84  align:
    85  	SUBV	$1, R3
    86  	MOVB	R0, (R1)
    87  	ADDV	$1, R1
    88  	BNE	R3, align
    89  
    90  aligned:
    91  	SGTU	$8, R2, R3
    92  	BNE	R3, check4
    93  	SGTU	$16, R2, R3
    94  	BNE	R3, zero8
    95  	SGTU	$32, R2, R3
    96  	BNE	R3, zero16
    97  	SGTU	$64, R2, R3
    98  	BNE	R3, zero32
    99  loop64:
   100  	MOVV	R0, (R1)
   101  	MOVV	R0, 8(R1)
   102  	MOVV	R0, 16(R1)
   103  	MOVV	R0, 24(R1)
   104  	MOVV	R0, 32(R1)
   105  	MOVV	R0, 40(R1)
   106  	MOVV	R0, 48(R1)
   107  	MOVV	R0, 56(R1)
   108  	ADDV	$64, R1
   109  	SUBV	$64, R2
   110  	SGTU	$64, R2, R3
   111  	BEQ	R0, R3, loop64
   112  	BEQ	R2, done
   113  
   114  check32:
   115  	SGTU	$32, R2, R3
   116  	BNE	R3, check16
   117  zero32:
   118  	MOVV	R0, (R1)
   119  	MOVV	R0, 8(R1)
   120  	MOVV	R0, 16(R1)
   121  	MOVV	R0, 24(R1)
   122  	ADDV	$32, R1
   123  	SUBV	$32, R2
   124  	BEQ	R2, done
   125  
   126  check16:
   127  	SGTU	$16, R2, R3
   128  	BNE	R3, check8
   129  zero16:
   130  	MOVV	R0, (R1)
   131  	MOVV	R0, 8(R1)
   132  	ADDV	$16, R1
   133  	SUBV	$16, R2
   134  	BEQ	R2, done
   135  
   136  check8:
   137  	SGTU	$8, R2, R3
   138  	BNE	R3, check4
   139  zero8:
   140  	MOVV	R0, (R1)
   141  	ADDV	$8, R1
   142  	SUBV	$8, R2
   143  	BEQ	R2, done
   144  
   145  check4:
   146  	SGTU	$4, R2, R3
   147  	BNE	R3, loop1
   148  zero4:
   149  	MOVB	R0, (R1)
   150  	MOVB	R0, 1(R1)
   151  	MOVB	R0, 2(R1)
   152  	MOVB	R0, 3(R1)
   153  	ADDV	$4, R1
   154  	SUBV	$4, R2
   155  
   156  loop1:
   157  	BEQ	R1, R4, done
   158  	MOVB	R0, (R1)
   159  	ADDV	$1, R1
   160  	JMP	loop1
   161  done:
   162  	RET
   163  
   164  

View as plain text