Text file src/runtime/memclr_riscv64.s

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

View as plain text