| // Copyright 2016 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| #include "textflag.h" | |
| // See memmove Go doc for important implementation constraints. | |
| // func memmove(to, from unsafe.Pointer, n uintptr) | |
| TEXT runtime·memmove(SB),NOSPLIT|NOFRAME,$0-24 | |
| MOVD to+0(FP), R6 | |
| MOVD from+8(FP), R4 | |
| MOVD n+16(FP), R5 | |
| CMPBEQ R6, R4, done | |
| start: | |
| CMPBLE R5, $3, move0to3 | |
| CMPBLE R5, $7, move4to7 | |
| CMPBLE R5, $11, move8to11 | |
| CMPBLE R5, $15, move12to15 | |
| CMPBNE R5, $16, movemt16 | |
| MOVD 0(R4), R7 | |
| MOVD 8(R4), R8 | |
| MOVD R7, 0(R6) | |
| MOVD R8, 8(R6) | |
| RET | |
| movemt16: | |
| CMPBGT R4, R6, forwards | |
| ADD R5, R4, R7 | |
| CMPBLE R7, R6, forwards | |
| ADD R5, R6, R8 | |
| backwards: | |
| MOVD -8(R7), R3 | |
| MOVD R3, -8(R8) | |
| MOVD -16(R7), R3 | |
| MOVD R3, -16(R8) | |
| ADD $-16, R5 | |
| ADD $-16, R7 | |
| ADD $-16, R8 | |
| CMP R5, $16 | |
| BGE backwards | |
| BR start | |
| forwards: | |
| CMPBGT R5, $64, forwards_fast | |
| MOVD 0(R4), R3 | |
| MOVD R3, 0(R6) | |
| MOVD 8(R4), R3 | |
| MOVD R3, 8(R6) | |
| ADD $16, R4 | |
| ADD $16, R6 | |
| ADD $-16, R5 | |
| CMP R5, $16 | |
| BGE forwards | |
| BR start | |
| forwards_fast: | |
| CMP R5, $256 | |
| BLE forwards_small | |
| MVC $256, 0(R4), 0(R6) | |
| ADD $256, R4 | |
| ADD $256, R6 | |
| ADD $-256, R5 | |
| BR forwards_fast | |
| forwards_small: | |
| CMPBEQ R5, $0, done | |
| ADD $-1, R5 | |
| EXRL $memmove_exrl_mvc<>(SB), R5 | |
| RET | |
| move0to3: | |
| CMPBEQ R5, $0, done | |
| move1: | |
| CMPBNE R5, $1, move2 | |
| MOVB 0(R4), R3 | |
| MOVB R3, 0(R6) | |
| RET | |
| move2: | |
| CMPBNE R5, $2, move3 | |
| MOVH 0(R4), R3 | |
| MOVH R3, 0(R6) | |
| RET | |
| move3: | |
| MOVH 0(R4), R3 | |
| MOVB 2(R4), R7 | |
| MOVH R3, 0(R6) | |
| MOVB R7, 2(R6) | |
| RET | |
| move4to7: | |
| CMPBNE R5, $4, move5 | |
| MOVW 0(R4), R3 | |
| MOVW R3, 0(R6) | |
| RET | |
| move5: | |
| CMPBNE R5, $5, move6 | |
| MOVW 0(R4), R3 | |
| MOVB 4(R4), R7 | |
| MOVW R3, 0(R6) | |
| MOVB R7, 4(R6) | |
| RET | |
| move6: | |
| CMPBNE R5, $6, move7 | |
| MOVW 0(R4), R3 | |
| MOVH 4(R4), R7 | |
| MOVW R3, 0(R6) | |
| MOVH R7, 4(R6) | |
| RET | |
| move7: | |
| MOVW 0(R4), R3 | |
| MOVH 4(R4), R7 | |
| MOVB 6(R4), R8 | |
| MOVW R3, 0(R6) | |
| MOVH R7, 4(R6) | |
| MOVB R8, 6(R6) | |
| RET | |
| move8to11: | |
| CMPBNE R5, $8, move9 | |
| MOVD 0(R4), R3 | |
| MOVD R3, 0(R6) | |
| RET | |
| move9: | |
| CMPBNE R5, $9, move10 | |
| MOVD 0(R4), R3 | |
| MOVB 8(R4), R7 | |
| MOVD R3, 0(R6) | |
| MOVB R7, 8(R6) | |
| RET | |
| move10: | |
| CMPBNE R5, $10, move11 | |
| MOVD 0(R4), R3 | |
| MOVH 8(R4), R7 | |
| MOVD R3, 0(R6) | |
| MOVH R7, 8(R6) | |
| RET | |
| move11: | |
| MOVD 0(R4), R3 | |
| MOVH 8(R4), R7 | |
| MOVB 10(R4), R8 | |
| MOVD R3, 0(R6) | |
| MOVH R7, 8(R6) | |
| MOVB R8, 10(R6) | |
| RET | |
| move12to15: | |
| CMPBNE R5, $12, move13 | |
| MOVD 0(R4), R3 | |
| MOVW 8(R4), R7 | |
| MOVD R3, 0(R6) | |
| MOVW R7, 8(R6) | |
| RET | |
| move13: | |
| CMPBNE R5, $13, move14 | |
| MOVD 0(R4), R3 | |
| MOVW 8(R4), R7 | |
| MOVB 12(R4), R8 | |
| MOVD R3, 0(R6) | |
| MOVW R7, 8(R6) | |
| MOVB R8, 12(R6) | |
| RET | |
| move14: | |
| CMPBNE R5, $14, move15 | |
| MOVD 0(R4), R3 | |
| MOVW 8(R4), R7 | |
| MOVH 12(R4), R8 | |
| MOVD R3, 0(R6) | |
| MOVW R7, 8(R6) | |
| MOVH R8, 12(R6) | |
| RET | |
| move15: | |
| MOVD 0(R4), R3 | |
| MOVW 8(R4), R7 | |
| MOVH 12(R4), R8 | |
| MOVB 14(R4), R10 | |
| MOVD R3, 0(R6) | |
| MOVW R7, 8(R6) | |
| MOVH R8, 12(R6) | |
| MOVB R10, 14(R6) | |
| done: | |
| RET | |
| // DO NOT CALL - target for exrl (execute relative long) instruction. | |
| TEXT memmove_exrl_mvc<>(SB),NOSPLIT|NOFRAME,$0-0 | |
| MVC $1, 0(R4), 0(R6) | |
| MOVD R0, 0(R0) | |
| RET | |