Text file src/runtime/memmove_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 memmove Go doc for important implementation constraints.
     8  
     9  // void runtime·memmove(void*, void*, uintptr)
    10  TEXT runtime·memmove(SB),NOSPLIT,$-0-24
    11  	MOV	to+0(FP), T0
    12  	MOV	from+8(FP), T1
    13  	MOV	n+16(FP), T2
    14  	ADD	T1, T2, T5
    15  
    16  	// If the destination is ahead of the source, start at the end of the
    17  	// buffer and go backward.
    18  	BLTU	T1, T0, b
    19  
    20  	// If less than eight bytes, do one byte at a time.
    21  	SLTU	$8, T2, T3
    22  	BNE	T3, ZERO, f_outcheck
    23  
    24  	// Do one byte at a time until from is eight-aligned.
    25  	JMP	f_aligncheck
    26  f_align:
    27  	MOVB	(T1), T3
    28  	MOVB	T3, (T0)
    29  	ADD	$1, T0
    30  	ADD	$1, T1
    31  f_aligncheck:
    32  	AND	$7, T1, T3
    33  	BNE	T3, ZERO, f_align
    34  
    35  	// Do eight bytes at a time as long as there is room.
    36  	ADD	$-7, T5, T6
    37  	JMP	f_wordscheck
    38  f_words:
    39  	MOV	(T1), T3
    40  	MOV	T3, (T0)
    41  	ADD	$8, T0
    42  	ADD	$8, T1
    43  f_wordscheck:
    44  	SLTU	T6, T1, T3
    45  	BNE	T3, ZERO, f_words
    46  
    47  	// Finish off the remaining partial word.
    48  	JMP 	f_outcheck
    49  f_out:
    50  	MOVB	(T1), T3
    51  	MOVB	T3, (T0)
    52  	ADD	$1, T0
    53  	ADD	$1, T1
    54  f_outcheck:
    55  	BNE	T1, T5, f_out
    56  
    57  	RET
    58  
    59  b:
    60  	ADD	T0, T2, T4
    61  	// If less than eight bytes, do one byte at a time.
    62  	SLTU	$8, T2, T3
    63  	BNE	T3, ZERO, b_outcheck
    64  
    65  	// Do one byte at a time until from+n is eight-aligned.
    66  	JMP	b_aligncheck
    67  b_align:
    68  	ADD	$-1, T4
    69  	ADD	$-1, T5
    70  	MOVB	(T5), T3
    71  	MOVB	T3, (T4)
    72  b_aligncheck:
    73  	AND	$7, T5, T3
    74  	BNE	T3, ZERO, b_align
    75  
    76  	// Do eight bytes at a time as long as there is room.
    77  	ADD	$7, T1, T6
    78  	JMP	b_wordscheck
    79  b_words:
    80  	ADD	$-8, T4
    81  	ADD	$-8, T5
    82  	MOV	(T5), T3
    83  	MOV	T3, (T4)
    84  b_wordscheck:
    85  	SLTU	T5, T6, T3
    86  	BNE	T3, ZERO, b_words
    87  
    88  	// Finish off the remaining partial word.
    89  	JMP	b_outcheck
    90  b_out:
    91  	ADD	$-1, T4
    92  	ADD	$-1, T5
    93  	MOVB	(T5), T3
    94  	MOVB	T3, (T4)
    95  b_outcheck:
    96  	BNE	T5, T1, b_out
    97  
    98  	RET
    99  

View as plain text