Source file src/cmd/compile/internal/ssa/gen/S390XOps.go
1
2
3
4
5
6
7 package main
8
9 import "strings"
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 var regNamesS390X = []string{
53 "R0",
54 "R1",
55 "R2",
56 "R3",
57 "R4",
58 "R5",
59 "R6",
60 "R7",
61 "R8",
62 "R9",
63 "R10",
64 "R11",
65 "R12",
66 "g",
67 "R14",
68 "SP",
69 "F0",
70 "F1",
71 "F2",
72 "F3",
73 "F4",
74 "F5",
75 "F6",
76 "F7",
77 "F8",
78 "F9",
79 "F10",
80 "F11",
81 "F12",
82 "F13",
83 "F14",
84 "F15",
85
86
87 "SB",
88 }
89
90 func init() {
91
92 if len(regNamesS390X) > 64 {
93 panic("too many registers")
94 }
95 num := map[string]int{}
96 for i, name := range regNamesS390X {
97 num[name] = i
98 }
99 buildReg := func(s string) regMask {
100 m := regMask(0)
101 for _, r := range strings.Split(s, " ") {
102 if n, ok := num[r]; ok {
103 m |= regMask(1) << uint(n)
104 continue
105 }
106 panic("register " + r + " not found")
107 }
108 return m
109 }
110
111
112 var (
113 sp = buildReg("SP")
114 sb = buildReg("SB")
115 r0 = buildReg("R0")
116 tmp = buildReg("R11")
117
118
119 gp = buildReg("R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R11 R12 R14")
120 gpg = gp | buildReg("g")
121 gpsp = gp | sp
122
123
124 ptr = gp &^ r0
125 ptrsp = ptr | sp
126 ptrspsb = ptrsp | sb
127
128 fp = buildReg("F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15")
129 callerSave = gp | fp | buildReg("g")
130 r1 = buildReg("R1")
131 r2 = buildReg("R2")
132 r3 = buildReg("R3")
133 )
134
135 var (
136 gponly = []regMask{gp}
137 fponly = []regMask{fp}
138 )
139
140
141 var (
142 gp01 = regInfo{inputs: []regMask{}, outputs: gponly}
143 gp11 = regInfo{inputs: []regMask{gp}, outputs: gponly}
144 gp11sp = regInfo{inputs: []regMask{gpsp}, outputs: gponly}
145 gp21 = regInfo{inputs: []regMask{gp, gp}, outputs: gponly}
146 gp21sp = regInfo{inputs: []regMask{gpsp, gp}, outputs: gponly}
147 gp21tmp = regInfo{inputs: []regMask{gp &^ tmp, gp &^ tmp}, outputs: []regMask{gp &^ tmp}, clobbers: tmp}
148
149
150
151 sh21 = regInfo{inputs: []regMask{gp, ptr}, outputs: gponly}
152
153 addr = regInfo{inputs: []regMask{sp | sb}, outputs: gponly}
154 addridx = regInfo{inputs: []regMask{sp | sb, ptrsp}, outputs: gponly}
155
156 gp2flags = regInfo{inputs: []regMask{gpsp, gpsp}}
157 gp1flags = regInfo{inputs: []regMask{gpsp}}
158 gp2flags1 = regInfo{inputs: []regMask{gp, gp}, outputs: gponly}
159 gp11flags = regInfo{inputs: []regMask{gp}, outputs: gponly}
160 gp21flags = regInfo{inputs: []regMask{gp, gp}, outputs: gponly}
161 gp2flags1flags = regInfo{inputs: []regMask{gp, gp}, outputs: gponly}
162
163 gpload = regInfo{inputs: []regMask{ptrspsb, 0}, outputs: gponly}
164 gploadidx = regInfo{inputs: []regMask{ptrspsb, ptrsp, 0}, outputs: gponly}
165 gpopload = regInfo{inputs: []regMask{gp, ptrsp, 0}, outputs: gponly}
166 gpstore = regInfo{inputs: []regMask{ptrspsb, gpsp, 0}}
167 gpstoreconst = regInfo{inputs: []regMask{ptrspsb, 0}}
168 gpstoreidx = regInfo{inputs: []regMask{ptrsp, ptrsp, gpsp, 0}}
169 gpstorebr = regInfo{inputs: []regMask{ptrsp, gpsp, 0}}
170 gpstorelaa = regInfo{inputs: []regMask{ptrspsb, gpsp, 0}, outputs: gponly}
171
172 gpmvc = regInfo{inputs: []regMask{ptrsp, ptrsp, 0}}
173
174 fp01 = regInfo{inputs: []regMask{}, outputs: fponly}
175 fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: fponly}
176 fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: fponly}
177 fp21clobber = regInfo{inputs: []regMask{fp, fp}, outputs: fponly}
178 fpgp = regInfo{inputs: fponly, outputs: gponly}
179 gpfp = regInfo{inputs: gponly, outputs: fponly}
180 fp11 = regInfo{inputs: fponly, outputs: fponly}
181 fp11clobber = regInfo{inputs: fponly, outputs: fponly}
182 fp2flags = regInfo{inputs: []regMask{fp, fp}}
183
184 fpload = regInfo{inputs: []regMask{ptrspsb, 0}, outputs: fponly}
185 fploadidx = regInfo{inputs: []regMask{ptrsp, ptrsp, 0}, outputs: fponly}
186
187 fpstore = regInfo{inputs: []regMask{ptrspsb, fp, 0}}
188 fpstoreidx = regInfo{inputs: []regMask{ptrsp, ptrsp, fp, 0}}
189
190 sync = regInfo{inputs: []regMask{0}}
191
192
193 cas = regInfo{inputs: []regMask{ptrsp, r0, gpsp, 0}, outputs: []regMask{gp, 0}, clobbers: r0}
194
195
196
197
198
199 exchange = regInfo{inputs: []regMask{ptrsp, gpsp &^ r0, 0}, outputs: []regMask{r0, 0}}
200 )
201
202 var S390Xops = []opData{
203
204 {name: "FADDS", argLength: 2, reg: fp21clobber, asm: "FADDS", commutative: true, resultInArg0: true, clobberFlags: true},
205 {name: "FADD", argLength: 2, reg: fp21clobber, asm: "FADD", commutative: true, resultInArg0: true, clobberFlags: true},
206 {name: "FSUBS", argLength: 2, reg: fp21clobber, asm: "FSUBS", resultInArg0: true, clobberFlags: true},
207 {name: "FSUB", argLength: 2, reg: fp21clobber, asm: "FSUB", resultInArg0: true, clobberFlags: true},
208 {name: "FMULS", argLength: 2, reg: fp21, asm: "FMULS", commutative: true, resultInArg0: true},
209 {name: "FMUL", argLength: 2, reg: fp21, asm: "FMUL", commutative: true, resultInArg0: true},
210 {name: "FDIVS", argLength: 2, reg: fp21, asm: "FDIVS", resultInArg0: true},
211 {name: "FDIV", argLength: 2, reg: fp21, asm: "FDIV", resultInArg0: true},
212 {name: "FNEGS", argLength: 1, reg: fp11clobber, asm: "FNEGS", clobberFlags: true},
213 {name: "FNEG", argLength: 1, reg: fp11clobber, asm: "FNEG", clobberFlags: true},
214 {name: "FMADDS", argLength: 3, reg: fp31, asm: "FMADDS", resultInArg0: true},
215 {name: "FMADD", argLength: 3, reg: fp31, asm: "FMADD", resultInArg0: true},
216 {name: "FMSUBS", argLength: 3, reg: fp31, asm: "FMSUBS", resultInArg0: true},
217 {name: "FMSUB", argLength: 3, reg: fp31, asm: "FMSUB", resultInArg0: true},
218 {name: "LPDFR", argLength: 1, reg: fp11, asm: "LPDFR"},
219 {name: "LNDFR", argLength: 1, reg: fp11, asm: "LNDFR"},
220 {name: "CPSDR", argLength: 2, reg: fp21, asm: "CPSDR"},
221
222
223
224
225
226
227
228
229
230
231 {name: "FIDBR", argLength: 1, reg: fp11, asm: "FIDBR", aux: "Int8"},
232
233 {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
234 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
235 {name: "FMOVSconst", reg: fp01, asm: "FMOVS", aux: "Float32", rematerializeable: true},
236 {name: "FMOVDconst", reg: fp01, asm: "FMOVD", aux: "Float64", rematerializeable: true},
237 {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", aux: "SymOff", symEffect: "Read"},
238 {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", aux: "SymOff", symEffect: "Read"},
239
240 {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"},
241 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"},
242 {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", aux: "SymOff", symEffect: "Write"},
243 {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", aux: "SymOff", symEffect: "Write"},
244
245
246 {name: "ADD", argLength: 2, reg: gp21sp, asm: "ADD", commutative: true, clobberFlags: true},
247 {name: "ADDW", argLength: 2, reg: gp21sp, asm: "ADDW", commutative: true, clobberFlags: true},
248 {name: "ADDconst", argLength: 1, reg: gp11sp, asm: "ADD", aux: "Int32", typ: "UInt64", clobberFlags: true},
249 {name: "ADDWconst", argLength: 1, reg: gp11sp, asm: "ADDW", aux: "Int32", clobberFlags: true},
250 {name: "ADDload", argLength: 3, reg: gpopload, asm: "ADD", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
251 {name: "ADDWload", argLength: 3, reg: gpopload, asm: "ADDW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
252
253 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB", clobberFlags: true},
254 {name: "SUBW", argLength: 2, reg: gp21, asm: "SUBW", clobberFlags: true},
255 {name: "SUBconst", argLength: 1, reg: gp11, asm: "SUB", aux: "Int32", resultInArg0: true, clobberFlags: true},
256 {name: "SUBWconst", argLength: 1, reg: gp11, asm: "SUBW", aux: "Int32", resultInArg0: true, clobberFlags: true},
257 {name: "SUBload", argLength: 3, reg: gpopload, asm: "SUB", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
258 {name: "SUBWload", argLength: 3, reg: gpopload, asm: "SUBW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
259
260 {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true, resultInArg0: true, clobberFlags: true},
261 {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true, resultInArg0: true, clobberFlags: true},
262 {name: "MULLDconst", argLength: 1, reg: gp11, asm: "MULLD", aux: "Int32", typ: "Int64", resultInArg0: true, clobberFlags: true},
263 {name: "MULLWconst", argLength: 1, reg: gp11, asm: "MULLW", aux: "Int32", typ: "Int32", resultInArg0: true, clobberFlags: true},
264 {name: "MULLDload", argLength: 3, reg: gpopload, asm: "MULLD", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
265 {name: "MULLWload", argLength: 3, reg: gpopload, asm: "MULLW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
266
267 {name: "MULHD", argLength: 2, reg: gp21tmp, asm: "MULHD", typ: "Int64", commutative: true, resultInArg0: true, clobberFlags: true},
268 {name: "MULHDU", argLength: 2, reg: gp21tmp, asm: "MULHDU", typ: "Int64", commutative: true, resultInArg0: true, clobberFlags: true},
269
270 {name: "DIVD", argLength: 2, reg: gp21tmp, asm: "DIVD", resultInArg0: true, clobberFlags: true},
271 {name: "DIVW", argLength: 2, reg: gp21tmp, asm: "DIVW", resultInArg0: true, clobberFlags: true},
272 {name: "DIVDU", argLength: 2, reg: gp21tmp, asm: "DIVDU", resultInArg0: true, clobberFlags: true},
273 {name: "DIVWU", argLength: 2, reg: gp21tmp, asm: "DIVWU", resultInArg0: true, clobberFlags: true},
274
275 {name: "MODD", argLength: 2, reg: gp21tmp, asm: "MODD", resultInArg0: true, clobberFlags: true},
276 {name: "MODW", argLength: 2, reg: gp21tmp, asm: "MODW", resultInArg0: true, clobberFlags: true},
277
278 {name: "MODDU", argLength: 2, reg: gp21tmp, asm: "MODDU", resultInArg0: true, clobberFlags: true},
279 {name: "MODWU", argLength: 2, reg: gp21tmp, asm: "MODWU", resultInArg0: true, clobberFlags: true},
280
281 {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true, clobberFlags: true},
282 {name: "ANDW", argLength: 2, reg: gp21, asm: "ANDW", commutative: true, clobberFlags: true},
283 {name: "ANDconst", argLength: 1, reg: gp11, asm: "AND", aux: "Int64", resultInArg0: true, clobberFlags: true},
284 {name: "ANDWconst", argLength: 1, reg: gp11, asm: "ANDW", aux: "Int32", resultInArg0: true, clobberFlags: true},
285 {name: "ANDload", argLength: 3, reg: gpopload, asm: "AND", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
286 {name: "ANDWload", argLength: 3, reg: gpopload, asm: "ANDW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
287
288 {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true, clobberFlags: true},
289 {name: "ORW", argLength: 2, reg: gp21, asm: "ORW", commutative: true, clobberFlags: true},
290 {name: "ORconst", argLength: 1, reg: gp11, asm: "OR", aux: "Int64", resultInArg0: true, clobberFlags: true},
291 {name: "ORWconst", argLength: 1, reg: gp11, asm: "ORW", aux: "Int32", resultInArg0: true, clobberFlags: true},
292 {name: "ORload", argLength: 3, reg: gpopload, asm: "OR", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
293 {name: "ORWload", argLength: 3, reg: gpopload, asm: "ORW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
294
295 {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", commutative: true, clobberFlags: true},
296 {name: "XORW", argLength: 2, reg: gp21, asm: "XORW", commutative: true, clobberFlags: true},
297 {name: "XORconst", argLength: 1, reg: gp11, asm: "XOR", aux: "Int64", resultInArg0: true, clobberFlags: true},
298 {name: "XORWconst", argLength: 1, reg: gp11, asm: "XORW", aux: "Int32", resultInArg0: true, clobberFlags: true},
299 {name: "XORload", argLength: 3, reg: gpopload, asm: "XOR", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
300 {name: "XORWload", argLength: 3, reg: gpopload, asm: "XORW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},
301
302
303
304
305
306 {name: "ADDC", argLength: 2, reg: gp21flags, asm: "ADDC", typ: "(UInt64,Flags)", commutative: true},
307 {name: "ADDCconst", argLength: 1, reg: gp11flags, asm: "ADDC", typ: "(UInt64,Flags)", aux: "Int16"},
308 {name: "ADDE", argLength: 3, reg: gp2flags1flags, asm: "ADDE", typ: "(UInt64,Flags)", commutative: true, resultInArg0: true},
309 {name: "SUBC", argLength: 2, reg: gp21flags, asm: "SUBC", typ: "(UInt64,Flags)"},
310 {name: "SUBE", argLength: 3, reg: gp2flags1flags, asm: "SUBE", typ: "(UInt64,Flags)", resultInArg0: true},
311
312
313 {name: "CMP", argLength: 2, reg: gp2flags, asm: "CMP", typ: "Flags"},
314 {name: "CMPW", argLength: 2, reg: gp2flags, asm: "CMPW", typ: "Flags"},
315
316 {name: "CMPU", argLength: 2, reg: gp2flags, asm: "CMPU", typ: "Flags"},
317 {name: "CMPWU", argLength: 2, reg: gp2flags, asm: "CMPWU", typ: "Flags"},
318
319 {name: "CMPconst", argLength: 1, reg: gp1flags, asm: "CMP", typ: "Flags", aux: "Int32"},
320 {name: "CMPWconst", argLength: 1, reg: gp1flags, asm: "CMPW", typ: "Flags", aux: "Int32"},
321 {name: "CMPUconst", argLength: 1, reg: gp1flags, asm: "CMPU", typ: "Flags", aux: "Int32"},
322 {name: "CMPWUconst", argLength: 1, reg: gp1flags, asm: "CMPWU", typ: "Flags", aux: "Int32"},
323
324 {name: "FCMPS", argLength: 2, reg: fp2flags, asm: "CEBR", typ: "Flags"},
325 {name: "FCMP", argLength: 2, reg: fp2flags, asm: "FCMPU", typ: "Flags"},
326
327 {name: "SLD", argLength: 2, reg: sh21, asm: "SLD"},
328 {name: "SLW", argLength: 2, reg: sh21, asm: "SLW"},
329 {name: "SLDconst", argLength: 1, reg: gp11, asm: "SLD", aux: "Int8"},
330 {name: "SLWconst", argLength: 1, reg: gp11, asm: "SLW", aux: "Int8"},
331
332 {name: "SRD", argLength: 2, reg: sh21, asm: "SRD"},
333 {name: "SRW", argLength: 2, reg: sh21, asm: "SRW"},
334 {name: "SRDconst", argLength: 1, reg: gp11, asm: "SRD", aux: "Int8"},
335 {name: "SRWconst", argLength: 1, reg: gp11, asm: "SRW", aux: "Int8"},
336
337
338 {name: "SRAD", argLength: 2, reg: sh21, asm: "SRAD", clobberFlags: true},
339 {name: "SRAW", argLength: 2, reg: sh21, asm: "SRAW", clobberFlags: true},
340 {name: "SRADconst", argLength: 1, reg: gp11, asm: "SRAD", aux: "Int8", clobberFlags: true},
341 {name: "SRAWconst", argLength: 1, reg: gp11, asm: "SRAW", aux: "Int8", clobberFlags: true},
342
343 {name: "RLLG", argLength: 2, reg: sh21, asm: "RLLG"},
344 {name: "RLL", argLength: 2, reg: sh21, asm: "RLL"},
345 {name: "RLLGconst", argLength: 1, reg: gp11, asm: "RLLG", aux: "Int8"},
346 {name: "RLLconst", argLength: 1, reg: gp11, asm: "RLL", aux: "Int8"},
347
348
349 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG", clobberFlags: true},
350 {name: "NEGW", argLength: 1, reg: gp11, asm: "NEGW", clobberFlags: true},
351
352 {name: "NOT", argLength: 1, reg: gp11, resultInArg0: true, clobberFlags: true},
353 {name: "NOTW", argLength: 1, reg: gp11, resultInArg0: true, clobberFlags: true},
354
355 {name: "FSQRT", argLength: 1, reg: fp11, asm: "FSQRT"},
356
357 {name: "MOVDEQ", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDEQ"},
358 {name: "MOVDNE", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDNE"},
359 {name: "MOVDLT", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDLT"},
360 {name: "MOVDLE", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDLE"},
361 {name: "MOVDGT", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDGT"},
362 {name: "MOVDGE", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDGE"},
363
364
365
366
367 {name: "MOVDGTnoinv", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDGT"},
368 {name: "MOVDGEnoinv", argLength: 3, reg: gp2flags1, resultInArg0: true, asm: "MOVDGE"},
369
370 {name: "MOVBreg", argLength: 1, reg: gp11sp, asm: "MOVB", typ: "Int64"},
371 {name: "MOVBZreg", argLength: 1, reg: gp11sp, asm: "MOVBZ", typ: "UInt64"},
372 {name: "MOVHreg", argLength: 1, reg: gp11sp, asm: "MOVH", typ: "Int64"},
373 {name: "MOVHZreg", argLength: 1, reg: gp11sp, asm: "MOVHZ", typ: "UInt64"},
374 {name: "MOVWreg", argLength: 1, reg: gp11sp, asm: "MOVW", typ: "Int64"},
375 {name: "MOVWZreg", argLength: 1, reg: gp11sp, asm: "MOVWZ", typ: "UInt64"},
376 {name: "MOVDreg", argLength: 1, reg: gp11sp, asm: "MOVD"},
377
378 {name: "MOVDnop", argLength: 1, reg: gp11, resultInArg0: true},
379
380 {name: "MOVDconst", reg: gp01, asm: "MOVD", typ: "UInt64", aux: "Int64", rematerializeable: true},
381
382 {name: "LDGR", argLength: 1, reg: gpfp, asm: "LDGR"},
383 {name: "LGDR", argLength: 1, reg: fpgp, asm: "LGDR"},
384 {name: "CFDBRA", argLength: 1, reg: fpgp, asm: "CFDBRA"},
385 {name: "CGDBRA", argLength: 1, reg: fpgp, asm: "CGDBRA"},
386 {name: "CFEBRA", argLength: 1, reg: fpgp, asm: "CFEBRA"},
387 {name: "CGEBRA", argLength: 1, reg: fpgp, asm: "CGEBRA"},
388 {name: "CEFBRA", argLength: 1, reg: gpfp, asm: "CEFBRA"},
389 {name: "CDFBRA", argLength: 1, reg: gpfp, asm: "CDFBRA"},
390 {name: "CEGBRA", argLength: 1, reg: gpfp, asm: "CEGBRA"},
391 {name: "CDGBRA", argLength: 1, reg: gpfp, asm: "CDGBRA"},
392 {name: "LEDBR", argLength: 1, reg: fp11, asm: "LEDBR"},
393 {name: "LDEBR", argLength: 1, reg: fp11, asm: "LDEBR"},
394
395 {name: "MOVDaddr", argLength: 1, reg: addr, aux: "SymOff", rematerializeable: true, symEffect: "Read"},
396 {name: "MOVDaddridx", argLength: 2, reg: addridx, aux: "SymOff", symEffect: "Read"},
397
398
399 {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},
400 {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVB", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
401 {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
402 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
403 {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
404 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
405 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "UInt64", faultOnNilArg0: true, symEffect: "Read"},
406
407 {name: "MOVWBR", argLength: 1, reg: gp11, asm: "MOVWBR"},
408 {name: "MOVDBR", argLength: 1, reg: gp11, asm: "MOVDBR"},
409
410 {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
411 {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
412 {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", aux: "SymOff", typ: "UInt64", faultOnNilArg0: true, symEffect: "Read"},
413
414 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
415 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
416 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
417 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
418 {name: "MOVHBRstore", argLength: 3, reg: gpstorebr, asm: "MOVHBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
419 {name: "MOVWBRstore", argLength: 3, reg: gpstorebr, asm: "MOVWBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
420 {name: "MOVDBRstore", argLength: 3, reg: gpstorebr, asm: "MOVDBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
421
422 {name: "MVC", argLength: 3, reg: gpmvc, asm: "MVC", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, faultOnNilArg1: true, symEffect: "None"},
423
424
425 {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", symEffect: "Read"},
426 {name: "MOVBloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVB", aux: "SymOff", typ: "Int8", symEffect: "Read"},
427 {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", symEffect: "Read"},
428 {name: "MOVHloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVH", aux: "SymOff", typ: "Int16", symEffect: "Read"},
429 {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", symEffect: "Read"},
430 {name: "MOVWloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVW", aux: "SymOff", typ: "Int32", symEffect: "Read"},
431 {name: "MOVDloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVD", aux: "SymOff", typ: "UInt64", symEffect: "Read"},
432 {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVHBR", aux: "SymOff", typ: "Int16", symEffect: "Read"},
433 {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVWBR", aux: "SymOff", typ: "Int32", symEffect: "Read"},
434 {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVDBR", aux: "SymOff", typ: "Int64", symEffect: "Read"},
435 {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, commutative: true, asm: "MOVB", aux: "SymOff", symEffect: "Write"},
436 {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, commutative: true, asm: "MOVH", aux: "SymOff", symEffect: "Write"},
437 {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, commutative: true, asm: "MOVW", aux: "SymOff", symEffect: "Write"},
438 {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, commutative: true, asm: "MOVD", aux: "SymOff", symEffect: "Write"},
439 {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, commutative: true, asm: "MOVHBR", aux: "SymOff", symEffect: "Write"},
440 {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, commutative: true, asm: "MOVWBR", aux: "SymOff", symEffect: "Write"},
441 {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, commutative: true, asm: "MOVDBR", aux: "SymOff", symEffect: "Write"},
442
443
444
445
446 {name: "MOVBstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
447 {name: "MOVHstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVH", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
448 {name: "MOVWstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
449 {name: "MOVDstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVD", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
450
451 {name: "CLEAR", argLength: 2, reg: regInfo{inputs: []regMask{ptr, 0}}, asm: "CLEAR", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"},
452
453 {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},
454 {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{ptrsp, buildReg("R12"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},
455 {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{ptr}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},
456
457
458
459 {name: "InvertFlags", argLength: 1},
460
461
462 {name: "LoweredGetG", argLength: 1, reg: gp01},
463
464
465
466 {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R12")}}, zeroWidth: true},
467
468
469 {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
470
471
472
473
474 {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
475 {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{ptrsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
476
477 {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
478 {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
479
480
481
482
483 {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R14")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
484
485
486
487
488 {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r2, r3}}, typ: "Mem"},
489 {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r1, r2}}, typ: "Mem"},
490 {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r0, r1}}, typ: "Mem"},
491
492
493 {name: "FlagEQ"},
494 {name: "FlagLT"},
495 {name: "FlagGT"},
496 {name: "FlagOV"},
497
498
499 {name: "SYNC", argLength: 1, reg: sync, asm: "SYNC", typ: "Mem"},
500
501
502
503
504 {name: "MOVBZatomicload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
505 {name: "MOVWZatomicload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
506 {name: "MOVDatomicload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
507
508
509
510 {name: "MOVWatomicstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "Write"},
511 {name: "MOVDatomicstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "Write"},
512
513
514
515
516 {name: "LAA", argLength: 3, reg: gpstorelaa, asm: "LAA", typ: "(UInt32,Mem)", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
517 {name: "LAAG", argLength: 3, reg: gpstorelaa, asm: "LAAG", typ: "(UInt64,Mem)", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
518 {name: "AddTupleFirst32", argLength: 2},
519 {name: "AddTupleFirst64", argLength: 2},
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542 {name: "LoweredAtomicCas32", argLength: 4, reg: cas, asm: "CS", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
543 {name: "LoweredAtomicCas64", argLength: 4, reg: cas, asm: "CSG", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
544
545
546
547 {name: "LoweredAtomicExchange32", argLength: 3, reg: exchange, asm: "CS", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
548 {name: "LoweredAtomicExchange64", argLength: 3, reg: exchange, asm: "CSG", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
549
550
551 {
552 name: "FLOGR",
553 argLength: 1,
554 reg: regInfo{inputs: gponly, outputs: []regMask{buildReg("R0")}, clobbers: buildReg("R1")},
555 asm: "FLOGR",
556 typ: "UInt64",
557 clobberFlags: true,
558 },
559
560
561
562
563
564
565 {
566 name: "POPCNT",
567 argLength: 1,
568 reg: gp11,
569 asm: "POPCNT",
570 typ: "UInt64",
571 clobberFlags: true,
572 },
573
574
575 {name: "SumBytes2", argLength: 1, typ: "UInt8"},
576 {name: "SumBytes4", argLength: 1, typ: "UInt8"},
577 {name: "SumBytes8", argLength: 1, typ: "UInt8"},
578
579
580 {
581 name: "STMG2",
582 argLength: 4,
583 reg: regInfo{inputs: []regMask{ptrsp, buildReg("R1"), buildReg("R2"), 0}},
584 aux: "SymOff",
585 typ: "Mem",
586 asm: "STMG",
587 faultOnNilArg0: true,
588 symEffect: "Write",
589 },
590 {
591 name: "STMG3",
592 argLength: 5,
593 reg: regInfo{inputs: []regMask{ptrsp, buildReg("R1"), buildReg("R2"), buildReg("R3"), 0}},
594 aux: "SymOff",
595 typ: "Mem",
596 asm: "STMG",
597 faultOnNilArg0: true,
598 symEffect: "Write",
599 },
600 {
601 name: "STMG4",
602 argLength: 6,
603 reg: regInfo{inputs: []regMask{
604 ptrsp,
605 buildReg("R1"),
606 buildReg("R2"),
607 buildReg("R3"),
608 buildReg("R4"),
609 0,
610 }},
611 aux: "SymOff",
612 typ: "Mem",
613 asm: "STMG",
614 faultOnNilArg0: true,
615 symEffect: "Write",
616 },
617 {
618 name: "STM2",
619 argLength: 4,
620 reg: regInfo{inputs: []regMask{ptrsp, buildReg("R1"), buildReg("R2"), 0}},
621 aux: "SymOff",
622 typ: "Mem",
623 asm: "STMY",
624 faultOnNilArg0: true,
625 symEffect: "Write",
626 },
627 {
628 name: "STM3",
629 argLength: 5,
630 reg: regInfo{inputs: []regMask{ptrsp, buildReg("R1"), buildReg("R2"), buildReg("R3"), 0}},
631 aux: "SymOff",
632 typ: "Mem",
633 asm: "STMY",
634 faultOnNilArg0: true,
635 symEffect: "Write",
636 },
637 {
638 name: "STM4",
639 argLength: 6,
640 reg: regInfo{inputs: []regMask{
641 ptrsp,
642 buildReg("R1"),
643 buildReg("R2"),
644 buildReg("R3"),
645 buildReg("R4"),
646 0,
647 }},
648 aux: "SymOff",
649 typ: "Mem",
650 asm: "STMY",
651 faultOnNilArg0: true,
652 symEffect: "Write",
653 },
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669 {
670 name: "LoweredMove",
671 aux: "Int64",
672 argLength: 4,
673 reg: regInfo{
674 inputs: []regMask{buildReg("R1"), buildReg("R2"), gpsp},
675 clobbers: buildReg("R1 R2"),
676 },
677 clobberFlags: true,
678 typ: "Mem",
679 faultOnNilArg0: true,
680 faultOnNilArg1: true,
681 },
682
683
684
685
686
687
688
689
690
691
692
693
694
695 {
696 name: "LoweredZero",
697 aux: "Int64",
698 argLength: 3,
699 reg: regInfo{
700 inputs: []regMask{buildReg("R1"), gpsp},
701 clobbers: buildReg("R1"),
702 },
703 clobberFlags: true,
704 typ: "Mem",
705 faultOnNilArg0: true,
706 },
707 }
708
709 var S390Xblocks = []blockData{
710 {name: "EQ"},
711 {name: "NE"},
712 {name: "LT"},
713 {name: "LE"},
714 {name: "GT"},
715 {name: "GE"},
716 {name: "GTF"},
717 {name: "GEF"},
718 }
719
720 archs = append(archs, arch{
721 name: "S390X",
722 pkg: "cmd/internal/obj/s390x",
723 genfile: "../../s390x/ssa.go",
724 ops: S390Xops,
725 blocks: S390Xblocks,
726 regnames: regNamesS390X,
727 gpregmask: gp,
728 fpregmask: fp,
729 framepointerreg: -1,
730 linkreg: int8(num["R14"]),
731 })
732 }
733
View as plain text