Text file
src/runtime/memmove_s390x.s
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 #include "textflag.h"
6
7 // See memmove Go doc for important implementation constraints.
8
9 // func memmove(to, from unsafe.Pointer, n uintptr)
10 TEXT runtime·memmove<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
11 #ifndef GOEXPERIMENT_regabiargs
12 MOVD to+0(FP), R6
13 MOVD from+8(FP), R4
14 MOVD n+16(FP), R5
15 #else
16 MOVD R4, R5
17 MOVD R3, R4
18 MOVD R2, R6
19 #endif
20
21 CMPBEQ R6, R4, done
22
23 start:
24 CMPBLE R5, $3, move0to3
25 CMPBLE R5, $7, move4to7
26 CMPBLE R5, $11, move8to11
27 CMPBLE R5, $15, move12to15
28 CMPBNE R5, $16, movemt16
29 MOVD 0(R4), R7
30 MOVD 8(R4), R8
31 MOVD R7, 0(R6)
32 MOVD R8, 8(R6)
33 RET
34
35 movemt16:
36 CMPBGT R4, R6, forwards
37 ADD R5, R4, R7
38 CMPBLE R7, R6, forwards
39 ADD R5, R6, R8
40 backwards:
41 MOVD -8(R7), R3
42 MOVD R3, -8(R8)
43 MOVD -16(R7), R3
44 MOVD R3, -16(R8)
45 ADD $-16, R5
46 ADD $-16, R7
47 ADD $-16, R8
48 CMP R5, $16
49 BGE backwards
50 BR start
51
52 forwards:
53 CMPBGT R5, $64, forwards_fast
54 MOVD 0(R4), R3
55 MOVD R3, 0(R6)
56 MOVD 8(R4), R3
57 MOVD R3, 8(R6)
58 ADD $16, R4
59 ADD $16, R6
60 ADD $-16, R5
61 CMP R5, $16
62 BGE forwards
63 BR start
64
65 forwards_fast:
66 CMP R5, $256
67 BLE forwards_small
68 MVC $256, 0(R4), 0(R6)
69 ADD $256, R4
70 ADD $256, R6
71 ADD $-256, R5
72 BR forwards_fast
73
74 forwards_small:
75 CMPBEQ R5, $0, done
76 ADD $-1, R5
77 EXRL $memmove_exrl_mvc<>(SB), R5
78 RET
79
80 move0to3:
81 CMPBEQ R5, $0, done
82 move1:
83 CMPBNE R5, $1, move2
84 MOVB 0(R4), R3
85 MOVB R3, 0(R6)
86 RET
87 move2:
88 CMPBNE R5, $2, move3
89 MOVH 0(R4), R3
90 MOVH R3, 0(R6)
91 RET
92 move3:
93 MOVH 0(R4), R3
94 MOVB 2(R4), R7
95 MOVH R3, 0(R6)
96 MOVB R7, 2(R6)
97 RET
98
99 move4to7:
100 CMPBNE R5, $4, move5
101 MOVW 0(R4), R3
102 MOVW R3, 0(R6)
103 RET
104 move5:
105 CMPBNE R5, $5, move6
106 MOVW 0(R4), R3
107 MOVB 4(R4), R7
108 MOVW R3, 0(R6)
109 MOVB R7, 4(R6)
110 RET
111 move6:
112 CMPBNE R5, $6, move7
113 MOVW 0(R4), R3
114 MOVH 4(R4), R7
115 MOVW R3, 0(R6)
116 MOVH R7, 4(R6)
117 RET
118 move7:
119 MOVW 0(R4), R3
120 MOVH 4(R4), R7
121 MOVB 6(R4), R8
122 MOVW R3, 0(R6)
123 MOVH R7, 4(R6)
124 MOVB R8, 6(R6)
125 RET
126
127 move8to11:
128 CMPBNE R5, $8, move9
129 MOVD 0(R4), R3
130 MOVD R3, 0(R6)
131 RET
132 move9:
133 CMPBNE R5, $9, move10
134 MOVD 0(R4), R3
135 MOVB 8(R4), R7
136 MOVD R3, 0(R6)
137 MOVB R7, 8(R6)
138 RET
139 move10:
140 CMPBNE R5, $10, move11
141 MOVD 0(R4), R3
142 MOVH 8(R4), R7
143 MOVD R3, 0(R6)
144 MOVH R7, 8(R6)
145 RET
146 move11:
147 MOVD 0(R4), R3
148 MOVH 8(R4), R7
149 MOVB 10(R4), R8
150 MOVD R3, 0(R6)
151 MOVH R7, 8(R6)
152 MOVB R8, 10(R6)
153 RET
154
155 move12to15:
156 CMPBNE R5, $12, move13
157 MOVD 0(R4), R3
158 MOVW 8(R4), R7
159 MOVD R3, 0(R6)
160 MOVW R7, 8(R6)
161 RET
162 move13:
163 CMPBNE R5, $13, move14
164 MOVD 0(R4), R3
165 MOVW 8(R4), R7
166 MOVB 12(R4), R8
167 MOVD R3, 0(R6)
168 MOVW R7, 8(R6)
169 MOVB R8, 12(R6)
170 RET
171 move14:
172 CMPBNE R5, $14, move15
173 MOVD 0(R4), R3
174 MOVW 8(R4), R7
175 MOVH 12(R4), R8
176 MOVD R3, 0(R6)
177 MOVW R7, 8(R6)
178 MOVH R8, 12(R6)
179 RET
180 move15:
181 MOVD 0(R4), R3
182 MOVW 8(R4), R7
183 MOVH 12(R4), R8
184 MOVB 14(R4), R10
185 MOVD R3, 0(R6)
186 MOVW R7, 8(R6)
187 MOVH R8, 12(R6)
188 MOVB R10, 14(R6)
189 done:
190 RET
191
192 // DO NOT CALL - target for exrl (execute relative long) instruction.
193 TEXT memmove_exrl_mvc<>(SB),NOSPLIT|NOFRAME,$0-0
194 MVC $1, 0(R4), 0(R6)
195 MOVD R0, 0(R0)
196 RET
197
198
View as plain text