Source file
src/runtime/mkduff.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package main
25
26 import (
27 "bytes"
28 "fmt"
29 "io"
30 "log"
31 "os"
32 )
33
34 func main() {
35 gen("amd64", notags, zeroAMD64, copyAMD64)
36 gen("386", notags, zero386, copy386)
37 gen("arm", notags, zeroARM, copyARM)
38 gen("arm64", notags, zeroARM64, copyARM64)
39 gen("ppc64x", tagsPPC64x, zeroPPC64x, copyPPC64x)
40 gen("mips64x", tagsMIPS64x, zeroMIPS64x, copyMIPS64x)
41 gen("riscv64", notags, zeroRISCV64, copyRISCV64)
42 }
43
44 func gen(arch string, tags, zero, copy func(io.Writer)) {
45 var buf bytes.Buffer
46
47 fmt.Fprintln(&buf, "// Code generated by mkduff.go; DO NOT EDIT.")
48 fmt.Fprintln(&buf, "// Run go generate from src/runtime to update.")
49 fmt.Fprintln(&buf, "// See mkduff.go for comments.")
50 tags(&buf)
51 fmt.Fprintln(&buf, "#include \"textflag.h\"")
52 fmt.Fprintln(&buf)
53 zero(&buf)
54 fmt.Fprintln(&buf)
55 copy(&buf)
56
57 if err := os.WriteFile("duff_"+arch+".s", buf.Bytes(), 0644); err != nil {
58 log.Fatalln(err)
59 }
60 }
61
62 func notags(w io.Writer) { fmt.Fprintln(w) }
63
64 func zeroAMD64(w io.Writer) {
65
66
67
68 fmt.Fprintln(w, "TEXT runtime·duffzero<ABIInternal>(SB), NOSPLIT, $0-0")
69 for i := 0; i < 16; i++ {
70 fmt.Fprintln(w, "\tMOVUPS\tX15,(DI)")
71 fmt.Fprintln(w, "\tMOVUPS\tX15,16(DI)")
72 fmt.Fprintln(w, "\tMOVUPS\tX15,32(DI)")
73 fmt.Fprintln(w, "\tMOVUPS\tX15,48(DI)")
74 fmt.Fprintln(w, "\tLEAQ\t64(DI),DI")
75 fmt.Fprintln(w)
76 }
77 fmt.Fprintln(w, "\tRET")
78 }
79
80 func copyAMD64(w io.Writer) {
81
82
83
84
85
86
87 fmt.Fprintln(w, "TEXT runtime·duffcopy<ABIInternal>(SB), NOSPLIT, $0-0")
88 for i := 0; i < 64; i++ {
89 fmt.Fprintln(w, "\tMOVUPS\t(SI), X0")
90 fmt.Fprintln(w, "\tADDQ\t$16, SI")
91 fmt.Fprintln(w, "\tMOVUPS\tX0, (DI)")
92 fmt.Fprintln(w, "\tADDQ\t$16, DI")
93 fmt.Fprintln(w)
94 }
95 fmt.Fprintln(w, "\tRET")
96 }
97
98 func zero386(w io.Writer) {
99
100
101
102 fmt.Fprintln(w, "TEXT runtime·duffzero(SB), NOSPLIT, $0-0")
103 for i := 0; i < 128; i++ {
104 fmt.Fprintln(w, "\tSTOSL")
105 }
106 fmt.Fprintln(w, "\tRET")
107 }
108
109 func copy386(w io.Writer) {
110
111
112
113
114
115
116 fmt.Fprintln(w, "TEXT runtime·duffcopy(SB), NOSPLIT, $0-0")
117 for i := 0; i < 128; i++ {
118 fmt.Fprintln(w, "\tMOVL\t(SI), CX")
119 fmt.Fprintln(w, "\tADDL\t$4, SI")
120 fmt.Fprintln(w, "\tMOVL\tCX, (DI)")
121 fmt.Fprintln(w, "\tADDL\t$4, DI")
122 fmt.Fprintln(w)
123 }
124 fmt.Fprintln(w, "\tRET")
125 }
126
127 func zeroARM(w io.Writer) {
128
129
130
131 fmt.Fprintln(w, "TEXT runtime·duffzero(SB), NOSPLIT, $0-0")
132 for i := 0; i < 128; i++ {
133 fmt.Fprintln(w, "\tMOVW.P\tR0, 4(R1)")
134 }
135 fmt.Fprintln(w, "\tRET")
136 }
137
138 func copyARM(w io.Writer) {
139
140
141
142
143 fmt.Fprintln(w, "TEXT runtime·duffcopy(SB), NOSPLIT, $0-0")
144 for i := 0; i < 128; i++ {
145 fmt.Fprintln(w, "\tMOVW.P\t4(R1), R0")
146 fmt.Fprintln(w, "\tMOVW.P\tR0, 4(R2)")
147 fmt.Fprintln(w)
148 }
149 fmt.Fprintln(w, "\tRET")
150 }
151
152 func zeroARM64(w io.Writer) {
153
154
155
156 fmt.Fprintln(w, "TEXT runtime·duffzero<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0")
157 for i := 0; i < 63; i++ {
158 fmt.Fprintln(w, "\tSTP.P\t(ZR, ZR), 16(R20)")
159 }
160 fmt.Fprintln(w, "\tSTP\t(ZR, ZR), (R20)")
161 fmt.Fprintln(w, "\tRET")
162 }
163
164 func copyARM64(w io.Writer) {
165
166
167
168
169 fmt.Fprintln(w, "TEXT runtime·duffcopy<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0")
170
171 for i := 0; i < 64; i++ {
172 fmt.Fprintln(w, "\tLDP.P\t16(R20), (R26, R27)")
173 fmt.Fprintln(w, "\tSTP.P\t(R26, R27), 16(R21)")
174 fmt.Fprintln(w)
175 }
176 fmt.Fprintln(w, "\tRET")
177 }
178
179 func tagsPPC64x(w io.Writer) {
180 fmt.Fprintln(w)
181 fmt.Fprintln(w, "//go:build ppc64 || ppc64le")
182 fmt.Fprintln(w)
183 }
184
185 func zeroPPC64x(w io.Writer) {
186
187
188
189 fmt.Fprintln(w, "TEXT runtime·duffzero<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0")
190 for i := 0; i < 128; i++ {
191 fmt.Fprintln(w, "\tMOVDU\tR0, 8(R20)")
192 }
193 fmt.Fprintln(w, "\tRET")
194 }
195
196 func copyPPC64x(w io.Writer) {
197
198 fmt.Fprintln(w, "TEXT runtime·duffcopy<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-0")
199 for i := 0; i < 128; i++ {
200 fmt.Fprintln(w, "\tMOVDU\t8(R20), R5")
201 fmt.Fprintln(w, "\tMOVDU\tR5, 8(R21)")
202 }
203 fmt.Fprintln(w, "\tRET")
204 }
205
206 func tagsMIPS64x(w io.Writer) {
207 fmt.Fprintln(w)
208 fmt.Fprintln(w, "//go:build mips64 || mips64le")
209 fmt.Fprintln(w)
210 }
211
212 func zeroMIPS64x(w io.Writer) {
213
214
215
216 fmt.Fprintln(w, "TEXT runtime·duffzero(SB), NOSPLIT|NOFRAME, $0-0")
217 for i := 0; i < 128; i++ {
218 fmt.Fprintln(w, "\tMOVV\tR0, 8(R1)")
219 fmt.Fprintln(w, "\tADDV\t$8, R1")
220 }
221 fmt.Fprintln(w, "\tRET")
222 }
223
224 func copyMIPS64x(w io.Writer) {
225 fmt.Fprintln(w, "TEXT runtime·duffcopy(SB), NOSPLIT|NOFRAME, $0-0")
226 for i := 0; i < 128; i++ {
227 fmt.Fprintln(w, "\tMOVV\t(R1), R23")
228 fmt.Fprintln(w, "\tADDV\t$8, R1")
229 fmt.Fprintln(w, "\tMOVV\tR23, (R2)")
230 fmt.Fprintln(w, "\tADDV\t$8, R2")
231 fmt.Fprintln(w)
232 }
233 fmt.Fprintln(w, "\tRET")
234 }
235
236 func zeroRISCV64(w io.Writer) {
237
238
239
240 fmt.Fprintln(w, "TEXT runtime·duffzero(SB), NOSPLIT|NOFRAME, $0-0")
241 for i := 0; i < 128; i++ {
242 fmt.Fprintln(w, "\tMOV\tZERO, (X10)")
243 fmt.Fprintln(w, "\tADD\t$8, X10")
244 }
245 fmt.Fprintln(w, "\tRET")
246 }
247
248 func copyRISCV64(w io.Writer) {
249
250
251
252 fmt.Fprintln(w, "TEXT runtime·duffcopy(SB), NOSPLIT|NOFRAME, $0-0")
253 for i := 0; i < 128; i++ {
254 fmt.Fprintln(w, "\tMOV\t(X10), X31")
255 fmt.Fprintln(w, "\tADD\t$8, X10")
256 fmt.Fprintln(w, "\tMOV\tX31, (X11)")
257 fmt.Fprintln(w, "\tADD\t$8, X11")
258 fmt.Fprintln(w)
259 }
260 fmt.Fprintln(w, "\tRET")
261 }
262
View as plain text