// 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" | |
// void runtime·memmove(void*, void*, 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 $runtime·memmove_s390x_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 runtime·memmove_s390x_exrl_mvc(SB),NOSPLIT|NOFRAME,$0-0 | |
MVC $1, 0(R4), 0(R6) | |
MOVD R0, 0(R0) | |
RET | |