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