// 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