Home | History | Annotate | Download | only in runtime
      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 runtimememmove(void*, void*, uintptr)
     18 TEXT runtimememmove(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
    259