github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/runtime/memmove_mipsx.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  // +build mips mipsle
     6  
     7  #include "textflag.h"
     8  
     9  #ifdef GOARCH_mips
    10  #define MOVWHI  MOVWL
    11  #define MOVWLO  MOVWR
    12  #else
    13  #define MOVWHI  MOVWR
    14  #define MOVWLO  MOVWL
    15  #endif
    16  
    17  // void runtime·memmove(void*, void*, uintptr)
    18  TEXT runtime·memmove(SB),NOSPLIT,$-0-12
    19  	MOVW	n+8(FP), R3
    20  	MOVW	from+4(FP), R2
    21  	MOVW	to+0(FP), R1
    22  
    23  	ADDU	R3, R2, R4	// end pointer for source
    24  	ADDU	R3, R1, R5	// end pointer for destination
    25  
    26  	// if destination is ahead of source, start at the end of the buffer and go backward.
    27  	SGTU	R1, R2, R6
    28  	BNE	R6, backward
    29  
    30  	// if less than 4 bytes, use byte by byte copying
    31  	SGTU	$4, R3, R6
    32  	BNE	R6, f_small_copy
    33  
    34  	// align destination to 4 bytes
    35  	AND	$3, R1, R6
    36  	BEQ	R6, f_dest_aligned
    37  	SUBU	R1, R0, R6
    38  	AND	$3, R6
    39  	MOVWHI	0(R2), R7
    40  	SUBU	R6, R3
    41  	MOVWLO	3(R2), R7
    42  	ADDU	R6, R2
    43  	MOVWHI	R7, 0(R1)
    44  	ADDU	R6, R1
    45  
    46  f_dest_aligned:
    47  	AND	$31, R3, R7
    48  	AND	$3, R3, R6
    49  	SUBU	R7, R5, R7	// end pointer for 32-byte chunks
    50  	SUBU	R6, R5, R6	// end pointer for 4-byte chunks
    51  
    52  	// if source is not aligned, use unaligned reads
    53  	AND	$3, R2, R8
    54  	BNE	R8, f_large_ua
    55  
    56  f_large:
    57  	BEQ	R1, R7, f_words
    58  	ADDU	$32, R1
    59  	MOVW	0(R2), R8
    60  	MOVW	4(R2), R9
    61  	MOVW	8(R2), R10
    62  	MOVW	12(R2), R11
    63  	MOVW	16(R2), R12
    64  	MOVW	20(R2), R13
    65  	MOVW	24(R2), R14
    66  	MOVW	28(R2), R15
    67  	ADDU	$32, R2
    68  	MOVW	R8, -32(R1)
    69  	MOVW	R9, -28(R1)
    70  	MOVW	R10, -24(R1)
    71  	MOVW	R11, -20(R1)
    72  	MOVW	R12, -16(R1)
    73  	MOVW	R13, -12(R1)
    74  	MOVW	R14, -8(R1)
    75  	MOVW	R15, -4(R1)
    76  	JMP	f_large
    77  
    78  f_words:
    79  	BEQ	R1, R6, f_tail
    80  	ADDU	$4, R1
    81  	MOVW	0(R2), R8
    82  	ADDU	$4, R2
    83  	MOVW	R8, -4(R1)
    84  	JMP	f_words
    85  
    86  f_tail:
    87  	BEQ	R1, R5, ret
    88  	MOVWLO	-1(R4), R8
    89  	MOVWLO	R8, -1(R5)
    90  
    91  ret:
    92  	RET
    93  
    94  f_large_ua:
    95  	BEQ	R1, R7, f_words_ua
    96  	ADDU	$32, R1
    97  	MOVWHI	0(R2), R8
    98  	MOVWHI	4(R2), R9
    99  	MOVWHI	8(R2), R10
   100  	MOVWHI	12(R2), R11
   101  	MOVWHI	16(R2), R12
   102  	MOVWHI	20(R2), R13
   103  	MOVWHI	24(R2), R14
   104  	MOVWHI	28(R2), R15
   105  	MOVWLO	3(R2), R8
   106  	MOVWLO	7(R2), R9
   107  	MOVWLO	11(R2), R10
   108  	MOVWLO	15(R2), R11
   109  	MOVWLO	19(R2), R12
   110  	MOVWLO	23(R2), R13
   111  	MOVWLO	27(R2), R14
   112  	MOVWLO	31(R2), R15
   113  	ADDU	$32, R2
   114  	MOVW	R8, -32(R1)
   115  	MOVW	R9, -28(R1)
   116  	MOVW	R10, -24(R1)
   117  	MOVW	R11, -20(R1)
   118  	MOVW	R12, -16(R1)
   119  	MOVW	R13, -12(R1)
   120  	MOVW	R14, -8(R1)
   121  	MOVW	R15, -4(R1)
   122  	JMP	f_large_ua
   123  
   124  f_words_ua:
   125  	BEQ	R1, R6, f_tail_ua
   126  	MOVWHI	0(R2), R8
   127  	ADDU	$4, R1
   128  	MOVWLO	3(R2), R8
   129  	ADDU	$4, R2
   130  	MOVW	R8, -4(R1)
   131  	JMP	f_words_ua
   132  
   133  f_tail_ua:
   134  	BEQ	R1, R5, ret
   135  	MOVWHI	-4(R4), R8
   136  	MOVWLO	-1(R4), R8
   137  	MOVWLO	R8, -1(R5)
   138  	JMP	ret
   139  
   140  f_small_copy:
   141  	BEQ	R1, R5, ret
   142  	ADDU	$1, R1
   143  	MOVB	0(R2), R6
   144  	ADDU	$1, R2
   145  	MOVB	R6, -1(R1)
   146  	JMP	f_small_copy
   147  
   148  backward:
   149  	SGTU	$4, R3, R6
   150  	BNE	R6, b_small_copy
   151  
   152  	AND	$3, R5, R6
   153  	BEQ	R6, b_dest_aligned
   154  	MOVWHI	-4(R4), R7
   155  	SUBU	R6, R3
   156  	MOVWLO	-1(R4), R7
   157  	SUBU	R6, R4
   158  	MOVWLO	R7, -1(R5)
   159  	SUBU	R6, R5
   160  
   161  b_dest_aligned:
   162  	AND	$31, R3, R7
   163  	AND	$3, R3, R6
   164  	ADDU	R7, R1, R7
   165  	ADDU	R6, R1, R6
   166  
   167  	AND	$3, R4, R8
   168  	BNE	R8, b_large_ua
   169  
   170  b_large:
   171  	BEQ	R5, R7, b_words
   172  	ADDU	$-32, R5
   173  	MOVW	-4(R4), R8
   174  	MOVW	-8(R4), R9
   175  	MOVW	-12(R4), R10
   176  	MOVW	-16(R4), R11
   177  	MOVW	-20(R4), R12
   178  	MOVW	-24(R4), R13
   179  	MOVW	-28(R4), R14
   180  	MOVW	-32(R4), R15
   181  	ADDU	$-32, R4
   182  	MOVW	R8, 28(R5)
   183  	MOVW	R9, 24(R5)
   184  	MOVW	R10, 20(R5)
   185  	MOVW	R11, 16(R5)
   186  	MOVW	R12, 12(R5)
   187  	MOVW	R13, 8(R5)
   188  	MOVW	R14, 4(R5)
   189  	MOVW	R15, 0(R5)
   190  	JMP	b_large
   191  
   192  b_words:
   193  	BEQ	R5, R6, b_tail
   194  	ADDU	$-4, R5
   195  	MOVW	-4(R4), R8
   196  	ADDU	$-4, R4
   197  	MOVW	R8, 0(R5)
   198  	JMP	b_words
   199  
   200  b_tail:
   201  	BEQ	R5, R1, ret
   202  	MOVWHI	0(R2), R8	// R2 and R1 have the same alignment so we don't need to load a whole word
   203  	MOVWHI	R8, 0(R1)
   204  	JMP	ret
   205  
   206  b_large_ua:
   207  	BEQ	R5, R7, b_words_ua
   208  	ADDU	$-32, R5
   209  	MOVWHI	-4(R4), R8
   210  	MOVWHI	-8(R4), R9
   211  	MOVWHI	-12(R4), R10
   212  	MOVWHI	-16(R4), R11
   213  	MOVWHI	-20(R4), R12
   214  	MOVWHI	-24(R4), R13
   215  	MOVWHI	-28(R4), R14
   216  	MOVWHI	-32(R4), R15
   217  	MOVWLO	-1(R4), R8
   218  	MOVWLO	-5(R4), R9
   219  	MOVWLO	-9(R4), R10
   220  	MOVWLO	-13(R4), R11
   221  	MOVWLO	-17(R4), R12
   222  	MOVWLO	-21(R4), R13
   223  	MOVWLO	-25(R4), R14
   224  	MOVWLO	-29(R4), R15
   225  	ADDU	$-32, R4
   226  	MOVW	R8, 28(R5)
   227  	MOVW	R9, 24(R5)
   228  	MOVW	R10, 20(R5)
   229  	MOVW	R11, 16(R5)
   230  	MOVW	R12, 12(R5)
   231  	MOVW	R13, 8(R5)
   232  	MOVW	R14, 4(R5)
   233  	MOVW	R15, 0(R5)
   234  	JMP	b_large_ua
   235  
   236  b_words_ua:
   237  	BEQ	R5, R6, b_tail_ua
   238  	MOVWHI	-4(R4), R8
   239  	ADDU	$-4, R5
   240  	MOVWLO	-1(R4), R8
   241  	ADDU	$-4, R4
   242  	MOVW	R8, 0(R5)
   243  	JMP	b_words_ua
   244  
   245  b_tail_ua:
   246  	BEQ	R5, R1, ret
   247  	MOVWHI	(R2), R8
   248  	MOVWLO	3(R2), R8
   249  	MOVWHI	R8, 0(R1)
   250  	JMP ret
   251  
   252  b_small_copy:
   253  	BEQ	R5, R1, ret
   254  	ADDU	$-1, R5
   255  	MOVB	-1(R4), R6
   256  	ADDU	$-1, R4
   257  	MOVB	R6, 0(R5)
   258  	JMP	b_small_copy