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