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