liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
// 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"
 
// 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    $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