1
2
3
4
5 package main
6
7 import "strings"
8
9
10
11
12
13
14
15
16
17 var regNamesPPC64 = []string{
18 "R0",
19 "SP",
20 "SB",
21 "R3",
22 "R4",
23 "R5",
24 "R6",
25 "R7",
26 "R8",
27 "R9",
28 "R10",
29 "R11",
30 "R12",
31 "R13",
32 "R14",
33 "R15",
34 "R16",
35 "R17",
36 "R18",
37 "R19",
38 "R20",
39 "R21",
40 "R22",
41 "R23",
42 "R24",
43 "R25",
44 "R26",
45 "R27",
46 "R28",
47 "R29",
48 "g",
49 "R31",
50
51 "F0",
52 "F1",
53 "F2",
54 "F3",
55 "F4",
56 "F5",
57 "F6",
58 "F7",
59 "F8",
60 "F9",
61 "F10",
62 "F11",
63 "F12",
64 "F13",
65 "F14",
66 "F15",
67 "F16",
68 "F17",
69 "F18",
70 "F19",
71 "F20",
72 "F21",
73 "F22",
74 "F23",
75 "F24",
76 "F25",
77 "F26",
78 "F27",
79 "F28",
80 "F29",
81 "F30",
82
83
84 "XER",
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 }
101
102 func init() {
103
104 if len(regNamesPPC64) > 64 {
105 panic("too many registers")
106 }
107 num := map[string]int{}
108 for i, name := range regNamesPPC64 {
109 num[name] = i
110 }
111 buildReg := func(s string) regMask {
112 m := regMask(0)
113 for _, r := range strings.Split(s, " ") {
114 if n, ok := num[r]; ok {
115 m |= regMask(1) << uint(n)
116 continue
117 }
118 panic("register " + r + " not found")
119 }
120 return m
121 }
122
123 var (
124 gp = buildReg("R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29")
125 fp = buildReg("F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30")
126 sp = buildReg("SP")
127 sb = buildReg("SB")
128 gr = buildReg("g")
129 xer = buildReg("XER")
130
131
132
133 tmp = buildReg("R31")
134 ctxt = buildReg("R11")
135 callptr = buildReg("R12")
136
137 gp01 = regInfo{inputs: nil, outputs: []regMask{gp}}
138 gp11 = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}
139 xergp = regInfo{inputs: []regMask{xer}, outputs: []regMask{gp}, clobbers: xer}
140 gp11cxer = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}, clobbers: xer}
141 gp11xer = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp, xer}}
142 gp1xer1xer = regInfo{inputs: []regMask{gp | sp | sb, xer}, outputs: []regMask{gp, xer}, clobbers: xer}
143 gp21 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}}
144 gp21a0 = regInfo{inputs: []regMask{gp, gp | sp | sb}, outputs: []regMask{gp}}
145 gp21cxer = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}, clobbers: xer}
146 gp21xer = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp, xer}, clobbers: xer}
147 gp2xer1xer = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, xer}, outputs: []regMask{gp, xer}, clobbers: xer}
148 gp31 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}}
149 gp1cr = regInfo{inputs: []regMask{gp | sp | sb}}
150 gp2cr = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}}
151 crgp = regInfo{inputs: nil, outputs: []regMask{gp}}
152 crgp11 = regInfo{inputs: []regMask{gp}, outputs: []regMask{gp}}
153 crgp21 = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}}
154 gpload = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}
155 gploadidx = regInfo{inputs: []regMask{gp | sp | sb, gp}, outputs: []regMask{gp}}
156 prefreg = regInfo{inputs: []regMask{gp | sp | sb}}
157 gpstore = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}}
158 gpstoreidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}}
159 gpstorezero = regInfo{inputs: []regMask{gp | sp | sb}}
160 gpxchg = regInfo{inputs: []regMask{gp | sp | sb, gp}, outputs: []regMask{gp}}
161 gpcas = regInfo{inputs: []regMask{gp | sp | sb, gp, gp}, outputs: []regMask{gp}}
162 fp01 = regInfo{inputs: nil, outputs: []regMask{fp}}
163 fp11 = regInfo{inputs: []regMask{fp}, outputs: []regMask{fp}}
164 fpgp = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}
165 gpfp = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}
166 fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}}
167 fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: []regMask{fp}}
168 fp2cr = regInfo{inputs: []regMask{fp, fp}}
169 fpload = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{fp}}
170 fploadidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{fp}}
171 fpstore = regInfo{inputs: []regMask{gp | sp | sb, fp}}
172 fpstoreidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, fp}}
173 callerSave = regMask(gp | fp | gr | xer)
174 r3 = buildReg("R3")
175 r4 = buildReg("R4")
176 r5 = buildReg("R5")
177 r6 = buildReg("R6")
178 )
179 ops := []opData{
180 {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true},
181 {name: "ADDCC", argLength: 2, reg: gp21, asm: "ADDCC", commutative: true, typ: "(Int,Flags)"},
182 {name: "ADDconst", argLength: 1, reg: gp11, asm: "ADD", aux: "Int64"},
183 {name: "ADDCCconst", argLength: 1, reg: gp11cxer, asm: "ADDCCC", aux: "Int64", typ: "(Int,Flags)"},
184 {name: "FADD", argLength: 2, reg: fp21, asm: "FADD", commutative: true},
185 {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true},
186 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"},
187 {name: "SUBCC", argLength: 2, reg: gp21, asm: "SUBCC", typ: "(Int,Flags)"},
188 {name: "SUBFCconst", argLength: 1, reg: gp11cxer, asm: "SUBC", aux: "Int64"},
189 {name: "FSUB", argLength: 2, reg: fp21, asm: "FSUB"},
190 {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS"},
191
192
193 {name: "XSMINJDP", argLength: 2, reg: fp21, asm: "XSMINJDP"},
194 {name: "XSMAXJDP", argLength: 2, reg: fp21, asm: "XSMAXJDP"},
195
196 {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true},
197 {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true},
198 {name: "MULLDconst", argLength: 1, reg: gp11, asm: "MULLD", aux: "Int32", typ: "Int64"},
199 {name: "MULLWconst", argLength: 1, reg: gp11, asm: "MULLW", aux: "Int32", typ: "Int64"},
200 {name: "MADDLD", argLength: 3, reg: gp31, asm: "MADDLD", typ: "Int64"},
201
202 {name: "MULHD", argLength: 2, reg: gp21, asm: "MULHD", commutative: true},
203 {name: "MULHW", argLength: 2, reg: gp21, asm: "MULHW", commutative: true},
204 {name: "MULHDU", argLength: 2, reg: gp21, asm: "MULHDU", commutative: true},
205 {name: "MULHWU", argLength: 2, reg: gp21, asm: "MULHWU", commutative: true},
206
207 {name: "FMUL", argLength: 2, reg: fp21, asm: "FMUL", commutative: true},
208 {name: "FMULS", argLength: 2, reg: fp21, asm: "FMULS", commutative: true},
209
210 {name: "FMADD", argLength: 3, reg: fp31, asm: "FMADD"},
211 {name: "FMADDS", argLength: 3, reg: fp31, asm: "FMADDS"},
212 {name: "FMSUB", argLength: 3, reg: fp31, asm: "FMSUB"},
213 {name: "FMSUBS", argLength: 3, reg: fp31, asm: "FMSUBS"},
214
215 {name: "SRAD", argLength: 2, reg: gp21cxer, asm: "SRAD"},
216 {name: "SRAW", argLength: 2, reg: gp21cxer, asm: "SRAW"},
217 {name: "SRD", argLength: 2, reg: gp21, asm: "SRD"},
218 {name: "SRW", argLength: 2, reg: gp21, asm: "SRW"},
219 {name: "SLD", argLength: 2, reg: gp21, asm: "SLD"},
220 {name: "SLW", argLength: 2, reg: gp21, asm: "SLW"},
221
222 {name: "ROTL", argLength: 2, reg: gp21, asm: "ROTL"},
223 {name: "ROTLW", argLength: 2, reg: gp21, asm: "ROTLW"},
224
225
226 {name: "CLRLSLWI", argLength: 1, reg: gp11, asm: "CLRLSLWI", aux: "Int32"},
227 {name: "CLRLSLDI", argLength: 1, reg: gp11, asm: "CLRLSLDI", aux: "Int32"},
228
229
230 {name: "ADDC", argLength: 2, reg: gp21xer, asm: "ADDC", commutative: true, typ: "(UInt64, UInt64)"},
231 {name: "SUBC", argLength: 2, reg: gp21xer, asm: "SUBC", typ: "(UInt64, UInt64)"},
232 {name: "ADDCconst", argLength: 1, reg: gp11xer, asm: "ADDC", typ: "(UInt64, UInt64)", aux: "Int64"},
233 {name: "SUBCconst", argLength: 1, reg: gp11xer, asm: "SUBC", typ: "(UInt64, UInt64)", aux: "Int64"},
234 {name: "ADDE", argLength: 3, reg: gp2xer1xer, asm: "ADDE", typ: "(UInt64, UInt64)", commutative: true},
235 {name: "ADDZE", argLength: 2, reg: gp1xer1xer, asm: "ADDZE", typ: "(UInt64, UInt64)"},
236 {name: "SUBE", argLength: 3, reg: gp2xer1xer, asm: "SUBE", typ: "(UInt64, UInt64)"},
237 {name: "ADDZEzero", argLength: 1, reg: xergp, asm: "ADDZE", typ: "UInt64"},
238 {name: "SUBZEzero", argLength: 1, reg: xergp, asm: "SUBZE", typ: "UInt64"},
239
240 {name: "SRADconst", argLength: 1, reg: gp11cxer, asm: "SRAD", aux: "Int64"},
241 {name: "SRAWconst", argLength: 1, reg: gp11cxer, asm: "SRAW", aux: "Int64"},
242 {name: "SRDconst", argLength: 1, reg: gp11, asm: "SRD", aux: "Int64"},
243 {name: "SRWconst", argLength: 1, reg: gp11, asm: "SRW", aux: "Int64"},
244 {name: "SLDconst", argLength: 1, reg: gp11, asm: "SLD", aux: "Int64"},
245 {name: "SLWconst", argLength: 1, reg: gp11, asm: "SLW", aux: "Int64"},
246
247 {name: "ROTLconst", argLength: 1, reg: gp11, asm: "ROTL", aux: "Int64"},
248 {name: "ROTLWconst", argLength: 1, reg: gp11, asm: "ROTLW", aux: "Int64"},
249 {name: "EXTSWSLconst", argLength: 1, reg: gp11, asm: "EXTSWSLI", aux: "Int64"},
250
251 {name: "RLWINM", argLength: 1, reg: gp11, asm: "RLWNM", aux: "Int64"},
252 {name: "RLWNM", argLength: 2, reg: gp21, asm: "RLWNM", aux: "Int64"},
253 {name: "RLWMI", argLength: 2, reg: gp21a0, asm: "RLWMI", aux: "Int64", resultInArg0: true},
254 {name: "RLDICL", argLength: 1, reg: gp11, asm: "RLDICL", aux: "Int64"},
255 {name: "RLDICLCC", argLength: 1, reg: gp11, asm: "RLDICLCC", aux: "Int64", typ: "(Int, Flags)"},
256 {name: "RLDICR", argLength: 1, reg: gp11, asm: "RLDICR", aux: "Int64"},
257
258 {name: "CNTLZD", argLength: 1, reg: gp11, asm: "CNTLZD"},
259 {name: "CNTLZDCC", argLength: 1, reg: gp11, asm: "CNTLZDCC", typ: "(Int, Flags)"},
260 {name: "CNTLZW", argLength: 1, reg: gp11, asm: "CNTLZW"},
261
262 {name: "CNTTZD", argLength: 1, reg: gp11, asm: "CNTTZD"},
263 {name: "CNTTZW", argLength: 1, reg: gp11, asm: "CNTTZW"},
264
265 {name: "POPCNTD", argLength: 1, reg: gp11, asm: "POPCNTD"},
266 {name: "POPCNTW", argLength: 1, reg: gp11, asm: "POPCNTW"},
267 {name: "POPCNTB", argLength: 1, reg: gp11, asm: "POPCNTB"},
268
269 {name: "FDIV", argLength: 2, reg: fp21, asm: "FDIV"},
270 {name: "FDIVS", argLength: 2, reg: fp21, asm: "FDIVS"},
271
272 {name: "DIVD", argLength: 2, reg: gp21, asm: "DIVD", typ: "Int64"},
273 {name: "DIVW", argLength: 2, reg: gp21, asm: "DIVW", typ: "Int32"},
274 {name: "DIVDU", argLength: 2, reg: gp21, asm: "DIVDU", typ: "Int64"},
275 {name: "DIVWU", argLength: 2, reg: gp21, asm: "DIVWU", typ: "Int32"},
276
277 {name: "MODUD", argLength: 2, reg: gp21, asm: "MODUD", typ: "UInt64"},
278 {name: "MODSD", argLength: 2, reg: gp21, asm: "MODSD", typ: "Int64"},
279 {name: "MODUW", argLength: 2, reg: gp21, asm: "MODUW", typ: "UInt32"},
280 {name: "MODSW", argLength: 2, reg: gp21, asm: "MODSW", typ: "Int32"},
281
282
283
284 {name: "FCTIDZ", argLength: 1, reg: fp11, asm: "FCTIDZ", typ: "Float64"},
285 {name: "FCTIWZ", argLength: 1, reg: fp11, asm: "FCTIWZ", typ: "Float64"},
286 {name: "FCFID", argLength: 1, reg: fp11, asm: "FCFID", typ: "Float64"},
287 {name: "FCFIDS", argLength: 1, reg: fp11, asm: "FCFIDS", typ: "Float32"},
288 {name: "FRSP", argLength: 1, reg: fp11, asm: "FRSP", typ: "Float64"},
289
290
291
292
293
294
295
296 {name: "MFVSRD", argLength: 1, reg: fpgp, asm: "MFVSRD", typ: "Int64"},
297 {name: "MTVSRD", argLength: 1, reg: gpfp, asm: "MTVSRD", typ: "Float64"},
298
299 {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true},
300 {name: "ANDN", argLength: 2, reg: gp21, asm: "ANDN"},
301 {name: "ANDNCC", argLength: 2, reg: gp21, asm: "ANDNCC", typ: "(Int64,Flags)"},
302 {name: "ANDCC", argLength: 2, reg: gp21, asm: "ANDCC", commutative: true, typ: "(Int64,Flags)"},
303 {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true},
304 {name: "ORN", argLength: 2, reg: gp21, asm: "ORN"},
305 {name: "ORCC", argLength: 2, reg: gp21, asm: "ORCC", commutative: true, typ: "(Int,Flags)"},
306 {name: "NOR", argLength: 2, reg: gp21, asm: "NOR", commutative: true},
307 {name: "NORCC", argLength: 2, reg: gp21, asm: "NORCC", commutative: true, typ: "(Int,Flags)"},
308 {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", typ: "Int64", commutative: true},
309 {name: "XORCC", argLength: 2, reg: gp21, asm: "XORCC", commutative: true, typ: "(Int,Flags)"},
310 {name: "EQV", argLength: 2, reg: gp21, asm: "EQV", typ: "Int64", commutative: true},
311 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"},
312 {name: "NEGCC", argLength: 1, reg: gp11, asm: "NEGCC", typ: "(Int,Flags)"},
313 {name: "BRD", argLength: 1, reg: gp11, asm: "BRD"},
314 {name: "BRW", argLength: 1, reg: gp11, asm: "BRW"},
315 {name: "BRH", argLength: 1, reg: gp11, asm: "BRH"},
316 {name: "FNEG", argLength: 1, reg: fp11, asm: "FNEG"},
317 {name: "FSQRT", argLength: 1, reg: fp11, asm: "FSQRT"},
318 {name: "FSQRTS", argLength: 1, reg: fp11, asm: "FSQRTS"},
319 {name: "FFLOOR", argLength: 1, reg: fp11, asm: "FRIM"},
320 {name: "FCEIL", argLength: 1, reg: fp11, asm: "FRIP"},
321 {name: "FTRUNC", argLength: 1, reg: fp11, asm: "FRIZ"},
322 {name: "FROUND", argLength: 1, reg: fp11, asm: "FRIN"},
323 {name: "FABS", argLength: 1, reg: fp11, asm: "FABS"},
324 {name: "FNABS", argLength: 1, reg: fp11, asm: "FNABS"},
325 {name: "FCPSGN", argLength: 2, reg: fp21, asm: "FCPSGN"},
326
327 {name: "ORconst", argLength: 1, reg: gp11, asm: "OR", aux: "Int64"},
328 {name: "XORconst", argLength: 1, reg: gp11, asm: "XOR", aux: "Int64"},
329 {name: "ANDCCconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, asm: "ANDCC", aux: "Int64", typ: "(Int,Flags)"},
330 {name: "ANDconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, clobberFlags: true, asm: "ANDCC", aux: "Int64", typ: "Int"},
331
332 {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB", typ: "Int64"},
333 {name: "MOVBZreg", argLength: 1, reg: gp11, asm: "MOVBZ", typ: "Int64"},
334 {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH", typ: "Int64"},
335 {name: "MOVHZreg", argLength: 1, reg: gp11, asm: "MOVHZ", typ: "Int64"},
336 {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW", typ: "Int64"},
337 {name: "MOVWZreg", argLength: 1, reg: gp11, asm: "MOVWZ", typ: "Int64"},
338
339
340 {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},
341 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
342 {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
343 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
344 {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
345 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
346
347
348
349
350 {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", typ: "UInt64", faultOnNilArg0: true},
351 {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", typ: "UInt32", faultOnNilArg0: true},
352 {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", typ: "UInt16", faultOnNilArg0: true},
353
354
355
356 {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", typ: "UInt8"},
357 {name: "MOVHloadidx", argLength: 3, reg: gploadidx, asm: "MOVH", typ: "Int16"},
358 {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", typ: "UInt16"},
359 {name: "MOVWloadidx", argLength: 3, reg: gploadidx, asm: "MOVW", typ: "Int32"},
360 {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", typ: "UInt32"},
361 {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", typ: "Int64"},
362 {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", typ: "Int16"},
363 {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", typ: "Int32"},
364 {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", typ: "Int64"},
365 {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", typ: "Float64"},
366 {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", typ: "Float32"},
367
368
369
370 {name: "DCBT", argLength: 2, aux: "Int64", reg: prefreg, asm: "DCBT", hasSideEffects: true},
371
372
373
374 {name: "MOVDBRstore", argLength: 3, reg: gpstore, asm: "MOVDBR", typ: "Mem", faultOnNilArg0: true},
375 {name: "MOVWBRstore", argLength: 3, reg: gpstore, asm: "MOVWBR", typ: "Mem", faultOnNilArg0: true},
376 {name: "MOVHBRstore", argLength: 3, reg: gpstore, asm: "MOVHBR", typ: "Mem", faultOnNilArg0: true},
377
378
379 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
380 {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
381
382
383 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
384 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
385 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
386 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
387
388
389 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
390 {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
391
392
393
394 {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", typ: "Mem"},
395 {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", typ: "Mem"},
396 {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", typ: "Mem"},
397 {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", typ: "Mem"},
398 {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", typ: "Mem"},
399 {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", typ: "Mem"},
400 {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", typ: "Mem"},
401 {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", typ: "Mem"},
402 {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", typ: "Mem"},
403
404
405 {name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
406 {name: "MOVHstorezero", argLength: 2, reg: gpstorezero, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
407 {name: "MOVWstorezero", argLength: 2, reg: gpstorezero, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
408 {name: "MOVDstorezero", argLength: 2, reg: gpstorezero, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
409
410 {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{sp | sb | gp}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true, symEffect: "Addr"},
411
412 {name: "MOVDconst", argLength: 0, reg: gp01, aux: "Int64", asm: "MOVD", typ: "Int64", rematerializeable: true},
413 {name: "FMOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "FMOVD", rematerializeable: true},
414 {name: "FMOVSconst", argLength: 0, reg: fp01, aux: "Float32", asm: "FMOVS", rematerializeable: true},
415 {name: "FCMPU", argLength: 2, reg: fp2cr, asm: "FCMPU", typ: "Flags"},
416
417 {name: "CMP", argLength: 2, reg: gp2cr, asm: "CMP", typ: "Flags"},
418 {name: "CMPU", argLength: 2, reg: gp2cr, asm: "CMPU", typ: "Flags"},
419 {name: "CMPW", argLength: 2, reg: gp2cr, asm: "CMPW", typ: "Flags"},
420 {name: "CMPWU", argLength: 2, reg: gp2cr, asm: "CMPWU", typ: "Flags"},
421 {name: "CMPconst", argLength: 1, reg: gp1cr, asm: "CMP", aux: "Int64", typ: "Flags"},
422 {name: "CMPUconst", argLength: 1, reg: gp1cr, asm: "CMPU", aux: "Int64", typ: "Flags"},
423 {name: "CMPWconst", argLength: 1, reg: gp1cr, asm: "CMPW", aux: "Int32", typ: "Flags"},
424 {name: "CMPWUconst", argLength: 1, reg: gp1cr, asm: "CMPWU", aux: "Int32", typ: "Flags"},
425
426
427
428
429
430 {name: "ISEL", argLength: 3, reg: crgp21, asm: "ISEL", aux: "Int32", typ: "Int32"},
431 {name: "ISELZ", argLength: 2, reg: crgp11, asm: "ISEL", aux: "Int32"},
432
433
434 {name: "SETBC", argLength: 1, reg: crgp, asm: "SETBC", aux: "Int32", typ: "Int32"},
435
436 {name: "SETBCR", argLength: 1, reg: crgp, asm: "SETBCR", aux: "Int32", typ: "Int32"},
437
438
439 {name: "Equal", argLength: 1, reg: crgp},
440 {name: "NotEqual", argLength: 1, reg: crgp},
441 {name: "LessThan", argLength: 1, reg: crgp},
442 {name: "FLessThan", argLength: 1, reg: crgp},
443 {name: "LessEqual", argLength: 1, reg: crgp},
444 {name: "FLessEqual", argLength: 1, reg: crgp},
445 {name: "GreaterThan", argLength: 1, reg: crgp},
446 {name: "FGreaterThan", argLength: 1, reg: crgp},
447 {name: "GreaterEqual", argLength: 1, reg: crgp},
448 {name: "FGreaterEqual", argLength: 1, reg: crgp},
449
450
451
452
453 {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}, zeroWidth: true},
454
455
456 {name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
457
458
459
460
461
462 {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
463
464
465 {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
466
467 {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
468 {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
469
470 {name: "CALLstatic", argLength: -1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
471 {name: "CALLtail", argLength: -1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true, tailCall: true},
472 {name: "CALLclosure", argLength: -1, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
473 {name: "CALLinter", argLength: -1, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502 {
503 name: "LoweredZero",
504 aux: "Int64",
505 argLength: 2,
506 reg: regInfo{
507 inputs: []regMask{buildReg("R20")},
508 clobbers: buildReg("R20"),
509 },
510 clobberFlags: true,
511 typ: "Mem",
512 faultOnNilArg0: true,
513 unsafePoint: true,
514 },
515 {
516 name: "LoweredZeroShort",
517 aux: "Int64",
518 argLength: 2,
519 reg: regInfo{
520 inputs: []regMask{gp}},
521 typ: "Mem",
522 faultOnNilArg0: true,
523 unsafePoint: true,
524 },
525 {
526 name: "LoweredQuadZeroShort",
527 aux: "Int64",
528 argLength: 2,
529 reg: regInfo{
530 inputs: []regMask{gp},
531 },
532 typ: "Mem",
533 faultOnNilArg0: true,
534 unsafePoint: true,
535 },
536 {
537 name: "LoweredQuadZero",
538 aux: "Int64",
539 argLength: 2,
540 reg: regInfo{
541 inputs: []regMask{buildReg("R20")},
542 clobbers: buildReg("R20"),
543 },
544 clobberFlags: true,
545 typ: "Mem",
546 faultOnNilArg0: true,
547 unsafePoint: true,
548 },
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583 {
584 name: "LoweredMove",
585 aux: "Int64",
586 argLength: 3,
587 reg: regInfo{
588 inputs: []regMask{buildReg("R20"), buildReg("R21")},
589 clobbers: buildReg("R20 R21"),
590 },
591 clobberFlags: true,
592 typ: "Mem",
593 faultOnNilArg0: true,
594 faultOnNilArg1: true,
595 unsafePoint: true,
596 },
597 {
598 name: "LoweredMoveShort",
599 aux: "Int64",
600 argLength: 3,
601 reg: regInfo{
602 inputs: []regMask{gp, gp},
603 },
604 typ: "Mem",
605 faultOnNilArg0: true,
606 faultOnNilArg1: true,
607 unsafePoint: true,
608 },
609
610
611
612
613 {
614 name: "LoweredQuadMove",
615 aux: "Int64",
616 argLength: 3,
617 reg: regInfo{
618 inputs: []regMask{buildReg("R20"), buildReg("R21")},
619 clobbers: buildReg("R20 R21"),
620 },
621 clobberFlags: true,
622 typ: "Mem",
623 faultOnNilArg0: true,
624 faultOnNilArg1: true,
625 unsafePoint: true,
626 },
627
628 {
629 name: "LoweredQuadMoveShort",
630 aux: "Int64",
631 argLength: 3,
632 reg: regInfo{
633 inputs: []regMask{gp, gp},
634 },
635 typ: "Mem",
636 faultOnNilArg0: true,
637 faultOnNilArg1: true,
638 unsafePoint: true,
639 },
640
641 {name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
642 {name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
643 {name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
644
645 {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, typ: "UInt8", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
646 {name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, typ: "UInt32", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
647 {name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
648 {name: "LoweredAtomicLoadPtr", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
649
650
651
652
653
654
655
656
657 {name: "LoweredAtomicAdd32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
658 {name: "LoweredAtomicAdd64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
659
660
661
662
663
664
665
666
667 {name: "LoweredAtomicExchange32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
668 {name: "LoweredAtomicExchange64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686 {name: "LoweredAtomicCas64", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
687 {name: "LoweredAtomicCas32", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
688
689
690
691
692
693
694
695 {name: "LoweredAtomicAnd8", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
696 {name: "LoweredAtomicAnd32", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
697 {name: "LoweredAtomicOr8", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
698 {name: "LoweredAtomicOr32", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
699
700
701
702
703
704 {name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17 R20 R21 g")) | buildReg("R31"), outputs: []regMask{buildReg("R29")}}, clobberFlags: true, aux: "Int64"},
705
706 {name: "LoweredPubBarrier", argLength: 1, asm: "LWSYNC", hasSideEffects: true},
707
708
709
710 {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r5, r6}}, typ: "Mem", call: true},
711 {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r4, r5}}, typ: "Mem", call: true},
712 {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r3, r4}}, typ: "Mem", call: true},
713
714
715
716
717
718
719 {name: "InvertFlags", argLength: 1},
720
721
722
723
724
725
726
727
728
729
730 {name: "FlagEQ"},
731 {name: "FlagLT"},
732 {name: "FlagGT"},
733 }
734
735 blocks := []blockData{
736 {name: "EQ", controls: 1},
737 {name: "NE", controls: 1},
738 {name: "LT", controls: 1},
739 {name: "LE", controls: 1},
740 {name: "GT", controls: 1},
741 {name: "GE", controls: 1},
742 {name: "FLT", controls: 1},
743 {name: "FLE", controls: 1},
744 {name: "FGT", controls: 1},
745 {name: "FGE", controls: 1},
746 }
747
748 archs = append(archs, arch{
749 name: "PPC64",
750 pkg: "cmd/internal/obj/ppc64",
751 genfile: "../../ppc64/ssa.go",
752 ops: ops,
753 blocks: blocks,
754 regnames: regNamesPPC64,
755 ParamIntRegNames: "R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17",
756 ParamFloatRegNames: "F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12",
757 gpregmask: gp,
758 fpregmask: fp,
759 specialregmask: xer,
760 framepointerreg: -1,
761 linkreg: -1,
762 })
763 }
764
View as plain text