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