github.com/mtsmfm/go/src@v0.0.0-20221020090648-44bdcb9f8fde/runtime/memclr_riscv64.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  
     7  // See memclrNoHeapPointers Go doc for important implementation constraints.
     8  
     9  // void runtime·memclrNoHeapPointers(void*, uintptr)
    10  TEXT runtime·memclrNoHeapPointers<ABIInternal>(SB),NOSPLIT,$0-16
    11  #ifndef GOEXPERIMENT_regabiargs
    12  	MOV	ptr+0(FP), X10
    13  	MOV	n+8(FP), X11
    14  #endif
    15  
    16  	// If less than 8 bytes, do single byte zeroing.
    17  	MOV	$8, X9
    18  	BLT	X11, X9, check4
    19  
    20  	// Check alignment
    21  	AND	$3, X10, X5
    22  	BEQZ	X5, aligned
    23  
    24  	// Zero one byte at a time until we reach 8 byte alignment.
    25  	SUB	X5, X11, X11
    26  align:
    27  	ADD	$-1, X5
    28  	MOVB	ZERO, 0(X10)
    29  	ADD	$1, X10
    30  	BNEZ	X5, align
    31  
    32  aligned:
    33  	MOV	$8, X9
    34  	BLT	X11, X9, check4
    35  	MOV	$16, X9
    36  	BLT	X11, X9, zero8
    37  	MOV	$32, X9
    38  	BLT	X11, X9, zero16
    39  	MOV	$64, X9
    40  	BLT	X11, X9, zero32
    41  loop64:
    42  	MOV	ZERO, 0(X10)
    43  	MOV	ZERO, 8(X10)
    44  	MOV	ZERO, 16(X10)
    45  	MOV	ZERO, 24(X10)
    46  	MOV	ZERO, 32(X10)
    47  	MOV	ZERO, 40(X10)
    48  	MOV	ZERO, 48(X10)
    49  	MOV	ZERO, 56(X10)
    50  	ADD	$64, X10
    51  	ADD	$-64, X11
    52  	BGE	X11, X9, loop64
    53  	BEQZ	X11, done
    54  
    55  check32:
    56  	MOV	$32, X9
    57  	BLT	X11, X9, check16
    58  zero32:
    59  	MOV	ZERO, 0(X10)
    60  	MOV	ZERO, 8(X10)
    61  	MOV	ZERO, 16(X10)
    62  	MOV	ZERO, 24(X10)
    63  	ADD	$32, X10
    64  	ADD	$-32, X11
    65  	BEQZ	X11, done
    66  
    67  check16:
    68  	MOV	$16, X9
    69  	BLT	X11, X9, check8
    70  zero16:
    71  	MOV	ZERO, 0(X10)
    72  	MOV	ZERO, 8(X10)
    73  	ADD	$16, X10
    74  	ADD	$-16, X11
    75  	BEQZ	X11, done
    76  
    77  check8:
    78  	MOV	$8, X9
    79  	BLT	X11, X9, check4
    80  zero8:
    81  	MOV	ZERO, 0(X10)
    82  	ADD	$8, X10
    83  	ADD	$-8, X11
    84  	BEQZ	X11, done
    85  
    86  check4:
    87  	MOV	$4, X9
    88  	BLT	X11, X9, loop1
    89  zero4:
    90  	MOVB	ZERO, 0(X10)
    91  	MOVB	ZERO, 1(X10)
    92  	MOVB	ZERO, 2(X10)
    93  	MOVB	ZERO, 3(X10)
    94  	ADD	$4, X10
    95  	ADD	$-4, X11
    96  
    97  loop1:
    98  	BEQZ	X11, done
    99  	MOVB	ZERO, 0(X10)
   100  	ADD	$1, X10
   101  	ADD	$-1, X11
   102  	JMP	loop1
   103  
   104  done:
   105  	RET