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

View as plain text