...

Text file src/runtime/memmove_mips64x.s

Documentation: runtime

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

View as plain text