...

Text file src/runtime/memmove_loong64.s

Documentation: runtime

     1// Copyright 2022 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// func memmove(to, from unsafe.Pointer, n uintptr)
    10TEXT runtime·memmove<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-24
    11	BNE	R6, check
    12	RET
    13
    14check:
    15	SGTU	R4, R5, R7
    16	BNE	R7, backward
    17
    18	ADDV	R4, R6, R9 // end pointer
    19
    20	// if the two pointers are not of same alignments, do byte copying
    21	SUBVU	R5, R4, R7
    22	AND	$7, R7
    23	BNE	R7, out
    24
    25	// if less than 8 bytes, do byte copying
    26	SGTU	$8, R6, R7
    27	BNE	R7, out
    28
    29	// do one byte at a time until 8-aligned
    30	AND	$7, R4, R8
    31	BEQ	R8, words
    32	MOVB	(R5), R7
    33	ADDV	$1, R5
    34	MOVB	R7, (R4)
    35	ADDV	$1, R4
    36	JMP	-6(PC)
    37
    38words:
    39	// do 8 bytes at a time if there is room
    40	ADDV	$-7, R9, R6 // R6 is end pointer-7
    41
    42	PCALIGN	$16
    43	SGTU	R6, R4, R8
    44	BEQ	R8, out
    45	MOVV	(R5), R7
    46	ADDV	$8, R5
    47	MOVV	R7, (R4)
    48	ADDV	$8, R4
    49	JMP	-6(PC)
    50
    51out:
    52	BEQ	R4, R9, done
    53	MOVB	(R5), R7
    54	ADDV	$1, R5
    55	MOVB	R7, (R4)
    56	ADDV	$1, R4
    57	JMP	-5(PC)
    58done:
    59	RET
    60
    61backward:
    62	ADDV	R6, R5 // from-end pointer
    63	ADDV	R4, R6, R9 // to-end pointer
    64
    65	// if the two pointers are not of same alignments, do byte copying
    66	SUBVU	R9, R5, R7
    67	AND	$7, R7
    68	BNE	R7, out1
    69
    70	// if less than 8 bytes, do byte copying
    71	SGTU	$8, R6, R7
    72	BNE	R7, out1
    73
    74	// do one byte at a time until 8-aligned
    75	AND	$7, R9, R8
    76	BEQ	R8, words1
    77	ADDV	$-1, R5
    78	MOVB	(R5), R7
    79	ADDV	$-1, R9
    80	MOVB	R7, (R9)
    81	JMP	-6(PC)
    82
    83words1:
    84	// do 8 bytes at a time if there is room
    85	ADDV	$7, R4, R6 // R6 is start pointer+7
    86
    87	PCALIGN	$16
    88	SGTU	R9, R6, R8
    89	BEQ	R8, out1
    90	ADDV	$-8, R5
    91	MOVV	(R5), R7
    92	ADDV	$-8, R9
    93	MOVV	R7, (R9)
    94	JMP	-6(PC)
    95
    96out1:
    97	BEQ	R4, R9, done1
    98	ADDV	$-1, R5
    99	MOVB	(R5), R7
   100	ADDV	$-1, R9
   101	MOVB	R7, (R9)
   102	JMP	-5(PC)
   103done1:
   104	RET

View as plain text